我有一个类似于小部件的HTML + JavaScript块,人们可以将其复制/粘贴到他们的HTML页面中一次或多次.该块检查外部JavaScript文件是否已经存在于DOM中,如果没有,则加载它,如下所示:
(function(){
d = document;
if (!d.getElementById('ex-scr')) {
scr = d.createElement('script');
scr.async = true;
scr.id = 'ex-scr';
scr.src = 'external.js';
d.getElementsByTagName('head')[0].appendChild(scr)
}
})();
Run Code Online (Sandbox Code Playgroud)
外部JavaScript文件检查HTML页面中的窗口小部件实例(使用getElementsByClassName)并对这些实例进行处理,类似于此;
for (var i=0;i<document.getElementsByClassName('target').length;i++) {
document.getElementsByClassName('target')[i].style.borderStyle="solid";
}
Run Code Online (Sandbox Code Playgroud)
可以在http://futtta.be/opera_enigma.html上找到这方面的工作示例.
这在Firefox(3.6和4b),Chrome(5和6)和Safari中完美运行,但在Opera中没有预期的效果(使用最新版本10.61进行测试):无论有多少'小部件'(divs class='target')都是目前,Opera仅作用于第一个,因为显然nodeList只包含1个条目(长度为1而不是2或3或......).
如果在小部件的javascript中调用函数来加载带有window.onload的外部脚本,问题就会消失,但我希望我的小部件尽快激活(不干扰页面的其余部分,因此异步的东西).
所以我的问题; 我的代码中是否存在Firefox,Safari和Chrome忽略的错误?这是Opera中的一个错误吗?我怎样才能让Opera表现出来?
如果在widget的javascript中我调用函数来加载带有window.onload的外部脚本,问题就消失了
我认为这就是你的问题.当getElementsByClassName在你的脚本文件执行时,DOM,尚不能保证是完全存在.如果不等到DOMready或loaded事件,您将无法在此处创建可靠的行为.
| 归档时间: |
|
| 查看次数: |
435 次 |
| 最近记录: |