带回调的跨浏览器javascript加载:有没有比使用iframe更好的方法?

时间:2011-12-25 20:59:40

标签: javascript dom iframe asynchronous onload

我想以编程方式加载.js文件并在加载完成后执行一些操作。我想要包含的文件托管在将包含它的域中。

具体来说,我加载的文件是swfobject.js。我想检查它的存在并仅在需要时加载它。

这是我到目前为止所拥有的:

// BHD is defined elsewhere. For this example:
var BHD = {};

BHD.uid = function () {
  return 'x'+(+(''+Math.random()).substring(2)).toString(32)+(+new Date()).toString(32);
};

BHD.include = function (file, callback) {
  var uid = BHD.uid();
  frame = document.createElement('iframe');
  frame.src = file;
  frame.id = frame.name = uid;
  frame.onload = function () {
    var s = document.getElementsByTagName('script')[0]; 
    var d = frames[uid].document.documentElement;
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.text = d.textContent||d.innerText;
    s.parentNode.insertBefore(script, s);
    callback();
    s.parentNode.removeChild(s);
    frame.parentNode.removeChild(frame);
  }
  document.documentElement.appendChild(frame);
}

这似乎有效。不过,这是一个丑陋的黑客行为。 .js文件的内容加载到iframe中,当iframe完成加载时,新的脚本元素将使用iframe的内容注入主文档。这似乎使脚本立即加载,因此可以在之后立即调用回调。

我想知道是否有更好的方法来做到这一点。我正在为脚本标签的跨浏览器'onload'事件寻找一些东西,或者其他一些方法来避免iframe hack。

1 个答案:

答案 0 :(得分:0)

IE的现代版本支持脚本元素上的load事件(并且不再支持readystate),因此通常的load事件技术将起作用,不需要多个代码路径,我们不再需要忍受bug-ridden readystate