Почему мое событие ajaxSuccess jQuery не запускается в Greasemonkey? - PullRequest
1 голос
/ 02 марта 2012

У меня есть базовый скрипт greasemonkey, показанный ниже, в котором я хочу запускать некоторый код каждый раз, когда веб-сайт, на котором я запускаю скрипт, отправляет запрос AJAX.Обработчик jQuery, и он не запускается.Я подозреваю, что это может быть связано с тем, что запросы AJAX отправляются с глобальным флагом, установленным в false (см. http://docs.jquery.com/Ajax_Events).. Есть ли какой-нибудь лучший способ добиться этого, который будет работать, даже если для global установлено значение false?1006 * Код:

// ==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 ]

2 голосов
/ 02 марта 2012

JQuery в вашем пользовательском скрипте работает в отдельной среде от jQuery страницы .

Вам необходимо перехватить вызовы AJAX на странице , чтобы вы могли использовать (A) unsafeWindow или (B) Inject свой сценарий.

(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 - будьте осторожны при смешивании двух .

Один обходной путь для передачи данных через песочницу можно найти в этом ответе .

1 голос
/ 02 марта 2012

Это может быть как-то связано с песочницей greasemonkey.

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

Иногда вам может потребоваться доступ к глобальным переменным в документе содержимого.Например, возможно, документ содержимого определяет функцию, которую вы хотите вызвать.В этих случаях вы можете получить доступ к глобальной области содержимого документа с помощью переменной unsafeWindow.Просто имейте в виду, что доступ к членам этой переменной означает, что сценарии содержимого могут обнаружить ваш сценарий и потенциально помешать ему, если они выберут.

Т.е. document в сценарии greasemonkey может не совпадать сdocument на реальной веб-странице, поэтому вам, возможно, придется использовать unsafeWindow.document или что-то в этом роде.

Или, возможно, методы jQuery ajax просто не работают в greasemonkey без изменений (требующих специального переопределения объектов XHR)...

Например, http://www.monperrus.net/martin/greasemonkey+jquery+and+xmlhttprequest+together

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

... JQuery AJAX в Greasemonkey выглядит следующим образом:

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