Firefox not firing onload for dynamic nested iframe
我有以下代码可以在 Chrome 和 MS Edge 上运行,但不能在 Firefox 上运行。
Parent.html 有这个脚本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <html> <body> var ifr1 = document.createElement('iframe'); ifr1.onload = function() { alert("iframe 1 loaded") //fires on all browsers script = ifr1.contentWindow.document.createElement('script'); script.src = 'PATH/TO/script.js'; script.onload = function() { alert("script 1 onload") //fires on all browsers }; ifr1.contentWindow.document.body.appendChild(script); }; document.body.appendChild(ifr1); </body> </html> |
它创建一个 iframe 并在该 iframe 中加载 script.js。
这里是 script.js,它和上面做同样的事情 -
1 2 3 4 5 6 7 8 9 10 11 12 | var ifr2 = document.createElement('iframe'); ifr2.onload = function() { alert("iframe 2 loaded") //doesn't fire on Firefox script = ifr2.contentWindow.document.createElement('script'); script.src = 'https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js'; script.onload = function() { alert("script 2 onload") }; ifr2.contentWindow.document.body.appendChild(script); }; document.body.appendChild(ifr2); |
它在 Parent.html 创建的 iframe
现在,Chrome 和 Edge 会正确显示所有警报,但 Firefox 不会为
一种解决方法是创建一个简单的 html 页面 - 甚至只是
如果您现在将 Parent.html 更改为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <html> <body> var ifr1 = document.createElement('iframe'); ifr1.onload = function() { alert("iframe 1 loaded") //fires on all browsers script = ifr1.contentWindow.document.createElement('script'); script.src = 'PATH/TO/script.js'; script.onload = function() { alert("script 1 onload") //fires on all browsers }; ifr1.contentWindow.document.body.appendChild(script); }; ifr1.src = 'empty.html'; // add this code ******* document.body.appendChild(ifr1); </body> </html> |
然后它按预期工作
不知道为什么 firefox 会这样做——这可能是因为没有
edit: 嗯,它做了一次然后又停止了!!
好的,真的很奇怪 - 如果你添加
不确定我是否已经很好地回答了你,但至少我给了你一个有效的工具:p
虽然这是一种不好的做法,并且在 chrome 中已被弃用(它会在控制台中显示警告。
在附加脚本标记之前添加这一行为我解决了这个问题:
看来 firefox 需要它来初始化 iframe 并运行 javascript...
IMO 这是 Firefox 中的一个错误,因为 Firefox 不会按照您期望的方式在 iframe 中执行
在任何情况下,真正的问题是何时知道访问
但是请注意,contentWindow 和文档会在
或者您可以将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | var ifr2 = document.createElement('iframe'); function loadit() { console.log("iframe 2 loaded") script = ifr2.contentWindow.document.createElement('script'); script.src = '...'; script.onload = function() { console.log("script 2 onload") }; ifr2.contentWindow.document.body.appendChild(script); }; // add the iframe to the document document.body.appendChild(ifr2); // now execute your script stuff: loadit() |
这应该适用于所有(现代)浏览器。