如何在 AJAX 请求后加载 Greasemonkey 脚本

3
我有一个简单的Greasemonkey脚本,用于进行一些简单的DOM操作。这个Greasemonkey脚本在DOM加载后加载,对于初始页面来说很好,也能正常工作。但是在这个网站(Twitter),页面的某些部分会在通过XMLHttpRequest点击后加载,而我的Greasemonkey脚本没有对这部分进行操作。
是否有一种简单的方法,在XMLHttpRequest加载或请求更改DOM之后再次运行脚本?
2个回答

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 响应事件发生时注入自己的功能。


2
感谢Howard。这是朝着正确方向的方式。
在缩小后的脚本中找到正确的入口点以劫持函数相当困难。但我发现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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接