【问题标题】:Chrome fails to redirect URL when told to via javascript当通过 javascript 告知时,Chrome 无法重定向 URL
【发布时间】:2012-01-20 16:08:40
【问题描述】:
function test(){    
    alert("This message should show");
    window.location.href = "http://www.google.com";
    alert("This message should NOT show");
}
<href="#" onClick=test()>Click Me</a>
  • 逐步使用 Firefox(v8):第二条消息不显示。
  • 逐步使用 chrome(v15、v16):两个警报都会显示。

Chrome 跳过重定向并在重定向之前继续调用堆栈的其余部分(在本例中,它完成了 onClick)。

  • 没有 JavaScript 错误。
  • 禁用所有扩展。
  • 我正在使用一个没有加载外部文件的空白 html 文件。

有谁知道让 chrome 立即执行 window.location 更改的方法?

【问题讨论】:

  • 尝试在没有窗口的情况下运行它。如果它不起作用,请尝试 而不是 onClick
  • 无窗口运行。没有帮助,Chrome 在重定向后继续运行。

标签: javascript url google-chrome redirect


【解决方案1】:

可以肯定的是,规格并不能保证这一点,所以我并不感到惊讶。显而易见的解决方案是立即抛出异常。假设您的代码周围没有散落的 catch 块,那应该可以工作:

throw "Aborting, redirecting you.";

(是的,它很难看。对不起!)

编辑:小提琴:without throwwith throw

【讨论】:

  • 是的,它是丑陋的......但它的工作原理 =) 那里有更好的答案吗?不过,我仍然希望谷歌人员提供更完整的答案。为什么js引擎不会立即重定向? ~叹气~
  • 因为不是JS引擎重定向。重定向你的是 DOM 实现,JS 引擎不给猪尾巴。 Chrome 似乎已经使分配异步(可能给你更快的速度),这意味着 JS 引擎只是继续运行它的东西。另请参阅此问题:stackoverflow.com/questions/7787788/…
  • 看起来 throw 可能是唯一的选择——我什至不知道这件事发生得这么好。 stackoverflow.com/questions/550574/…
  • 这个问题指出了一个问题:事件处理程序仍然会在抛出后运行,即使它没有被捕获。如果您使用的是库(如 jQuery),取消绑定所有绑定的事件处理程序可能会更容易一些......这很有趣,所以如果我能找到一个 sn-p 来做这件事,我会看看......
  • 嗯,看起来比我想象的要难。当然,像 $('*').unbind() 这样的东西会做,但它可能会很慢......
【解决方案2】:

您可以添加return

function test(){    
    alert("This message should show");
    window.location.href = "http://www.google.com";
    return;
    alert("This message should NOT show");
}

【讨论】:

  • 这不起作用,因为 return 只退出函数,调用堆栈继续运行。
【解决方案3】:

有更好的方法来做到这一点。

function test(){    
alert("This message should show");
return true;
alert("This message should NOT show");
}

<href="http://www.google.com" onClick="return test()">Click Me</a>

(可选)您可以使用确认来控制是否可以在点击时执行此操作。责备谷歌试图破坏功能标准,没有其他浏览器强迫你这样做。

【讨论】:

    【解决方案4】:

    我只是在尝试同样的事情:使用 JS 重定向。在我拥有的 PHP 脚本中,如果某个条件为真,我只需用 die 函数结束脚本,用重定向代码回显脚本标记:

    die("<script type='text/javascript' charset='utf-8'>\n".
        "window.location.href='http://'+window.location.hostname+'/newdir/newfile.html';\n".
        "</script>\n");
    

    这不起作用,我尝试从控制台执行代码,它从那里工作。我认为这与时间有关,所以我在重定向中添加了 setTimeout

    die("<script type='text/javascript' charset='utf-8'>\n".
        "var configURL = 'http://'+window.location.hostname+'/newdir/newfile.html';\n".
        "setTimeout('window.location.href = configURL', 500);\n".
        "</script>\n");
    

    这个补丁现在有效,但我认为应该有更好的方法来做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 2013-03-11
      相关资源
      最近更新 更多