繁体   English   中英

当AJAX在不重新加载页面的情况下更改URL时,如何重新加载Greasemonkey脚本?

[英]How do I reload a Greasemonkey script when AJAX changes the URL without reloading the page?

我有一个应用程序,我正在尝试为其创建Greasemonkey脚本。 它利用大量的jQuery和AJAX动态加载内容。

我注意到,该URL 不会改变每个我打开一个新项目时,即使该网页不刷新。

我是否可以在页面上放置一个监听器,以便每次URL更改时重新启动脚本?

如何执行此操作取决于站点/应用程序以及您要执行的操作。 以下是您的选择 ,最简单,最强大的第一:

  1. 不要试图捕获URL更改。 使用waitForKeyElements()调用来处理您想要首先操作的各个页面的各个部分。 这整齐地处理了所有其他方法固有的一系列时间问题。
    另请参阅: “在AJAX驱动的站点上选择并激活正确的控件”

  2. 只需轮询URL更改。 它很简单,在实践中效果很好,除了技术#1之外,所有时间问题都比较少。

  3. 如果站点使用AJAX更改片段 (AKA“hash”),则触发hashchange事件 唉,AJAX网站越来​​越少这样做了。

  4. 使用Mutation Observers监视<title>标记的更改。 大多数 AJAX页面都足以改变标题。 但是,这可能会在加载目标内容之前触发。

  5. 入侵history.pushState函数。 这样可以更快地通知页面更改,但95%的时间会在目标元素加载之前触发。 你通常还需要一个计时器。 此外,它还会在用户脚本环境中引入跨范围问题。


作为参考, 这是一个轮询示例 它仍然是最好的,简单的,跨浏览器,全能的方法:

/*--- Note, gmMain () will fire under all these conditions:
    1) The page initially loads or does an HTML reload (F5, etc.).
    2) The scheme, host, or port change.  These all cause the browser to
       load a fresh page.
    3) AJAX changes the URL (even if it does not trigger a new HTML load).
*/
var fireOnHashChangesToo    = true;
var pageURLCheckTimer       = setInterval (
    function () {
        if (   this.lastPathStr  !== location.pathname
            || this.lastQueryStr !== location.search
            || (fireOnHashChangesToo && this.lastHashStr !== location.hash)
        ) {
            this.lastPathStr  = location.pathname;
            this.lastQueryStr = location.search;
            this.lastHashStr  = location.hash;
            gmMain ();
        }
    }
    , 111
);

function gmMain () {
    console.log ('A "New" page has loaded.');
    // DO WHATEVER YOU WANT HERE.
}

“我注意到URL每次都会改变”,很多AJAX会让我发现他们正在使用History API。 如果是这种情况,请查看window.onpopstate 这应该使用History API触发每个URL更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM