Javascript 为什么我的ajaxSuccess jQuery事件没有在Greasemonkey中触发?

Javascript 为什么我的ajaxSuccess jQuery事件没有在Greasemonkey中触发?,javascript,jquery,greasemonkey,Javascript,Jquery,Greasemonkey,我有一个基本的greasemonkey脚本,如下所示,每次运行脚本的网站发送AJAX请求时,我都希望运行一些代码 我正在使用ajaxSuccess jQuery处理程序,但它没有被触发。我怀疑这可能是因为发送AJAX请求时将全局标志设置为false(请参阅)。是否有更好的方法来实现这一点,即使在global设置为false时也能起作用 代码: 谢谢这可能与greasemonkey沙箱有关 有时,您需要访问内容文档中的全局变量。例如,内容文档可能定义了一个要调用的函数。在这些情况下,可以使用un

我有一个基本的greasemonkey脚本,如下所示,每次运行脚本的网站发送AJAX请求时,我都希望运行一些代码

我正在使用ajaxSuccess jQuery处理程序,但它没有被触发。我怀疑这可能是因为发送AJAX请求时将全局标志设置为false(请参阅)。是否有更好的方法来实现这一点,即使在global设置为false时也能起作用

代码:


谢谢

这可能与greasemonkey沙箱有关

有时,您需要访问内容文档中的全局变量。例如,内容文档可能定义了一个要调用的函数。在这些情况下,可以使用unsafeWindow变量访问内容文档的全局范围。请注意,访问此变量的成员意味着内容脚本可以检测到您的脚本,如果他们选择,则可能会干扰脚本

也就是说,greasemonkey脚本中的
document
可能与实际网页中的
document
不同,因此您可能必须使用
unsafeWindow.document
或其他方法

或者jQuery的ajax方法在greasemonkey中不需要修改就无法工作(需要特殊重写XHR对象)

例如

。。。Greasemonkey中的JQuery AJAX如下所示:

unsafeWindow.$(document).ajaxSuccess(function(e, xhr) {
    alert("ajax success hit!");
    // I will do my other handling here
});
function scriptWrapper () {

    //--- Intercept Ajax
    $('body').ajaxSuccess (
        function (event, requestData) {
            alert ("ajax success hit!");
            doStuffWithAjax (requestData);
        }
    );

    function doStuffWithAjax (requestData) {
        console.log ('doStuffWithAjax: ', requestData.responseText);
    }

    //--- DO YOUR OTHER STUFF HERE.
    console.log ('Doing stuff outside Ajax.');
}

function addJS_Node (text, s_URL, funcToRun) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ    = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}

addJS_Node (null, null, scriptWrapper);

这可能与油腻的沙箱有关

有时,您需要访问内容文档中的全局变量。例如,内容文档可能定义了一个要调用的函数。在这些情况下,可以使用unsafeWindow变量访问内容文档的全局范围。请注意,访问此变量的成员意味着内容脚本可以检测到您的脚本,如果他们选择,则可能会干扰脚本

也就是说,greasemonkey脚本中的
document
可能与实际网页中的
document
不同,因此您可能必须使用
unsafeWindow.document
或其他方法

或者jQuery的ajax方法在greasemonkey中不需要修改就无法工作(需要特殊重写XHR对象)

例如

。。。Greasemonkey中的JQuery AJAX如下所示:

unsafeWindow.$(document).ajaxSuccess(function(e, xhr) {
    alert("ajax success hit!");
    // I will do my other handling here
});
function scriptWrapper () {

    //--- Intercept Ajax
    $('body').ajaxSuccess (
        function (event, requestData) {
            alert ("ajax success hit!");
            doStuffWithAjax (requestData);
        }
    );

    function doStuffWithAjax (requestData) {
        console.log ('doStuffWithAjax: ', requestData.responseText);
    }

    //--- DO YOUR OTHER STUFF HERE.
    console.log ('Doing stuff outside Ajax.');
}

function addJS_Node (text, s_URL, funcToRun) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ    = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}

addJS_Node (null, null, scriptWrapper);
您的数据库中的jQuery

您需要拦截页面的AJAX调用,以便可以使用(A)
unsafeWindow
或(B)注入脚本

(A)
unsafeWindow
看起来像:

unsafeWindow.$(document).ajaxSuccess(function(e, xhr) {
    alert("ajax success hit!");
    // I will do my other handling here
});
function scriptWrapper () {

    //--- Intercept Ajax
    $('body').ajaxSuccess (
        function (event, requestData) {
            alert ("ajax success hit!");
            doStuffWithAjax (requestData);
        }
    );

    function doStuffWithAjax (requestData) {
        console.log ('doStuffWithAjax: ', requestData.responseText);
    }

    //--- DO YOUR OTHER STUFF HERE.
    console.log ('Doing stuff outside Ajax.');
}

function addJS_Node (text, s_URL, funcToRun) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ    = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}

addJS_Node (null, null, scriptWrapper);

(B) 脚本注入看起来像:

unsafeWindow.$(document).ajaxSuccess(function(e, xhr) {
    alert("ajax success hit!");
    // I will do my other handling here
});
function scriptWrapper () {

    //--- Intercept Ajax
    $('body').ajaxSuccess (
        function (event, requestData) {
            alert ("ajax success hit!");
            doStuffWithAjax (requestData);
        }
    );

    function doStuffWithAjax (requestData) {
        console.log ('doStuffWithAjax: ', requestData.responseText);
    }

    //--- DO YOUR OTHER STUFF HERE.
    console.log ('Doing stuff outside Ajax.');
}

function addJS_Node (text, s_URL, funcToRun) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ    = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}

addJS_Node (null, null, scriptWrapper);

请注意,在这两种情况下,您必须意识到数据不会轻易地从页面范围流回到GM范围——请小心混合这两种

您可以在中的jQuery中找到一种解决方法,用于在沙箱中传输数据

您需要拦截页面的AJAX调用,以便可以使用(A)
unsafeWindow
或(B)注入脚本

(A)
unsafeWindow
看起来像:

unsafeWindow.$(document).ajaxSuccess(function(e, xhr) {
    alert("ajax success hit!");
    // I will do my other handling here
});
function scriptWrapper () {

    //--- Intercept Ajax
    $('body').ajaxSuccess (
        function (event, requestData) {
            alert ("ajax success hit!");
            doStuffWithAjax (requestData);
        }
    );

    function doStuffWithAjax (requestData) {
        console.log ('doStuffWithAjax: ', requestData.responseText);
    }

    //--- DO YOUR OTHER STUFF HERE.
    console.log ('Doing stuff outside Ajax.');
}

function addJS_Node (text, s_URL, funcToRun) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ    = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}

addJS_Node (null, null, scriptWrapper);

(B) 脚本注入看起来像:

unsafeWindow.$(document).ajaxSuccess(function(e, xhr) {
    alert("ajax success hit!");
    // I will do my other handling here
});
function scriptWrapper () {

    //--- Intercept Ajax
    $('body').ajaxSuccess (
        function (event, requestData) {
            alert ("ajax success hit!");
            doStuffWithAjax (requestData);
        }
    );

    function doStuffWithAjax (requestData) {
        console.log ('doStuffWithAjax: ', requestData.responseText);
    }

    //--- DO YOUR OTHER STUFF HERE.
    console.log ('Doing stuff outside Ajax.');
}

function addJS_Node (text, s_URL, funcToRun) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ    = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}

addJS_Node (null, null, scriptWrapper);

请注意,在这两种情况下,您必须意识到数据不会轻易地从页面范围流回到GM范围——请小心混合这两种


可以在中找到一种通过沙箱传输数据的解决方法。

尝试了这两种方法,但不幸的是它们都不起作用。我不确定我错在哪里。你有什么其他想法我可以尝试吗?我使用这两种方法;他们工作得很好。编辑你的问题(或开始一个新问题),描述它如何不适合你,并链接到目标页面。Greasemonkey脚本总是高度特定于页面。。。如果不适用于您的代码与上面所示的不完全相同,请开始一个新问题,显示您正在使用的确切代码,但不要忘记指向目标页面的链接。至于其他想法,拦截AJAx很少是最好的方法,但这正是你所要问的。通常最好监视目标页面上的特定节点。发布一个新的Q。好的,我会的,谢谢。我基本上是在监视一个DIV元素,看看它是否是CSS更改。我试图检查每次AJAX事件是否发生,这似乎是不使用计时器的唯一方法。计时器方法(如果适用于您的页面)通常比拦截AJAX方法更简单、更健壮。这完全取决于最终目标是什么。尝试了这两种方法,但不幸的是它们都不起作用。我不确定我错在哪里。你有什么其他想法我可以尝试吗?我使用这两种方法;他们工作得很好。编辑你的问题(或开始一个新问题),描述它如何不适合你,并链接到目标页面。Greasemonkey脚本总是高度特定于页面。。。如果不适用于您的代码与上面所示的不完全相同,请开始一个新问题,显示您正在使用的确切代码,但不要忘记指向目标页面的链接。至于其他想法,拦截AJAx很少是最好的方法,但这正是你所要问的。通常最好监视目标页面上的特定节点。发布一个新的Q。好的,我会的,谢谢。我基本上是在监视一个DIV元素,看看它是否是CSS更改。我试图检查每次AJAX事件是否发生,这似乎是不使用计时器的唯一方法。计时器方法(如果适用于您的页面)通常比拦截AJAX方法更简单、更健壮。这完全取决于最终目标是什么。