-1

アルバム内の曲のコレクション用の iframe ベースのメディア プレーヤーを作成する HTML ドキュメント ( here ) があります (簡単にするために、これらのアルバムと曲を mymusic 配列で定義するために文字を使用しました)。

上位 3 つの iframe に注目すると、利用可能なアルバムと曲のフォームの HTML を Javascript を使用して生成し、本文の iframe に書き込むというユーザー インタラクションを設定しました。それを実行してアルバムメニューで選択すると、ソングメニューのオプションが配列に対応していることがわかるmymusicので、これは機能します。

ただし、曲を選択すると、 ...を使用して生成されたフォームと同じように、 Songsフォームのイベントnowplaying(trackindex,albumindex)を使用して関数を呼び出す必要がありますが、関数は呼び出されません。onchangeshowinitial()

に変更しても呼び出されないnowplayingため、原因としてそれ自体のコーディングを除外しました。これにより、問題は「何でも」の属性にあると思いますが、問題はわかりません。私がコーディングした方法は以前と変わらず、うまく機能したのに、なぜこれが機能しないのでしょうか?nowplayingalert("hello")onchange

どんな助けでも大歓迎です!

4

2 に答える 2

3

Firebugはあなたの友達です...

私は定義されていません

function onchange(event){parent.nowplaying(this.SelectedIndex、i); }(変化する )

onchangeが呼び出されていiますが、を呼び出すときに定義されていませんnowplaying

これは、この行の結果です。

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

文字列で「i」を使用している場合、変数として追加する必要があります。

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

明確にするために、は呼び出さiれたときに定義されますが、コードに書き込んでいるのではなく、文字「i」だけです。が呼び出されたときは、関数の内部にいないため、定義されなくなりました。htmlをに追加するときに展開して、変数ではなく値がそこにあるようにする必要があります。anything(i)inowplaying(this.SelectedIndex,i)ianything()ipi

于 2009-11-25T21:10:03.017 に答える
0
function anything(i){
    p+="...<select onchange='parent.nowplaying(this.SelectedIndex,i);'...";

onchange イベント ハンドラは文字列から設定されます。実行すると、長い間離れていた関数iのローカル変数である にアクセスできなくなります。anything

簡単な修正は次のとおりです。

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

iこれは、文字列作成時の の現在の値を文字列内の整数リテラルに変換します。

ただし、通常、文字列からコードを作成することはお勧めできません。通常は、イベント ハンドラーを通常の関数オブジェクトとして記述する方が適切です。

// 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);
};

ただし、通常、あるフレームから別のフレームにハンドラーを設定することは避けたいでしょう。頭痛以外に、ここで iframe が何をもたらしているのか、私にはよくわかりません。単純に配置された div をオーバーフローで使用しないのはなぜですか? 必要に応じてコンテンツを書き換えることもできinnerHTMLます...ただし、現在のスクリプトに含まれるすべての HTML インジェクションの問題を回避するために、DOM メソッドを使用してコンテンツを設定することをお勧めします。

于 2009-11-25T21:22:31.567 に答える