window.location.replace() 无法重定向浏览器

Posted

技术标签:

【中文标题】window.location.replace() 无法重定向浏览器【英文标题】:window.location.replace() not working to redirect browser 【发布时间】:2012-02-12 12:21:38 【问题描述】:

我用页面进行导航,但这段代码不起作用,有什么问题?

<script>
$(document).ready(function() 
$("body").keydown(function(event) 
  if(event.keyCode == 37)  // left
    window.location.replace("http://newsii.abudayah.com/photo/2)";  
  else if(event.keyCode == 39)  // right
    window.location.replace("http://newsii.abudayah.com/photo/31)";  
);
);
</script>

【问题讨论】:

没有一个答案似乎注意到每个 URL 中的括号在引号内,而当它需要在引号外时。否则使用 replace 方法在语法上是正确的。 【参考方案1】:

不要为此使用.replace(),直接赋值即可。

Example

$("body").keydown(function(event) 

    if(event.keyCode == 37)  // left
        window.location = "http://newsii.abudayah.com/photo/2";
    
    else if(event.keyCode == 39)  // right
        window.location = "http://newsii.abudayah.com/photo/31"; 
    

);

【讨论】:

我不得不说,使用 jsfiddle 的答案的价值必须是没有相同答案的 10 倍。 同意...只要我感觉到的不是讽刺。 有机会知道原因吗? replace()assign() 有什么不好? @green - location.assign() 实际上与设置location.href 相同(与直接设置location 相同)。其中每一个都向浏览器历史记录添加了一个新条目(后退按钮等)。 location.replace() 有一个非常有效且不同的用例,它会更改页面 url,但不会在浏览器历史记录中添加条目。见developer.mozilla.org/en-US/docs/Web/API/Window/location。 你不能直接访问window.location,因为它是只读属性【参考方案2】:

您的代码有语法错误。您的结尾括号在引号内而不是在外...

试试:

<script>
$(document).ready(function() 
$("body").keydown(function(event) 
  if(event.keyCode == 37)  // left
    window.location.replace("http://newsii.abudayah.com/photo/2");    
  else if(event.keyCode == 39)  // right
    window.location.replace("http://newsii.abudayah.com/photo/31");  
);
);
</script>

并非所有浏览器都支持window.location.replace。始终支持分配位置值。但是,使用替换而不是分配位置值的原因是您不希望当前 url 出现在历史记录中,或者在使用后退按钮时显示出来。由于这并不总是可能的,您只需要满足于可能的情况:

<script>
$(document).ready(function() 
$("body").keydown(function(event) 
  if(event.keyCode == 37)  // left
    try  window.location.replace("http://newsii.abudayah.com/photo/2");  
    catch(e)  window.location = "http://newsii.abudayah.com/photo/2"; 
  
  else if(event.keyCode == 39)  // right
    try  window.location.replace("http://newsii.abudayah.com/photo/31");  
    catch(e)  window.location = "http://newsii.abudayah.com/photo/31"; 
  
);
);
</script>

【讨论】:

这是一个很好的答案。后备非常有用。【参考方案3】:

Chrome 中重新加载同一页面时,我遇到了无法正常工作的问题。执行以下操作:

   window.location.replace("/mypage1.aspx?type=abc"); //redirect to fake page
   window.location.replace("/mypage.aspx?type=abc");  //redirect to same page

这有点像 hack,但这似乎是在 Chrome 中强制重新加载同一页面的唯一方法。 IE 和 FF 无需重定向到虚假页面即可工作。

【讨论】:

IIUC 这依赖于第一次重定向不会立即发生,因此第二行开始运行。但理论上,如果第一次发生得非常快,用户会卡在假网址上并看到错误页面。【参考方案4】:

我在 Chrome 中遇到了这个问题。我试图从同一个域加载另一个页面,但使用的是绝对 URL(例如www.example.com/newurl)。我将其更改为相对 URL (/newurl),现在可以使用了。

我的想法是,这是一项安全功能,可防止用户通过某些 javascript 广告被重定向到恶意网站。

【讨论】:

【参考方案5】:

我用过这个,效果很好

$(document).ready(function () 

    $(document).keydown(function(e) 
        var url = false;
        if (e.which == 37)   // Left arrow key code
            url = $('.prev').attr('href');
        
        else if (e.which == 39)   // Right arrow key code
            url = $('.next').attr('href');
        
        if (url) 
            window.location = url;
        
    );

);

【讨论】:

【参考方案6】:

这样使用:

window.history.pushState("", "", "new url");
window.location.reload();

【讨论】:

以上是关于window.location.replace() 无法重定向浏览器的主要内容,如果未能解决你的问题,请参考以下文章

window.location.href和window.location.replace的区别

window.location.replace和window.location.href的区别

window.location.href/replace/reload()/页面跳转+替换+刷新

使用 window.location.replace(response.path) [重复]

Android 是不是支持 window.location.replace 或任何等价物?

是否可以捕获 window.location.replace 事件?