如何从Greasemonkey脚本中替换,删除或拦截jQuery的ready事件?

时间:2013-09-28 23:11:43

标签: greasemonkey jquery

我使用的网站是用一些强大的javascript编写的。几乎没有任何全局,闭包,它使用严格的模式。这使我很难将自己的功能注入网站。

网站客户端对象在jQuery.ready()调用中初始化:

$(window).ready(function () {
    var a, b, c, d;

    // Setup global data [...]
    // Setup configuration [...]

    a = GlobalFoo.ConstructorA();
    b = GlobalFoo.ConstructorB(a);
    // Really wish I could put stuff here
    c = GlobalFoo.ConstructorC(a, b);
    d = GlobalFoo.ConstructorD(b, c);
    // etc.
});

例如,在调用其他构造函数之前,我如何用自己的代码替换b.someMethod()

我可以阻止就绪事件发生或用我自己的代码替换吗?由于它非常小,我可以在我的代码中复制修改后的版本。

1 个答案:

答案 0 :(得分:2)

经过多次搜索后,我发现了dindog this wonderful page。 GreaseSpot wiki上还有this page描述@run-at

@run-at允许您的用户脚本在所有其他代码之前运行。 beforescriptexecute事件允许您在执行前检查每个脚本。然后,您可以跳过或修改它。

我的最终解决方案是:

// ==UserScript==
// @name        ...
// @description ...
// @namespace   ...
// @include     ...
// @version     1
// @run-at      document-start
// @grant       none
// ==/UserScript==

(function (w) {
    // Remove the current jQuery ready code
    function pre_script_execute_handler (e) {
        var target = e.target;
        if (target.innerHTML.indexOf("$(window).ready(") != -1) {
            console.log('Removed ready');
            e.preventDefault();
            e.stopPropagation();
            addReady();
        }
    }
    w.addEventListener('beforescriptexecute', pre_script_execute_handler);

    // Add new jQuery ready code
    function addReady () {
        console.log('Adding new ready');
        w.$(window).ready(function () {
            console.log('Our ready called');
        });
    }


}) (unsafeWindow);