javascript – 当AJAX更改URL而不重新加载页面时,如何重新加载Greasemonkey脚本?

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

我注意到每次加载新项目时URL都会更改,即使页面没有刷新.

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

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

>不要试图捕获URL更改. Use calls to waitForKeyElements() to act on the parts of the various pages that you wanted to manipulate in the first place.这整齐地处理了所有其他方法固有的一系列时间问题.
另见:“Choosing and activating the right controls on an AJAX-driven site”.
> Just poll for URL changes.它很简单,在实践中效果很好,除了技术#1之外,其他时间问题都比较少.
>如果该站点使用AJAX更改片段(AKA“hash”),fire on the hashchange event.唉,AJAX站点越来越少.
>使用Mutation Observers监视对< title>的更改标签.大多数AJAX页面都足以改变标题.但是,这可能会在加载目标内容之前触发.
> Hack into the history.pushState function.这会更快地通知页面更改,但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.
}

转载注明原文:javascript – 当AJAX更改URL而不重新加载页面时,如何重新加载Greasemonkey脚本? - 代码日志