JavaScript / jQuery Userscript阻止重定向

时间:2014-09-19 06:00:37

标签: javascript redirect onbeforeunload

好的,使用Userscript,如何检测和停止页面重定向?我没有页面来源。

以下是页面上正常发生的情况:

  1. 用户点击链接
  2. 通过发送一些关于点击链接到PHP页面的链接的数据,通过AJAX与服务器进行页面检查
  3. PHP页面明确回复了一些内容,因为用户被重定向到另一个页面。
  4. 因此,仍然允许AJAX请求在步骤2中完成,如何通过使用用户脚本来阻止用户的重定向?

    根据我的理解,window.onbeforeunload实际上只有在用户移动页面之前给出对话框才有帮助 - 我不想要这个,我想默默地阻止重定向。

    编辑:我认为window.stop()会阻止页面更改,但检测到它会改变可能是一个挑战...

    document.location.href = 'http://www.something.com';
    window.stop();
    

    似乎工作。但检测到location.href正在改变?

1 个答案:

答案 0 :(得分:-3)

普通链接默认是加载另一个页面的请求,该请求与您点击链接后可能执行的任何操作无关。但是,您不必使用普通的链接;看看这个:

<a style="color:#0000ff;text-decoration:underline;cursor:pointer;"
onclick="window.name='here';window.open('http://www.example.com/newpage.htm',
'here');">New Page</a>

HTML代码看起来与普通链接完全相同,并且与普通链接完全相同,可以将新页面加载到当前页面中。但它实际上是一个JavaScript *构造,这意味着你可以拦截它来做其他事情,例如:

<a style="color:#0000ff;text-decoration:underline;cursor:pointer;"
onclick="window.name='here';intercept();">New Page</a>

您现在可以编写名为“intercept()”的JavaScript函数来决定是否加载新页面(进行AJAX调用)。如果您决定加载新页面,那么您只需要在AJAX回调函数中执行此操作:

window.open('http://www.example.com/newpage.htm','here');

如果您在网页上有多个链接,只需在intercept()函数调用中指定一个参数(即intercept('newpage.htm');intercept('altpage.htm');intercept('diffpage.htm');),然后拦截函数内部只是将接收到的字符串放入一个全局变量中,因此AJAX回调函数内的window.open()函数调用可以使用全局变量来打开正确的新页面。

*当然,用户必须在浏览器中启用JavaScript才能使链接正常工作。但是,需要启用JavaScript才能使AJAX正常工作,所以,这不是问题。