Bien, básicamente quiero tener un poco de javascript en una página que de alguna manera adjunte algún tipo de oyente de eventos globales que pueda detectar y hacer algo si se realiza una solicitud ajax (sin llamar directamente desde el llamada), independientemente de cómo se realice la llamada ajax.JavaScript detectar un evento AJAX
Descubrí cómo hacer esto con jquery - si la solicitud de ajax se está haciendo por jquery. He aquí un ejemplo de código para esto:
$.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"
}
);
Con este código, independientemente de dónde/cómo me llamo $ .post (..), el detector de eventos mundial se disparará. También funciona si uso $ .get o $ .ajax (cualquier método jquery ajax), independientemente de cómo/cuándo lo llamo (adjunto como un clic, en la carga de la página, lo que sea).
Sin embargo, deseo poder ampliar este detector para que se active independientemente de qué marco de js se utilice, o incluso si no se utiliza el marco. Así por ejemplo, si yo fuera a también incluir en una página el siguiente código (genérico código de ajax de w3schools):
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();
}
Y luego tengo en algún enlace al azar una llamada onclick a esa función, mi el oyente global de eventos ajax debería poder también detectar esta solicitud. Bueno, agregué ese código a mi página y lo adjunté al clic en un enlace aleatorio (sí, el código en sí funciona), pero el código "detector de eventos globales" de jquery anterior no detectó esa llamada.
Hice algo más de excavación y sé que básicamente puedo guardar el objeto en un objeto temporal y sobrescribir el objeto actual con un objeto "envoltorio" que llamará a una función específica y luego llamará a la función temporal, pero esto me requiere saber de antemano el objeto original que se está creando/usando. Pero no siempre sabré eso antes de tiempo ...
Entonces ... ¿es esto posible? ¿Hay alguna manera de detectar que se haya realizado una solicitud de ajax get/post, independientemente de si se realizó con un objeto genérico o desde xyz framework? ¿O voy a tener que hacer un código duplicado para manejar cada marco y también saber de antemano los objetos ajax que se están creando/usando?
edición:
me olvidó mencionar que no es suficiente para detectar que una petición se produjo. También necesito capturar los datos que se envían en la solicitud. El enlace proporcionado en los comentarios a continuación ayudará a determinar si se realizó una solicitud "a", pero no a enviar los datos. PD. - La respuesta proporcionada en el siguiente enlace no es muy clara, al menos para mí de todos modos.
posible duplicado de [ Averiguar cuándo se realizó una solicitud XMLHttpRequest sin devoluciones de llamada] (http://stackoverflow.com/questions/2255248/figuring-out-when-a-xmlhttprequest-request-was-made-without-callbacks) –
¡Gracias por el enlace! Esta pregunta no es del todo así, porque también necesitaba poder capturar los datos que se envían en la solicitud (que supongo que no incluí ni edité). Sin embargo, ME HIZO ponerme en el camino correcto y creo que encontré una solución, que se publicará cuando la prueba esté completa. ¡Gracias! –
Creo que lo que está buscando es en esta cuestión sobre la manipulación del prototipo, pero de una mejor manera https://stackoverflow.com/q/20689481/3462483 – doz87