窗口位置替换(window.location.replace())无法重定向浏览器

18

我正在制作页面导航,但是这段代码不起作用,问题出在哪里?

<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>

24
所有的回答似乎都没有注意到每个URL中的括号在引号内,而它需要在外面。否则,使用replace方法的语法是正确的。 - Andy F
6个回答

33
不要使用 `.replace()` 方法来实现这个,直接将值赋给变量即可。 示例
$("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"; 
    }

});

4
我必须说,一个带有jsfiddle的答案价值是没有同样答案的10倍。 - Paul Tomblin
同意...只要我没有感觉到讽刺。 - jondavidjohn
3
为什么会这样?replace()assign()有什么问题吗? - Green
7
location.assign() 的效果与设置 location.href 相同(将其与直接设置 location 相同)。这两种方法都会向浏览器历史记录中添加一个新条目(包括返回按钮等)。location.replace() 具有非常有效且不同的用途,它会更改页面的 URL,但不会在浏览器历史记录中添加新条目。请参见https://developer.mozilla.org/en-US/docs/Web/API/Window/location。 - cchamberlain
1
你无法直接访问 window.location,因为它是只读属性。 - Volodymyr Khmil
显示剩余3条评论

25

你的代码有语法错误。你的右括号在引号内而不是外面…

尝试:

<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在所有浏览器中都不受支持,但是分配位置值始终得到支持。然而,使用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>

1
这是一个很棒的答案。备用方案非常有用。 - Rivalus

5

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

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


4

我在使用Chrome浏览器重新加载同一页面时遇到了问题,按照以下方法进行操作即可解决:

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

这个方法有点“折中”,但是似乎是唯一的能够在Chrome上强制刷新同一页面的方法。IE和Firefox不需要重定向到假页面也可以正常工作。


1
如果我理解正确,这取决于第一个重定向不会立即发生,因此第二行得以运行。但是理论上,如果第一个重定向非常快,用户将被卡在虚假的URL上并看到错误页面。 - Beni Cherniavsky-Paskin

1

我使用过这个,它可以工作

$(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;
        }
    });

});

1

使用这种方式:

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

对我来说完美无缺。 - mkkr1009

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