0

私は次のコードのようなものを持っています:

for(var i=0;i<4;i++) {
  frm = document.createElement("iframe");
  frm.width = "100";
  frm.height = "100";
  frm.src = "source.php";
  frm.id = "something";

  frm.attachEvent("load", function() { alert(this.id); //Here I need alternative for this.id });

  var frameDiv = document.getElementById("frameDiv");
  frameDiv.appendChild(frm);
}

単純化されていますが、基本的にはdiv内に4つのiframeが作成され、完全に読み込まれたときに、各フレームのIDに基づいていくつかのアクションを実行する必要があります。それはうまく機能しますが、問題はIEにあります。IEはこれを演算子として認識していないため、内部のフレームのIDにアクセスできません。IEに使用できる代替手段はありますか?

助けてくれてありがとう!


Abhijit:実際、コード全体は次のようになっています。

if(frm.addEventListener) {
  frm.addEventListener("load", function() { alert(this.id); },false);
}
  else if(frm.attachEvent) {
  frm.attachEvent("onload", function() { alert(this.id); });
}
  else {
  frm.onload=function() { alert(this.id); };
}

したがって、すべてのブラウザで機能するはずです。

4

2 に答える 2

2

これが IE で機能しない理由はわかりませんが、

frm.attachEvent("load", function() { alert(this.id); });

// wrap in an anonymous function to fix scope issues
(function(frm) {
    frm.attachEvent("load", function() { alert(frm.id); });
})(frm);

iframe への一貫した参照を提供する必要があります。

編集:ループ内のスコープの問題を修正するために上記のコードを更新しました。これがまさに、このようなループでクロージャーを作成することを一般的に避けるべき理由です-frmスコープを修正するための明示的な措置を講じない限り、すべての参照は最後に定義された iframe を指します。)

于 2011-07-02T18:02:03.177 に答える
1

frm.attachEvent("load", function() { alert(this.id); });、これはである必要がありますfrm.attachEvent("onload", function() { alert(this.id); });。IEでは、要素をevent.srcElementとして取得できます。だからあなたのコードはfrm.attachEvent("onload", function(event) { alert(event.srcElement.id); });

于 2011-07-02T18:28:33.977 に答える