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

Javascript 当AJAX更改URL而不重新加载页面时,如何重新加载Greasemonkey脚本?,javascript,ajax,greasemonkey,Javascript,Ajax,Greasemonkey,我有一个应用程序,我正试图创建一个Greasemonkey脚本。它利用大量jQuery和AJAX动态加载内容 我注意到,每次我加载新项目时,URL都会发生变化,即使页面没有刷新 是否可以在页面上放置一个侦听器,以便在URL每次更改时重新启动脚本?使用大量AJAX时,“我注意到URL每次都会更改”,这会让我知道他们正在使用历史API。如果是这样的话,请看一看。这应该在每次使用历史API更改URL时触发。如何执行此操作取决于站点/应用程序以及您尝试执行的操作以下是您的选项,首先是最简单、最可靠的选项

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

我注意到,每次我加载新项目时,URL都会发生变化,即使页面没有刷新


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

使用大量AJAX时,“我注意到URL每次都会更改”,这会让我知道他们正在使用历史API。如果是这样的话,请看一看。这应该在每次使用历史API更改URL时触发。

如何执行此操作取决于站点/应用程序以及您尝试执行的操作以下是您的选项,首先是最简单、最可靠的选项:

  • 不要试图捕捉URL更改。这巧妙地处理了所有其他方法固有的一系列时间问题。
    另见:

  • 它很简单,而且在实践中效果很好,除了技术之外,它的计时问题比其他任何方法都少

  • 如果站点使用AJAX更改片段(也称为“哈希”)。唉,越来越少的AJAX站点这样做了

  • 使用突变观察者监控
    标签的变化。大多数AJAX页面都很好,可以更改标题。不过,这可能会在加载目标内容之前触发

  • 这可以更快地通知页面更改,但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.
    }
    

    greasemonkey似乎不喜欢window.onpopstate。我似乎无法将任何事件绑定到它。@Sugitime我假设您正在使用和/或使用
    addEventListener
    ?@Sugitime您也尝试过unsafeWindow吗?。事实证明,有时这会在页面更改之前生效,所以解决方案是将您在
    gmMain()
    中所做的任何事情放入
    setTimeout()
    (我使用500毫秒),最重要的是,当您返回时,会再次调用该函数,您可以在AJAX内容的容器中找到一个类,并向第一个元素添加一个类,如果存在该类,则不做任何操作。