7

Estoy trabajando en un complemento de navegador para Firefox, Safari, Chrome que interceptará datos en la página, lo ejecutará contra una expresión regular y luego, si coincide, volverá a formatearlo. Tengo este trabajo sobre la carga de la página usando:Recuperar y modificar el contenido de un XMLHttpRequest

var meth = { 
    replaceInElement : function(element, find, replace) { 
     // iterate over child nodes and replace 
    }, 
    run : function(evt){ 
    // doc is the document that triggered "run" event 
    if (!(evt.target.nodeName === "#document")) { return; } 
    var doc = evt.target; // document that triggered "onload" event 
    if (!(doc instanceof HTMLDocument)) { return; } 
    if (!doc.location) { return; } 

    // perform substitutions on the loaded document 
    var find = /regex/gi 

    meth.replaceInElement(doc.body, find, function(match) { 
     var new_content; 
     //do stuff 
     return new_content; 
    }); 

    //content.document.addEventListener('DOMNodeInserted', ezcall.node_inserted, false); 
    } 
} 

window.addEventListener("load", meth.run, false); 

Esto funciona para las páginas estáticas, pero para nada el uso de las llamadas ajax, falla. No puedo encontrar al oyente correcto o averiguar cómo interceptar el XMLHttpRequest.

He intentado oyentes de eventos similares para XMLHttpRequest sin suerte.

XMLHttpRequest.addEventListener('load', meth.run, false); 

Me gustaría interceptar la solicitud y modificar el contenido. O encuentre el objetivo que se actualizó y escanee después de que finalice la llamada ajax.

ACTUALIZACIÓN:

voy a aceptar una respuesta que dice que no se puede hacer, pero necesitaré algunos datos que explique por qué no se puede hacer.

Respuesta

10

Bastante sucio, pero creo que puede sobreescribir XMLHttpRequest.prototype.open si solo necesita esto para trabajar en FF y WebKit. Aquí hay una página de Demo.

(function() { 
    // save reference to the native method 
    var oldOpen = XMLHttpRequest.prototype.open; 
    // overwrite open with our own function 
    XMLHttpRequest.prototype.open = function(method, url, async, user, pass) { 
     // intercept readyState changes 
     this.addEventListener("readystatechange", function() { 
      // your code goes here... 
      console.log("Interception :) " + this.readyState); 
     }, false); 
     // finally call the original open method 
     oldOpen.call(this, method, url, async, user, pass); 
    }; 
})(); 

Después de esto, puede hacer cualquier cosa, supongo. Reemplace instance.readystatechange, reemplace instance.addEventListener, o escuche los eventos de mutación (aunque son deprecated).

+0

Tienes razón, bastante sucio, pero si lo peor que puedes decir es que funciona ... Voy a probar esto y ver qué puedo hacer para que suceda. –

+0

Gracias, funcionó bastante bien. ¡Aprecio el enfoque creativo! –

+0

@galambalazs ¡Agradable! Uso su código para agregar parámetros personalizados a la URL de la solicitud. También hice un pequeño cambio para proporcionar compatibilidad con IE: 'var XHR = typeof XMLHttpRequest! = 'Undefined'? XMLHttpRequest: ActiveXObject; XHR.prototype.open = ... '. Por favor, avíseme si me equivoco. – leaf

0

No creo que pueda hacer esto de manera general. Recuerde que las llamadas ajax pueden tener cualquier formato (html, xml, json, etc.) y luego el javascript que las inició puede hacer lo que quiera con los datos antes de insertarlos en el documento. Realmente no se puede controlar esto, a menos que lo esté haciendo para un caso específico en el que sepa qué buscar. O por pura fuerza bruta, donde realiza un seguimiento de los contenidos de la página y comprueba si algo ha cambiado en intervalos regulares.

1

No creo que usted puede hacer esto, e incluso si se pudiera, hay otros métodos para cargar contenido aysnc, como JSON-P

Otra opción es configurar una función que monitoriza el cuerpo elemento para cualquier nueva adición al DOM. No creo que este sea un evento de navegador nativo, por lo que tendrías que sondear usando setTimeout(). También tenga en cuenta que iterar sobre todos los elementos DOM puede llevar mucho tiempo. La siguiente página tiene algunos eventos que pueden ayudar: http://www.quirksmode.org/dom/events/index.html

+0

+1 para el recurso, y entiendo su punto, pero me voy a resistir a aceptarlo hasta que sepa con seguridad que no se puede hacer. –

Cuestiones relacionadas