好的,所以基本上我想在页面上放置一些JavaScript,以某种方式附加某种全局事件侦听器,该侦听器可以在发出ajax请求时检测并执行某些操作(而无需从调用中直接调用),而不管ajax如何打电话了。
我想出了如何使用jquery-如果ajax请求是 由 jquery 完成 的 。这是一个示例代码:
$.post(
// requested script
'someScript.php',
// data to send
{
'foo' : 'bar',
'a' : 'b'
},
// receive response
function(response){
// do something
}
); // .post
// global event listener
$(document).ajaxSend(
function(event,request,settings){
alert(settings.url); // output: "someScript.php"
alert(settings.data); // output: "foo=bar&a=b"
}
);
使用此代码,无论我在哪里/如何调用$ .post(..),全局事件监听器都会触发。如果我使用$ .get或$ .ajax(任何jquery
ajax方法),也不管我如何调用它/何时调用(附加为onclick,页面加载等),它也可以工作。
但是,我希望能够扩展此侦听器以触发,无论使用哪种js框架,甚至不使用任何框架。因此,例如,如果我在页面上 还
包含以下代码(w3schools的通用ajax代码):
function loadXMLDoc()
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","test.txt",true);
xmlhttp.send();
}
然后,我有一些随机链接到该函数一个onclick调用,我的全局AJAX事件侦听器应该能够 同时
检测到这一请求。好吧,我将该代码添加到了页面中,并将其附加到了随机链接的onclick上(是的,代码本身可以工作),但是上面的jquery“全局事件监听器”代码未能检测到该调用。
我做了一些进一步的挖掘,我知道我基本上可以将对象保存到一个temp对象中,并使用“包装器”对象覆盖当前对象,该包装器将调用指定的函数,然后调用temp函数,但这需要我提前知道创建/使用原始对象的时间。但是我永远不会总是提前知道…
那么…这可能吗?是否有某种方法可以检测到发出的ajax获取/发布请求,而不管它是使用通用对象还是通过xyz框架完成的?还是我只需要制作重复的代码来处理每个框架,并且还提前知道正在创建/使用的ajax对象?
编辑:
我忘了提一下,仅检测到一个请求是不够的。我还需要捕获请求中发送的数据。以下评论中提供的链接将帮助您确定是否发出了“ a”请求,但未获取发送的数据。ps-
至少在我看来,以下链接中提供的答案不是很清楚。
好的,这是我到目前为止提出的:
<script type='text/javascript'>
var s_ajaxListener = new Object();
s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open;
s_ajaxListener.tempSend = XMLHttpRequest.prototype.send;
s_ajaxListener.callback = function () {
// this.method :the ajax method used
// this.url :the url of the requested script (including query string, if any) (urlencoded)
// this.data :the data sent, if any ex: foo=bar&a=b (urlencoded)
}
XMLHttpRequest.prototype.open = function(a,b) {
if (!a) var a='';
if (!b) var b='';
s_ajaxListener.tempOpen.apply(this, arguments);
s_ajaxListener.method = a;
s_ajaxListener.url = b;
if (a.toLowerCase() == 'get') {
s_ajaxListener.data = b.split('?');
s_ajaxListener.data = s_ajaxListener.data[1];
}
}
XMLHttpRequest.prototype.send = function(a,b) {
if (!a) var a='';
if (!b) var b='';
s_ajaxListener.tempSend.apply(this, arguments);
if(s_ajaxListener.method.toLowerCase() == 'post')s_ajaxListener.data = a;
s_ajaxListener.callback();
}
</script>
方向:
只需将其c / p到您的页面上,或将其包含在.js文件中或任何其他内容中即可。这将创建一个名为s_ajaxListener的对象。每当发出AJAX
GET或POST请求时,就会调用s_ajaxListener.callback(),并且以下属性可用:
s_ajaxListener.method
:使用的ajax方法。这应该是GET或POST。注意:该值可能并不总是大写,这取决于特定请求的编码方式。我正在讨论自动将其大写或将其留给toLowerCase()进行区分大小写的比较的智慧。
s_ajaxListener.url
:所请求脚本的URL(包括查询字符串,如果有的话)(使用urlencoded)。我已经注意到,取决于如何发送数据以及从哪个浏览器/框架发送数据,例如,该值最终可能是“”或“
+”或“%20”。我正在讨论在此处解码或将其留给其他东西的智慧。
s_ajaxListener.data :发送的数据,如果有的话,例如:foo = bar&a = b(与.url相同的“问题”,并使用url编码)
笔记:
就目前而言, 这与IE6不兼容
。这个解决方案对我来说还不够好,因为我希望它与IE6兼容。但是由于很多其他人都不关心IE6,所以我决定将解决方案发布到当前状态,因为如果您不关心IE6,它对您来说就会有用。
我已经在 (截至发布日期)对此 进行了测试
:当前的Safari,当前的Chrome,当前的FireFox,IE8,IE8(与IE7兼容)。它当前不适用于IE6,因为IE6使用ActiveX对象,而实际上其他所有东西都使用XMLHttpRequest。
现在,我没有任何线索,基本上,原型/扩展/重载(?)ActiveXObject(“
Microsoft.XMLHTTP”)。这就是我目前正在研究的…有人知道吗?
在我上面测试过的每种浏览器下,它都可以处理来自通用对象以及jquery和原型框架的AJAX请求。我知道还有其他框架,但是IMO这两个是主要框架。我可能会对MooTools进行质量检查,但除此之外,我只测试它们就可以了。
如果有人希望通过测试和发布有关其他浏览器和/或框架的结果做出贡献,将不胜感激:)
问题内容: 好的,所以基本上我想在页面上放一些JavaScript,以某种方式附加某种全局事件侦听器,该侦听器可以在发出ajax请求时检测并执行某些操作(无需直接从调用中调用它),而不管ajax如何打电话了。 我想出了如何使用jquery-如果ajax请求是 由 jquery 完成 的 。这是一个示例代码: 使用此代码,无论我在哪里/如何调用$ .post(..),全局事件监听器都会触发。如果我使
问题内容: 是否可以通过通用JavaScript(而不是框架)检测网页上的全局AJAX调用(尤其是响应)? 我已经在StackOverflow上审查了“JavaScript检测到AJAX事件 ” 的问题,并尝试将接受的答案的代码修补到我的应用程序中,但是没有用。之前,我从未使用AJAX做任何事情,我还不足以对其进行修改以使其正常工作。 我不需要任何花哨的东西,我只需要检测所有(特定的,实际上,但是
问题内容: 我有一个id为“ content- area”的div,当用户在该div之外单击时,我想提醒他们他们在该div之外单击的事实。我将如何使用JavaScript解决此问题? 问题答案: 用纯Javascript 看看这个小提琴,看看这就是你所追求的!
问题内容: 我有一个HTML文档,该文档使用AJAX调用从PHP文件加载内容。我的代码的重要部分如下: default.html: “ content.php”中的文件是否有可能检测到是否已从“ default.html”或其他调用文档中对其进行了调用? 问题答案: jQuery和mooTools等最著名的Ajax框架都会添加一个特定的标头,您可以使用PHP进行检查:
问题内容: 如何在ASP.net应用程序的服务器端检测请求是否为AJAX请求(来自jQuery)。我不想这样做:mypage.aspx?this_is_ajax = true … 例如 在服务器端,当请求是ajax请求时,我想做某些事情… 谢谢! 问题答案: ASP.NET MVC对此做了很大的扩展,可以与JQuery一起使用。它以这种方式检查它: 检查核心集合: 检查标头集合(确保其不为null
问题内容: 我想使用jQuery来获取URL,并明确检查它是否响应302重定向,但 不 遵循重定向。 jQuery 似乎总是遵循重定向。如何防止这种情况,并且不遵循重定向就可以看到重定向? 标题有很多问题,例如“ jquery ajax redirect”,但它们似乎都涉及实现其他目标,而不仅仅是直接检查服务器给出的状态。 问题答案: AJAX请求永远不会有机会不遵循重定向(即,它必须遵循重定向)