javascript - 跨浏览器 javascript 加载回调 : Is there a better way than using iframes?

标签 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);
}

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

我想知道是否有更好的方法来做到这一点。我正在寻找脚本标签的跨浏览器“onload”事件,或其他避免 iframe 黑客攻击的方法。

最佳答案

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

关于javascript - 跨浏览器 javascript 加载回调 : Is there a better way than using iframes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631548/

相关文章:

javascript - Firebase 规则 : Problem with role based authentication in groups and . 其中()

javascript - 限制在 loadmore 上不起作用

javascript - 使用纯 javascript 聚焦一个可编辑的 p 标签

javascript - 当 iframe 获得焦点时,不会调用父窗口事件。如何预防呢?

jquery - 跨域iFrame中触发点击

javascript - 将图像和视频动态适配到 iframe 中

javascript - 返回到 Ionic 2 中的其他页面时,菜单切换被禁用

javascript - 如何在 JavaScript 异步获取调用中使用返回的 JSON 错误

javascript - 在 Javascript 中计算嵌套元素中的文本选择偏移量

javascript - 为什么 getElementById() 在 Elements 上不可用?