我有一个简单的greasemonkey 脚本,可以进行一些简单的dom 操作。加载 DOM 后加载greasemonkey 脚本,这很好,它适用于初始页面。但是在这个网站上(它是 twitter ;-))页面的某些部分在 xmlhttprequest 单击后被加载,这部分没有被我的greasemonkeyscript 操纵。
在加载 xmlhttprequest 或请求更改 DOM 后,是否有简单的可能性再次运行脚本?
我有一个简单的greasemonkey 脚本,可以进行一些简单的dom 操作。加载 DOM 后加载greasemonkey 脚本,这很好,它适用于初始页面。但是在这个网站上(它是 twitter ;-))页面的某些部分在 xmlhttprequest 单击后被加载,这部分没有被我的greasemonkeyscript 操纵。
在加载 xmlhttprequest 或请求更改 DOM 后,是否有简单的可能性再次运行脚本?
使用 Greasemonkey 时的一项强大技术是“劫持”现有的 JavaScript 函数。如果您正在更改的页面有一个调用函数,该函数processAjaxResponse
在处理XmlHttpRequest
响应时调用,您可以在 Greasemonkey 脚本中执行以下操作:
var originalProcessAjaxResponse;
function myNewProcessAjaxResponse() {
/* Manipulate DOM if you need to, and then... */
originalProcessAjaxResponse();
}
function hijack() {
var originalProcessAjaxResponse = processAjaxResponse;
processAjaxResponse = myNewProcessAjaxResponse();
}
这允许您在 AJAX 响应事件发生时注入您自己的功能。
谢谢霍华德。这是朝着正确方向前进的道路。
很难找到正确的入口点来劫持缩小脚本上的函数。但是我发现推特脚本中有一个哈克。它确实在 Ajax 请求之后调用 window.onPageChange。(我想知道这是否是 javascript 中常见的最佳实践,如果其他人也这样做?)我确实在http://userscripts.org/scripts/review/47998上找到了一些代码,它确实使用这种可能性来附加事件。
if (typeof unsafeWindow.onPageChange === 'function') {
var _onPageChange = unsafeWindow.onPageChange;
unsafeWindow.onPageChange = function(){
_onPageChange();
filter();
};
} else {
unsafeWindow.onPageChange = filter;
}