Sug*_*ime 8 javascript ajax greasemonkey
我有一个应用程序,我正在尝试为其创建Greasemonkey脚本.它利用大量的jQuery和AJAX动态加载内容.
我注意到,该URL 不会改变每个我打开一个新项目时,即使该网页不刷新.
我是否可以在页面上放置一个监听器,以便每次URL更改时重新启动脚本?
Bro*_*ams 17
如何执行此操作取决于站点/应用程序以及您要执行的操作. 以下是您的选择,最简单,最强大的第一:
不要试图捕获URL更改. 首先使用调用来waitForKeyElements()操作您想要操作的各个页面的各个部分. 这整齐地处理了所有其他方法固有的一系列时间问题.
另请参阅:"在AJAX驱动的站点上选择并激活正确的控件".
只需轮询URL更改. 它很简单,在实践中效果很好,除了技术#1之外,所有时间问题都比较少.
如果该站点使用更改片段的 AJAX (AKA"hash"),则触发该hashchange事件.唉,AJAX网站越来越少这样做了.
使用突变观察员监测变化的<title>标签.大多数 AJAX页面都足以改变标题.但是,这可能会在加载目标内容之前触发.
入侵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.
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*n V -1
“我注意到 URL 每次都会改变”,大量 AJAX 会让我知道他们正在使用 History API。如果是这样的话,请看一下window.onpopstate。使用 History API 应该会在每次 URL 更改时触发。
| 归档时间: |
|
| 查看次数: |
4553 次 |
| 最近记录: |