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 中创建了四个 iframe,当它完全加载时,我需要根据每个帧的 id 触发一些动作。它运行良好,但问题出在 IE 中。IE 不知道 operator this,所以我无法访问内部框架的 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 回答