我有一个用户脚本(用于chrome和FF),它为页面添加了重要功能,但最近因为开发人员向页面添加了一些AJAX而被破坏。我想修改脚本来监听页面xmlhttp请求,这样我就可以根据页面接收的JSON格式responseText
动态更新我添加的内容。
搜索已经发现了许多应该工作的功能,并且在控制台中运行时可以正常工作。但是,它们不会从用户脚本的上下文中执行任何操作。
(function(open) {
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
this.addEventListener("readystatechange", function() {
console.log(this.readyState);
}, false);
open.call(this, method, url, async, user, pass);
};
})(XMLHttpRequest.prototype.open);
来自:How can I intercept XMLHttpRequests from a Greasemonkey script?
这在控制台中完美运行,我可以将this.readyState
更改为this.responseText
并且效果很好(尽管在脚本中我需要它将JSON数据转换为对象,然后让我在用户脚本中操作它。不只是写入控制台)。但是,如果我将其粘贴到用户脚本中没有任何反应。页面上的xmlhttp请求似乎没有被用户脚本中的事件处理程序检测到。
执行请求的页面正在使用jquery $ .get()函数,如果这可能与它有关。虽然我不这么认为。
我无法想象没有办法,似乎在AJAX页面上运行的任何用户脚本都需要这种能力。
答案 0 :(得分:10)
由于页面使用$.get()
,因此拦截请求更加容易。使用ajaxSuccess()
。
这将在Greasemonkey(Firefox)脚本中使用:
代码段1:
unsafeWindow.$('body').ajaxSuccess (
function (event, requestData)
{
console.log (requestData.responseText);
}
);
假设页面以正常方式使用jQuery(定义{{1}}等)。
这应该适用于Chrome用户脚本(以及Greasemonkey):
代码段2:
$
回复:
“但是如何将这些数据提供给脚本?...(我可以)稍后在脚本中使用这些数据。”
这适用于Greasemonkey(Firefox);它也可能适用于Chrome的Tampermonkey:
摘录3:
function interceptAjax () {
$('body').ajaxSuccess (
function (event, requestData)
{
console.log (requestData.responseText);
}
);
}
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, interceptAjax);
但是,如果它不那么你就无法在Chrome用户脚本和目标页面之间轻松共享JS信息 - 无论如何设计。
通常,您所做的就是注入整个用户脚本,以便所有内容都在页面范围内运行。像这样:
代码段4:
function myAjaxHandler (requestData) {
console.log ('myAjaxHandler: ', requestData.responseText);
}
unsafeWindow.$('body').ajaxSuccess (
function (event, requestData) {
myAjaxHandler (requestData);
}
);