IE与window.location.href的兼容性问题

4
我正在使用 AJAX Post 请求的回调函数进行页面跳转,但在 Internet Explorer 上无法正常工作。我的代码如下:
$.ajax({ 
    type: "POST",
    url: phpUrl,  
    data: data,  
    async: false, 
    success: function() {       
         if (navigator.appName == 'Microsoft Internet Explorer'){   window.location.href("/step2.php")}
         else{ window.location.href = "/step2.php"}             
    },  
    dataType:'json'         

}); 

这在FF/Safari/Chrome上运行良好,但在IE上测试时不起作用。有没有更好的重定向到新页面的方法?我使用async:false,因为如果我不使用回调,我的数据在Chrome/Safari上不会加载,因为页面会在POST请求完成之前发生改变。
3个回答

5

问题出在括号上。由于href不是一个函数,所以尝试去调用它——window.location.href("/step2.php")——会导致TypeError错误。

像下一行那样给href赋值,或者更好的方法是使用location.assign()

location.assign('/step2.php');

虽然您可以直接给location的属性(location.href = '...';)赋值以导致浏览器导航,但我建议不要这样做。

内部而言,这样做只是在调用location.assign(),而且在所有浏览器中赋值属性表现并不一致


关于async:false绝对不要这样做。如果您进行同步XHR请求,您就错了8.4%的IE9挂起问题是由于同步XHR阻塞浏览器所致。

考虑到您已经将其放在回调函数中,因此对location的赋值不会发生,直到POST完成,因此我不确定您所说的“页面将在POST完成之前更改”的意思是什么。(您是否忘记取消表单的submit?)


奇怪的是,location.assign("/step2.php"); 在IE上也不起作用,但在FF / Safari / Chrome上可以工作。 我最初尝试将其用作函数的方法是基于我阅读的文档(@Hexxagonal 也提到了这一点)。 - djq
我理解你关于 async 的观点 - 我已经将其删除了。感谢你的建议。 - djq
2
“Never”是一个强烈的词。在同步Ajax方面,有时候它是必要和有用的。然而,您的观点很好。在需要阻塞的情况下,开发人员应该注意明显地显示仍在进行某些操作,例如使用Ajax加载器gif。 - peter
2
@peter:这是我对“永远”一词感到舒适的情况。关键是,如果您使用同步XHR,则无法显示加载程序gif,因为XHR请求会阻止页面呈现。我真诚地认为没有任何情况可以不使用异步XHR;而且同步XHR的缺点太多,不能证明它比异步XHR更合适。 - josh3736
我将它与window.location.href混合使用...认为它是ie的备选方案,它解决了我的问题。现在它可以正确地重定向,而不是在其他脚本中翻来覆去。 - Vlad Pintea

0

window.location.href = "/step2.php" 就很好了。


2
嗯,除了IE浏览器之外其他都没问题!你有什么想法为什么它在这个浏览器上不起作用吗? - djq

0

IE只喜欢完整的URL。

var fullURL = 'http://www.your_site.com/step2.php';

$.ajax({ 
    type: "POST",
    url: phpUrl,  
    data: data,  
    async: false, 
    success: function() {

        window.location.href(fullURL);

    },  
    dataType:'json'         
}); 

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