Javascript替代品(IE)

时间:2011-07-02 17:54:47

标签: javascript iframe this attachevent

我有类似下面的代码:

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不知道运营商这个,所以我无法访问内部框架的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); };
}

所以它应该适用于所有浏览器。

2 个答案:

答案 0 :(得分: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,除非你采取明确的措施来修复范围。)

答案 1 :(得分: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); });