回调在IE 10浏览器中无法工作

3

我正在调用一个servlet。 当执行document.getElementById('testURL').value + '?opn=getKey&rand='+ Math.random();时,会发生Get调用到servlet,这将返回密钥并调用callback()函数。在IE 9中,这是正常的。但是在IE 10中,它需要在此调用之后暂停一段时间。因此,我不得不添加以下警报。有人可以帮我了解为什么IE10存在此问题?如何解决?警报不是正确的解决方式。提前感谢!

function getKey(){ 
        var headID = document.getElementsByTagName("head")[0]; 
        var scriptEmt =document.createElement('script'); 
        scriptEmt.type='text/javascript'; 
        scriptEmt.src=document.getElementById('testURL').value + 'opn=getKey&rand='+ Math.random(); 
        if(navigator.appVersion.indexOf("MSIE 10.0") != -1){
            alert("alert1..");
            alert("alert2....");
        }
        headID.appendChild(scriptEmt);          
    }   

function callback(){ 
...
...
}

更好的暂停方式是使用setTimeout函数,因为警告框需要用户交互。 - xmashallax
但我没有调用回调函数(callback())。Servlet调用确实返回了密钥并在没有超时的情况下调用了回调函数(callback())。 - Anita
如果您需要暂时冻结浏览器,我建议使用同步JavaScript而不是警报。这样可以控制延迟时间(最多网络延迟抖动)。 - John Dvorak
但是,如果您想要同步加载,请不要使用超时来模拟它。 - John Dvorak
你的问题是脚本加载后回调没有执行,对吗?我尝试了你的设置,但是没有发现任何问题。能否请你发布servlet响应内容?如果可能的话,你可以使用jQuery并发出一个ajax调用到你的servlet。 - slu
你能否检查一下在回调函数中是否调用了尚未加载的内容?比如一个被设计成在脚本标签异步加载的库。 - Alfonso de la Osa
1个回答

0

从代码来看,问题似乎是

headID.appendChild(scriptEmt);

在脚本“src”属性实际完成填充之前执行,这意味着当脚本元素实际附加到文档时没有“src”属性,这意味着实际上没有代码可以在scriptEmt元素中执行。这也解释了为什么回调从未被调用。

更好的解决方案是使用ajax请求获取密钥。使用ajax从servlet加载密钥值,只有在您拥有密钥值后才应创建脚本标记并将其附加到文档中。这样,您将确保脚本src属性具有值,一旦附加到文档中,脚本将被执行并调用回调。

至于为什么会影响IE10,我只能猜测,但我会猜测IE10所做的更改。微软对IE10进行了许多更改,其中许多围绕javascript性能,因此可能会导致您看到的行为稍微快了一小部分。就像我说的那样,这只是一个猜测,我没有“真正”的数据或事实来支持它!


我刚试图加载静态js文件,而不是像下面这样调用servlet:function getKey(){ var headID = document.getElementsByTagName("head")[0]; var scriptEmt =document.createElement('script'); scriptEmt.type='text/javascript'; scriptEmt.src="preview16.ar.com/Svc/js/test.js";; headID.appendChild(scriptEmt); calltest(); } - Anita
在这里,当我检查网络捕获时 - test.js已成功加载。我可以在URL preview16.ar.com/Svc/js/test.js的响应正文中看到js文件及其内容。我的test.js文件内容如下:function calltest(){ alert("I am in test"); }但是,在headID.appendChild(scriptEmt)语句后,在getKey()中调用calltest()时,它会显示错误-SCRIPT5009:“calltest”未定义。 - Anita
请问您能否为此创建一个 jsfiddle 吗?我很难想象这段代码! - Mo D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接