Javascript 当AJAX更改URL而不重新加载页面时,如何重新加载Greasemonkey脚本?
我有一个应用程序,我正试图创建一个Greasemonkey脚本。它利用大量jQuery和AJAX动态加载内容 我注意到,每次我加载新项目时,URL都会发生变化,即使页面没有刷新Javascript 当AJAX更改URL而不重新加载页面时,如何重新加载Greasemonkey脚本?,javascript,ajax,greasemonkey,Javascript,Ajax,Greasemonkey,我有一个应用程序,我正试图创建一个Greasemonkey脚本。它利用大量jQuery和AJAX动态加载内容 我注意到,每次我加载新项目时,URL都会发生变化,即使页面没有刷新 是否可以在页面上放置一个侦听器,以便在URL每次更改时重新启动脚本?使用大量AJAX时,“我注意到URL每次都会更改”,这会让我知道他们正在使用历史API。如果是这样的话,请看一看。这应该在每次使用历史API更改URL时触发。如何执行此操作取决于站点/应用程序以及您尝试执行的操作以下是您的选项,首先是最简单、最可靠的选项
是否可以在页面上放置一个侦听器,以便在URL每次更改时重新启动脚本?使用大量AJAX时,“我注意到URL每次都会更改”,这会让我知道他们正在使用历史API。如果是这样的话,请看一看。这应该在每次使用历史API更改URL时触发。如何执行此操作取决于站点/应用程序以及您尝试执行的操作以下是您的选项,首先是最简单、最可靠的选项:
另见:
标签的变化。大多数AJAX页面都很好,可以更改标题。不过,这可能会在加载目标内容之前触发以下是一个轮询示例,以供参考。它仍然是最好的、基本的、跨浏览器的、包罗万象的方法:
/*--- 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内容的容器中找到一个类,并向第一个元素添加一个类,如果存在该类,则不做任何操作。