我有一个简单的greasemonkey脚本,可以进行一些简单的dom操作。在加载DOM之后加载greasemonkey脚本,这很好,因此它适用于初始页面。但是在这个网站上(它是推特;-))页面的一部分在xmlhttprequest点击后被加载,这部分没有被我的greasemonkeyscript操纵。
在加载xmlhttprequest之后或者在请求更改DOM之后,是否有可能再次运行脚本?
答案 0 :(得分:3)
使用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响应事件发生时注入自己的功能。
答案 1 :(得分:1)
谢谢霍华德。这是正确的方向。
很难找到一个在minifyied脚本上劫持函数的正确入口点。但是我发现twitter脚本中有一个哈欠。它在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;
}