Frage

Ich habe ein HTML -Dokument (hier), das einen Iframe-basierten Media Player für eine Sammlung von Songs in Alben erstellt (ich habe gerade Briefe verwendet, um diese Alben und Songs in der MyMusic Array für Einfachheit zu definieren).

Wenn ich mich auf die Top 3 Iframes konzentriere, habe ich die Benutzerinteraktion dargelegt, die HTML für Formulare verfügbarer Alben und Songs mit JavaScript zu generieren und sie an die IFrames im Körper zu schreiben. Wenn Sie es ausführen und eine Auswahl in der treffen Alben Menü sehen Sie, dass die Optionen in der Lieder Das Menü entspricht der mymusic Array, das funktioniert also.

Wenn ich jedoch ein Lied wähle, die Funktion nowplaying(trackindex,albumindex) sollte mit einem aufgerufen werden onchange Ereignis in der Lieder Form, genauso wie in der mit verwendeten Form, die generiert wurde showinitial() ... aber die Funktion wird nicht aufgerufen.

Ich habe die Kodierung von ausgeschlossen nowplaying selbst als Ursache, denn selbst wenn ich mich verändere nowplaying zu alert("hello"), es wird nicht angerufen. Dies führt mich dazu, das Problem mit dem zu glauben, dass es mit dem liegt onchange Attribut in "Anything", aber ich kann das Problem nicht sehen. Die Art und Weise, wie ich es codiert habe, ist nicht anders und das hat gut funktioniert. Warum funktioniert diese nicht?

Jede Hilfe wäre sehr geschätzt!

War es hilfreich?

Lösung

Firebug ist dein Freund ....

Ich bin nicht definiert

Funktion onchange (Ereignis) {parent.nowplaying (this.selectedIndex, i); }(Rückgeld )

Onchange wird angerufen, aber ich bin nicht definiert, wenn ich jetzt aufgerufen werde.

Dies ist das Ergebnis dieser Zeile:

p+="<html><head></head><body><form><select onchange='parent.nowplaying(this.SelectedIndex,i);' size='"; 

Was "I" in der Zeichenfolge verwendet, wenn es es als Variable angehängt sollte:

p+="<html><head></head><body><form><select onchange='parent.nowplaying(this.SelectedIndex," + i + ");' size='"; 

Um zu verdeutlichen, ich bin definiert, wenn irgendetwas (ich) angerufen wird, aber Sie schreiben nicht in den Code, nur den Brief i. Wenn ich jetzt (this.selectedIndex, i) aufgerufen wird, wird ich nicht mehr definiert, weil Sie nicht mehr in der Funktion "Anything ()) sind. Sie müssen mich erweitern, wenn Sie die HTML an P anhängen, damit der Wert da ist und nicht die Variable i.

Andere Tipps

function anything(i){
    p+="...<select onchange='parent.nowplaying(this.SelectedIndex,i);'...";

Ihr Onchange -Event -Handler wird aus einer Zeichenfolge gesetzt. Beim Ausführen wird es keinen Zugriff haben i, was eine lokale Variable von der ist anything Funktion, die seit langem weg ist.

Die einfache Lösung wäre:

    p+="...<select onchange='parent.nowplaying(this.SelectedIndex,'+i+');'...";

was den aktuellen Wert von dreht i Bei der Streicherzeit in eine Ganzzahl wörtlich in der Saite.

Es ist jedoch im Allgemeinen keine gute Idee, Code aus Strings zu erstellen. Normalerweise ist es besser, den Ereignishandler als normales Funktionsobjekt zu schreiben:

// You will need the below workaround to get the iframe document in IE too
//
var iframe= document.getElementById('songs');
var idoc= 'contentDocument' in iframe? iframe.contentDocument : iframe.contentWindow.document;

idoc.open();
idoc.write(s);
idoc.close();

idoc.getElementsByTagName('select')[0].onchange= function() {
    // This is a closure. The 'i' variable from the parent 'anything' function is
    // still visible in here
    //
    parent.nowplaying(this.selectedIndex, i);
};

Sie möchten jedoch im Allgemeinen vermeiden, Handler aus einem Rahmen auf einen anderen zu setzen. Ich bin mir nicht sicher, was die IFrames hier gewinnen als Kopfschmerzen. Warum nicht einfach positionierte Divs mit Überlauf verwenden? Sie können ihre Inhalte immer noch umschreiben innerHTML Wenn Sie ... obwohl ich es vorziehen würde, sie mit DOM-Methoden zu bevölkern, um alle HTML-Injektionsprobleme, die Ihr aktuelles Skript hat, zu vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top