2014-12-11 136 views
2

我目前正在研究一个数据密集型Web应用程序,该应用程序经常与外部API进行通信,并在返回时检索JSONP数据。该脚本依赖于名为head.js v1.0.3的库。 http://headjs.com/来完成这个。但是,我注意到,在IE 11中,出于某种原因,脚本的onload事件有时(但并非总是)在脚本实际加载到浏览器之前触发。该行为可以证明是否使用head.js。或者,我可以创建一个脚本元素,并设置onload事件来捕获返回的数据。有时它起作用,有时不起作用。更奇怪的是,一旦它第一次发生,它似乎在浏览器会话期间继续发生。IE11脚本onload不工作(有时)

解决方法的任何想法?

下面是一些示例代码:

//somejson.js 
/* 
    window["queryResult"] = {blah:'blah'} 
*/ 

function loadScript() { 
    head.load("/somejson.js", afterScriptLoad) 
} 

function afterScriptLoad() { 
    var result = queryResult 
    //Throws error because window.queryResult is sometimes undefined 
} 
+0

当你在调用'loadScript'之前声明'afterScriptLoad',或者只是将它作为一个匿名函数传递的时候它会工作吗? – GolezTrol 2014-12-11 00:21:08

+0

同样的事情发生在匿名函数中。我想我想出了一个解决方法。这并不理想,但如果它有效,我会在稍后发布详情。 – 2014-12-11 17:29:05

+0

我也遇到过这个问题。似乎跨域js请求不会在ie 11中发送onload事件。 – cocoa 2017-12-12 03:21:43

回答

0

的一点点研究后,似乎解决这个错误的唯一方法是修改API,以便一旦变量持有JSONP被初始化,脚本本身触发回调。不幸的是,如果他们无法修改正在使用的任何API,则这不会成为其他人的解决方案,但它确实为我解决了问题。

//somejson.js 
/* 
    window["queryResult"] = {blah:'blah'}; scriptCallback() 
*/ 
function loadScript(callback) { 
    var c = new afterScriptLoad(callback) 
    window["scriptCallback"] = c 
    head.load("/somejson.js", c) 
} 
function afterScriptLoad(callback) { 
    var retrieved = false 
    return function() { 
     if (!retrieved) { 
      retrieved = true 
      callback(queryResult) 
     } 
    } 
} 
function myCallback(response) { 
    //do something 
}