如何通过window.location更改URL后运行代码?

时间:2013-03-07 16:11:38

标签: javascript greasemonkey onload window.location

我这样做但是不起作用:

window.addEventListener("load", function load(event){
    alert('hola');
},false);

window.location.assign("about:blank");

这是一个Greasemonkey脚本。已加载新位置,但从不显示警报。

2 个答案:

答案 0 :(得分:4)

更改window.location后,将清除Greasemonkey脚本的当前实例。 To"运行代码"位置更改后,您需要将脚本设置为在新页面上触发(在这种情况下为about:blank),然后使用标志通过此脚本重定向原始页面来表示已到达新页面。 / p>

  1. 确保脚本的@include@match指令在新页面上触发。
  2. 使用GM_setValue()设置标志,让脚本知道它是故意转世的。
  3. 这是一个完整的工作脚本,用于说明该过程:

    // ==UserScript==
    // @name     _Fire after redirect to about:blank
    // @include  about:blank
    // @include  http://YOUR_SERVER.COM/YOUR_PATH/*
    // @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
    // @grant    GM_setValue
    // @grant    GM_getValue
    // @grant    GM_deleteValue
    // ==/UserScript==
    
    //-- Are we on a blank page after a redirect by this script?
    var bAfterRedirect = GM_getValue ("YouHaveBeenRedirected", false);
    
    //-- Always erase the stored flag.
    GM_deleteValue ("YouHaveBeenRedirected");
    
    if (bAfterRedirect  &&  location == 'about:blank') {
        //-- DO WHATEVER YOU WANT WITH THE BLANK/NEW PAGE HERE.
        $("body").append (
            '<h1>This content was added after a GM redirect.</h1>'
        );
    }
    else if (location != 'about:blank') {
        /*-- If we are on the original target page, signal our next incarnation
            that it was triggered by a redirect.  Then redirect to about:blank.
        */
        GM_setValue ("YouHaveBeenRedirected", true);
        location.assign ("about:blank");
    }
    

答案 1 :(得分:1)

只改变url的hash(或fragment)部分,然后做你想做的任何事情,因此:

window.location.assign("#hello")
alert("hola")

或者因此:

window.location.hash = "world"
alert("mondo")

如果文档已加载,onload将不会再次触发,因此您无法从load事件中运行它。 HTML5提供了一个hashchange事件,您可以使用它,因此:

window.addEventListener("hashchange", function (event){
    alert('change');
},false);

一些javascript库(我知道dojo确实)实现了hashchange或非HTML5浏览器的等价物。为了利用这一点,您需要使用该库的约定来注册事件。