我有一个用户脚本(适用于chrome和FF),该脚本向页面添加了重要功能,但最近由于开发人员向页面添加了一些AJAX而被破坏了。我想修改脚本以侦听xmlhttp请求的页面,以便可以基于responseText
页面接收的JSON格式动态更新添加的内容。
搜索显示了许多应该工作的功能,这些功能在控制台中运行时也可以工作。但是,它们在用户脚本的上下文中什么也不做。
(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);
它可以在控制台中完美地工作,我可以更改this.readyState
为this.responseText
它,并且效果很好(尽管在脚本中,我将需要它将JSON数据转换为对象,然后让我在用户脚本中对其进行操作。而不仅仅是写入控制台)
。但是,如果我将其粘贴到用户脚本中,则不会发生任何事情。用户脚本中的事件处理程序似乎未检测到页面上的xmlhttp请求。
进行请求的页面正在使用jquery $ .get()函数,如果这可能与它有关。虽然我不认为这样。
我无法想象没有办法,似乎在AJAX页面上运行的任何用户脚本都需要此功能。
由于页面使用$.get()
,因此拦截请求甚至更加容易。使用ajaxSuccess()
。
这将在Greasemonkey(Firefox)脚本中起作用:
片段1:
unsafeWindow.$('body').ajaxSuccess (
function (event, requestData)
{
console.log (requestData.responseText);
}
);
假设页面以普通方式($
定义等)使用jQuery 。
这应该可以在Chrome用户脚本(以及Greasemonkey)中运行:
片段2:
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);
回覆:
“但是如何将这些数据保存到脚本中呢?…(这样我就可以)稍后在脚本中使用这些数据。”
这适用于Greasemonkey(Firefox);
它也可能在Chrome的Tampermonkey中起作用:
代码段3:
function myAjaxHandler (requestData) {
console.log ('myAjaxHandler: ', requestData.responseText);
}
unsafeWindow.$('body').ajaxSuccess (
function (event, requestData) {
myAjaxHandler (requestData);
}
);
但是, 如果不是 这样,则无法通过设计在Chrome用户脚本和目标页面之间轻松地共享JS信息。
通常,您要做的是注入整个用户脚本,以便所有内容都在页面范围内运行。像这样:
片段4:
function scriptWrapper () {
//--- Intercept Ajax
$('body').ajaxSuccess (
function (event, requestData) {
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);
我想知道<代码>的内容 支持… 文档声明:“非常重要——确保在异步示例中使用回调!” 我正在学习JavaScript,几个小时来一直在搜索和尝试各种方法。我不完全理解示例中的两个函数——我只需要返回一个“title”,而不是完整的正文。 我使用了一个API来获取页面标题,但是它看起来有点奇怪。所以我希望我可以用明码得到标题。
我正在尝试使用JavaSeleniumWebDriver捕获网页的所有javascripts错误。 下面是我的代码示例: 作为Firefox驱动程序,我使用的是这个版本:geckodriver-v0。30.0-linux64。焦油广州 以下是我的Selenium版本: 我的问题是,在运行前面的代码时,出现以下异常: 司机信息:司机。版本:组织上的RemoteWebDriver。openqa。硒。j
现代 Web 应用程序, 除了呈现并发送到浏览器的静态 HTML 页面外, 还包含 JavaScript, 用于通过操纵现有元素或通过 AJAX 加载新内容来修改浏览器中的页面。 本节介绍 Yii 提供的用于向网站添加 JavaScript 和 CSS 以及动态调整它们的方法。 注册脚本 使用 yii\web\View 对象时,可以动态注册前端脚本。 这里有两个专门的方法: registerJs(
我正在Windows 10上使用Postman本机应用程序,并且正在努力捕获https请求。Postman的文档适用于Mac,而不是Windows。 特别是,我正在开发一个Web应用程序,该应用程序在登录时创建一个会话cookie,该cookie需要包含在大多数请求中才能获得授权。当我使用Chrome应用程序时,邮递员拦截器实现了这一点(请参阅 https://stackoverflow.com/
问题内容: 在w3schools.com(url)上,有一个如何使用纯Javascript进行AJAX调用的示例。如果看一下示例,您将看到呼叫是由一个按钮触发的: 这是功能: 我想做的是获取传出的AJAX调用的URL,即ajax_info.txt(URL): 我试图将URL置于警报中,所以我尝试使用希望给我的响应来调用响应的标头: 它确实给了我所有标头,但没有给主机。因此,我的下一个步骤是尝试设置
我正在使用webpack创建一个*.js包 然后在中,我有以下代码: 到目前为止,我在生成文件时没有遇到任何错误,但是底部的部分引发了一个异常 未捕获引用错误:$未定义 我想通过在插件部分定义符号可以识别: 知道如何让它工作吗?