Me gustaría saber si es posible "enganchar" en cada solicitud AJAX (ya sea a punto de ser enviado o en eventos) y realizar una acción . En este punto, supongo que hay otros scripts de terceros en la página. Algunos de estos pueden usar jQuery, mientras que otros no. es posible?Agregue un "gancho" a todas las solicitudes AJAX en una página
Respuesta
Inspirado por aviv's answer, investigué un poco y esto es lo que se me ocurrió.
No estoy seguro de que sea tan útil según los comentarios en el script y, por supuesto, solo funcionará para navegadores que usen un objeto nativo XMLHttpRequest.
Creo que funcionará si las bibliotecas de JavaScript están en uso, ya que usarán el objeto nativo si es posible.
function addXMLRequestCallback(callback){
var oldSend, i;
if(XMLHttpRequest.callbacks) {
// we've already overridden send() so just add the callback
XMLHttpRequest.callbacks.push(callback);
} else {
// create a callback queue
XMLHttpRequest.callbacks = [callback];
// store the native send()
oldSend = XMLHttpRequest.prototype.send;
// override the native send()
XMLHttpRequest.prototype.send = function(){
// process the callback queue
// the xhr instance is passed into each callback but seems pretty useless
// you can't tell what its destination is or call abort() without an error
// so only really good for logging that a request has happened
// I could be wrong, I hope so...
// EDIT: I suppose you could override the onreadystatechange handler though
for(i = 0; i < XMLHttpRequest.callbacks.length; i++) {
XMLHttpRequest.callbacks[i](this);
}
// call the native send()
oldSend.apply(this, arguments);
}
}
}
// e.g.
addXMLRequestCallback(function(xhr) {
console.log(xhr.responseText); // (an empty string)
});
addXMLRequestCallback(function(xhr) {
console.dir(xhr); // have a look if there is anything useful here
});
Creativo. Los trucos de JS salvaron el día una vez más. –
sería bueno ampliar esta respuesta para admitir los enganches posteriores a la solicitud –
Basado en su implementación, ¡he publicado algo en NPM que funciona tanto con solicitudes como con respuestas! https: // github.com/slorber/ajax-interceptor –
Hay un truco para hacerlo.
Antes de ejecutar todos los scripts, tome el objeto original XHMHttpReuqest y guárdelo en una var diferente. A continuación, anule la XMLHttpRequest original y dirija todas las llamadas a través de su propio objeto.
Psuedo código:
var savd = XMLHttpRequest;
XMLHttpRequest.prototype = function() {
this.init = function() {
}; // your code
etc' etc'
};
Esta respuesta no es del todo correcta, si cambia el prototipo de un objeto, incluso el guardado será cambiado. Además, el prototipo completo se reemplaza con una función que romperá todas las solicitudes de Ajax. Sin embargo, me inspiró a ofrecer una respuesta. – meouw
Ya que mencionas jQuery, sé jQuery ofrece un método .ajaxSetup()
que establece opciones ajax globales que incluyen el evento desencadena como success
, error
, y beforeSend
- que es lo que suena como lo Estás buscando.
$.ajaxSetup({
beforeSend: function() {
//do stuff before request fires
}
});
por supuesto que se necesita para verificar la disponibilidad de jQuery en cualquier página intenta utilizar esta solución sucesivamente.
Gracias por la sugerencia, pero lamentablemente esto no intercepta las llamadas AJAX que no se realizan con AJAX. – Yuliy
... lea su comentario .... – jondavidjohn
En las noticias de hoy: Unicornios asesinados por llamadas AJAX que no están usando AJAX – Dashu
Además de de meouw respuesta, tuvo que inyectar código en un marco flotante que intercepta llamadas XHR, y se utiliza la respuesta anterior. Sin embargo, he tenido que cambiar
XMLHttpRequest.prototype.send = function(){
Para:
XMLHttpRequest.prototype.send = function(arguments)
Y tuve que cambiar
oldSend.apply(this, arguments);
Para:
oldSend.call(this, arguments);
Esto era necesario para que funcione en IE9 con IE8 documento m oda. Si no se realizó esta modificación, algunos call-backs generados por el marco de componentes (Visual WebGUI) no funcionaron. Más información en estos enlaces:
Sin estas modificaciones devoluciones de datos AJAX no terminan.
jquery ...
<script>
$(document).ajaxSuccess(
function(event, xhr, settings){
alert(xhr.responseText);
}
);
</script>
jQuery no captará las solicitudes realizadas utilizando otras bibliotecas. Por ejemplo ExtJS. Si solo está utilizando jQuery, es una buena respuesta. De lo contrario, no funcionará todo el tiempo. – npiani
ni siquiera captará las solicitudes de jquery si la instancia de jquery es diferente. Cambio en protype si es necesario –
Usando la respuesta de "meouw" Es mejor utilizar la siguiente solución si desea ver los resultados de la solicitud
function addXMLRequestCallback(callback) {
var oldSend, i;
if(XMLHttpRequest.callbacks) {
// we've already overridden send() so just add the callback
XMLHttpRequest.callbacks.push(callback);
} else {
// create a callback queue
XMLHttpRequest.callbacks = [callback];
// store the native send()
oldSend = XMLHttpRequest.prototype.send;
// override the native send()
XMLHttpRequest.prototype.send = function() {
// call the native send()
oldSend.apply(this, arguments);
this.onreadystatechange = function (progress) {
for(i = 0; i < XMLHttpRequest.callbacks.length; i++) {
XMLHttpRequest.callbacks[i](progress);
}
};
}
}
}
addXMLRequestCallback(function(progress) {
if (typeof progress.srcElement.responseText != 'undefined' && progress.srcElement.responseText != '') {
console.log(progress.srcElement.responseText.length);
}
});
Si usted no tiene que soportar < = IE8 que puede hacer esto que interceptará genéricamente cualquier AJAX a nivel mundial y no estropeará las devoluciones de llamadas, etc. que tal vez hayan sido asignadas por bibliotecas de terceros de AJAX. La respuesta aceptada no produce la respuesta real porque se llama demasiado pronto.
(function() {
var origOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function() {
console.log('request started!');
this.addEventListener('load', function() {
console.log('request completed!');
console.log(this.readyState); //will always be 4 (ajax is completed successfully)
console.log(this.responseText); //whatever the response was
});
origOpen.apply(this, arguments);
};
})();
Algunos documentos más de lo que puede hacer aquí con la API de addEventListener aquí:
¡Gracias! Eso funciona a la perfección. Solo modifico un poco: 'this.status' devuelve el estado del servidor en este caso' 200' si la solicitud es correcta, 404 si el elemento no se encontró, 500, etc. Admite el código, funciona perfectamente. – MrMins
Esto puede sentirse viejo pero mereces todo el amor por esto. Estaba profundamente atrapado. Gracias un montón. –
Simplemente porque he buscado un poco para esto. El evento '" load "' solo se ejecuta en caso de éxito. Si no le importa el resultado (solo que la consulta finalizó) puede usar el evento '" loadend '' –
he encontrado una buena biblioteca en Github que hace bien el trabajo, usted tiene que incluir antes de cualquier otro archivo js
https://github.com/jpillora/xhook
aquí es un ejemplo que añade una cabecera HTTP a cualquier incom ing respuesta
xhook.after(function(request, response) {
response.headers['Foo'] = 'Bar';
});
¡Excelente! ¡Pero no funcionó en la aplicación Cordova, incluso con un último complemento crosswalk web-view de crosswalk! –
Esto funcionó perfectamente para mis necesidades particulares: en Wordpress, filtrado de eventos desde el plugin de Events Organizer calendario completo –
Ajax-hook es un lib de código abierto para enganchar objeto XMLHttpRequest global y cambiar la petición Ajax por defecto y la respuesta. GitHub: https://github.com/wendux/Ajax-hook, por ejemplo:
hookAjax({
//hook callbacks
onreadystatechange:function(xhr){
console.log("onreadystatechange called: %O",xhr)
},
onload:function(xhr){
console.log("onload called: %O",xhr)
},
//hook function
open:function(arg,xhr){
console.log("open called: method:%s,url:%s,async:%s",arg[0],arg[1],arg[2])
}
})
- 1. IIS: ¿Redirige TODAS las solicitudes a una página?
- 2. Interceptar todas las solicitudes provenientes de una página web
- 3. captar todas las solicitudes de ajax en jquery
- 4. Anular todas las solicitudes de jQuery AJAX globalmente
- 5. jQuery abandona todas las solicitudes pendientes de AJAX
- 6. Cómo capturar todas las solicitudes realizadas por página en webdriver? ¿Hay alguna alternativa a Browsermob?
- 7. Seguridad de las solicitudes AJAX
- 8. ¿es mejor o agrupar mis solicitudes de AJAX o enviar todas las solicitudes por separado?
- 9. ASP.NET MVC HTML.AntiForgeryToken() con múltiples solicitudes AJAX desde una página
- 10. Firebug no muestra las solicitudes ajax
- 11. htaccess: redirige todas las solicitudes a diferentes dominios
- 12. Ajax usando https en una página http
- 13. Cancelar las solicitudes AJAX en vuelo utilizando Jquery .ajax?
- 14. Reencaminando todas las solicitudes php a través de index.php
- 15. ¿Cómo se muestran las solicitudes de Ajax en la URL?
- 16. Asegurar las solicitudes AJAX a través de GUID
- 17. Agregue el atributo 'HttpOnly' a todas las cookies de sesión
- 18. ¿Cómo puedo crear una ruta de Rails 3 que coincida con todas las solicitudes y dirija a un recurso/página?
- 19. JMeter - ¿Cómo se agrupan todas las solicitudes relacionadas con una página para proporcionar resultados más limpios?
- 20. Ejecutar la función después de que todas las solicitudes ajax .load() hayan finalizado
- 21. Does Application_Start bloquea todas las solicitudes entrantes
- 22. Al agregar un manifiesto HTML5 todas mis solicitudes jQuery (móvil) AJAX fallan con el estado 0
- 23. Servicio de solicitudes AJAX con webmethod en la página ASPX
- 24. Protección CSRF en solicitudes AJAX usando MVC2
- 25. IE alternativa a window.stop() (cancelar todas las solicitudes pendientes)
- 26. CORS in grails: ¿fallan todas las solicitudes?
- 27. En la página 'www.foo.com', ¿puede un script cargado desde 'www.example.com' enviar solicitudes ajax a 'www.example.com'?
- 28. Filtro de servlet para todas las solicitudes
- 29. URL relativas en solicitudes AJAX
- 30. Distingue las solicitudes ajax de las solicitudes completas en el validador personalizado JSF
Es posible con jQuery, por lo que es posible con el viejo Javascript simple, pero que tendría que tener por lo menos 2 "ganchos" para cada uno de ellos. De todos modos, ¿por qué usar ambos en la misma página? – yoda
¿Qué le parece usar esta biblioteca? https://github.com/slorber/ajax-interceptor –
Esta es una buena solución: http://stackoverflow.com/questions/25335648/how-to-intercept-all-ajax-requests-made-by-different- js-libraries – phazei