【问题标题】:object.onload fails with IE and Edgeobject.onload 因 IE 和 Edge 而失败
【发布时间】:2017-05-05 18:35:33
【问题描述】:

我正在尝试动态预加载文件列表,这些文件可能是图像和 JavaScript 文件之间的任何内容。 Chrome 和 Firefox 的一切都非常顺利,但是当我尝试使用 Edge 预加载 JavaScript 文件时失败了。例如,Edge 仍然可以处理图像,但不能处理 js 文件。是的,我已经尝试使用 addEventListener,它也不起作用。

Edge 没有给我任何错误。

    var object = {};
    object = document.createElement('object');
    object.width = object.height = 0;
    object.data = path/to/javascriptfile.js
    body.appendChild(object);

    object.onload = function(){
         console.log('hello world')
         //not firing with edge
    }

我遗漏了什么相关的东西?

更新:一天后没有取得任何成功。可能会暂时离开它,只是跳过使用边缘预加载脚本文件,直到我找到解决方案。

【问题讨论】:

标签: javascript html object preload


【解决方案1】:

工作的临时解决方案是将 onload 事件直接放入脚本元素而不是对象。很遗憾,因为它在 Chrome 和 FF 中就像一个魅力。

事实证明,带有 css 源的 object.data 也没有加载。我不知道这是否是一个错误,因为它仍然可以将图像从 object.data 加载。

但表演必须继续。

干杯,艾尔尤科

【讨论】:

    【解决方案2】:

    也许值得一试 - 来自 msdn:

    客户端加载应用程序、嵌入对象和图像 它在解析过程中遇到applet、embed 和img 对象。 因此,这些对象的 onload 事件发生在 客户端解析任何后续对象。确保事件处理程序 接收这些对象的onload事件,放置脚本对象 在对象之前定义事件处理程序并使用 onload 对象中的属性来设置处理程序。

    https://msdn.microsoft.com/en-us/library/windows/apps/hh465984.aspx

    编辑,澄清:

    您应该在将元素添加到页面之前附加事件侦听器。

    即使这样做,我也不确定它是否会起作用。但要确保您已用尽所有选项,请尝试以下示例:

    function doLoad() {
       console.log('The load event is executing');
    }
    
    var object = {};
    object = document.createElement('object');
    object.width = object.height = 0;
    object.data = 'path/to/javascriptfile.js';
    
    object.onreadystatechange = function () {
       if (object.readyState === 'loaded' || object.readyState === 'complete') doLoad();
       console.log('onreadystatechange');
    }
    
    if (object.addEventListener) { 
       object.addEventListener( "load", doLoad, false );
       console.log('addEventListener');
    }
    else 
    {
       if (object.attachEvent) { 
          object.attachEvent( "onload", doLoad );
          console.log('attachEvent');
       } else if (object.onLoad) {
          object.onload = doLoad;
          console.log('onload');
       }
    }
    
    var body = document.getElementsByTagName("body")[0];    
    body.appendChild(object);
    

    如果这不起作用,您也许可以在 IE 中使用“图像”而不是“对象”进行预加载:https://stackoverflow.com/a/11103087/1996783

    【讨论】:

    • 不幸的是,此刻我完全死在里面,或者我只是傻瓜,但无法使用给定的信息。我会继续寻找,但可能需要为边缘做出完整的解决方法。至少现在是这样。
    • @eljuko 我添加了一个示例。不确定它是否会起作用,但我的手指交叉
    • 感谢您为此付出的努力。我会试试这个并在我完成后通知。
    • 好的。所以,也没有让它与这些一起工作。脚本不会触发 onreadystatechange。使用图像而不是对象......好吧,同样的事情。但是如果我直接把它放到脚本标签上,我就会被解雇。我认为这就是目前要走的路,即使我必须编写一些丑陋的代码:) 无论如何,再次感谢您的努力。一旦我完全正常工作,将更新答案。
    猜你喜欢
    • 2019-10-31
    • 2015-12-27
    • 2019-05-05
    • 2022-01-05
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多