我有一个基本的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
});
由于
答案 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){
....
}
});