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

时间:2012-03-01 23:45:47

标签: javascript jquery greasemonkey

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

我正在使用ajaxSuccess jQuery处理程序而且它没有被触发。我怀疑这可能是因为AJAX请求是在全局标志设置为false的情况下发送的(请参阅http://docs.jquery.com/Ajax_Events)。有没有更好的方法来实现这一点,即使全局设置为false也会有效?

代码:

// ==UserScript==
// @name           MyTestScript
// @require        http://code.jquery.com/jquery-1.7.1.min.js
// @namespace      NRA
// @include        http://www.mysamplewebsite.com/view/*
// ==/UserScript==

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

由于

2 个答案:

答案 0 :(得分:2)

userscript runs in a separate environment from the page's jQuery中的jQuery。

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

(A)unsafeWindow看起来像:

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


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

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范围 - 请注意混合两者

可以在this answer中找到一种解决方法,即在沙箱中传输数据。

答案 1 :(得分:1)

它可能与greasemonkey沙盒有关。

http://greasemonkey.mozdev.org/authoring.html

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

即。 greasemonkey脚本中的document可能与实际网页中的document不同,因此您可能必须使用unsafeWindow.document或其他内容。

或许jQuery的ajax方法根本不能在greasemonkey中工作而不需要改动(需要特殊覆盖XHR对象)......

E.g。 http://www.monperrus.net/martin/greasemonkey+jquery+and+xmlhttprequest+together

http://ryangreenberg.com/archives/2010/03/greasemonkey_jquery.php

... Greasemonkey中的JQuery AJAX看起来像是:

$.ajax({
  url: '/p/',// this even works for cross-domain requests by default
  xhr: function(){return new GM_XHR();},
  type: 'POST',
  success: function(val){
  .... 
  }
});