7

içeriğinin geri alınması ve değiştirilmesi Firefox, Safari, Chrome için bir tarayıcı eklentisi üzerinde çalışıyorum; bu sayfadaki verileri engeller, bir normal ifadeye göre çalıştırır ve eşleşirse - yeniden biçimlendirir. Bu ajax çağrıları kullanılarak statik sayfalar için çalışan, ancak herhangi bir şey için olduğuBir 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); 

, başarısız: Ben kullanarak sayfa yük bu çalışma var. Doğru dinleyiciyi bulamıyorum veya XMLHttpRequest'in nasıl engelleneceğini anlayamıyorum.

XMLHttpRequest için hiç şansı olmayan benzer etkinlik dinleyicilerini denedim.

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

Bu isteği engellemek ve içeriği değiştirmek istiyorum. Veya güncellenen hedefi bulun ve ajax çağrısı bittikten sonra tarayın.

GÜNCELLEME:

Ben yapılamaz diyor bir cevap kabul eder, ama yapılamaz neden olarak bazı destekleyici veri gerekir.

cevap

10

Daha ziyade FF ve WebKit üzerinde çalışmak için buna ihtiyacınız varsa, XMLHttpRequest.prototype.open'un üzerine yazabilirsiniz. İşte bir Demo sayfadır.

(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); 
    }; 
})(); 

Bundan sonra tahmin edebileceğiniz bir şey yapabilirsiniz. instance.readystatechange'u değiştirin, instance.addEventListener'u değiştirin veya mutasyon olaylarını dinleyin (bunlar deprecated olmasına rağmen). Kaynak için

+0

Haklısınız, oldukça kirli - ama söyleyebileceğiniz en kötü şey işe yarayacaksa ... Bunu test edip neler yapabileceğimi göreceğim. –

+0

Teşekkürler, oldukça iyi çalıştı - Yaratıcı yaklaşımı takdir ediyorum! –

+0

@galambalazs Nice! İsteğinizi isteğin URL'sine özel param eklemek için kullanırım. Ayrıca IE uyumluluğu sağlamak için küçük bir değişiklik yaptım: 'var XHR = typeof XMLHttpRequest! = 'Undefined'? XMLHttpRequest: ActiveXObject; XHR.prototype.open = ... '. Yanılıyorsam lütfen bana bildirin. – leaf

0

Bunu genel olarak yapabileceğinizi düşünmüyorum. Ajax çağrılarının herhangi bir formatta (html, xml, json, vb.) Olabileceğini unutmayın ve daha sonra bunları başlatan javascript, belgeye yerleştirmeden önce verilere istediklerini yapabilir. Ne arayacağınızı bildiğiniz belirli bir durum için yapmadığınız sürece bunu gerçekten izleyemezsiniz. Ya da sayfanın içeriğini takip ettiğiniz ve düzenli aralıklarla herhangi bir şeyin değişip değişmediğini kontrol ettiğiniz saf kaba kuvvet.

1

bile gelse böyle JSON-P olarak yükleme aysnc içeriği için başka yöntemler vardır, bunu düşünmek ve yok Başka bir seçenek gövdesini izleyen bir işlev kurmaktır

DOM'a yeni eklemeler için öğe. Bunun yerel bir tarayıcı olayı olduğunu düşünmüyorum, bu yüzden setTimeout() kullanarak anket yapmak zorunda kalacaksınız. Ayrıca, tüm DOM öğelerini yinelemek zaman alıcı olabilir. Aşağıdaki sayfada, yardımcı olabilecek bazı olaylar var: http://www.quirksmode.org/dom/events/index.html

+0

+1, ve ben sizin için bir noktaya varıyorum - ama bunu yapamayacağından emin olana kadar kabul etmeye direneceğim. –

İlgili konular