2009-08-20 24 views
7

Web tabanlı bir javascript/html uygulaması geliştirmekteyim.Firefox eklentisi ile sayfa javascript arasındaki iletişim

Sayfanın gerektirdiği tüm içeriği getirmek ve görüntülemek için uygulamanın sayfa javascript'i, sayfa yüklendikten hemen sonra birkaç XHR çağrısı gerçekleştirir.

DOM'u yoklamadan, uzantımın sayfanın başlatılma prosedürlerinin tamamlandığını bilmesinin bir yolu var mı?

cevap

11

İlginç bir soru aslında ..

Sadece MozillaZine en forumunda this post yoluyla bunu gerçekleştirmek için kolay bir çıkış yolu buldum. Bu teknik temel olarak web sayfasındaki özel bir DOM öğesini tanımlamak, bazı keyfi niteliklerle doldurmak ve ardından özel bir etkinliğin hedefi olarak kullanmaktan oluşur. Olay yakalanıp web sayfasından uzantıya değer aktarmak için kullanılabilir. önümüzdeki olayları kabul edeceğini belirten doc.addEventListener dördüncü parametresi vardır

function myListener(e) { 
    alert("data:" + e.target.getAttribute("application_state")); 
} 

function on_specialpage_load(event) { 
    if (event.originalTarget instanceof HTMLDocument && 
     event.originalTarget.location.href == "http://mywebsite.net/myspecialpage.html") { 

    var doc=event.originalTarget; 
    doc.addEventListener("MyExtensionEvent", myListener, false, true); 
    } 
} 
gBrowser.addEventListener("DOMContentLoaded",on_specialpage_load,false); 

Uyarı:

Web sayfası

<script type="text/javascript"> 
    $(document).ready(function(){ 

    $.get("http://mywebsite.net/ajax.php",function(data){ 
     //[...]process data 

     //define a custom element and append it to the document 

     var element = document.createElement("MyExtensionDataElement"); 
     element.setAttribute("application_state", "ready"); 
     document.documentElement.appendChild(element); 

     //create a custom event and dispatch it 
     // using the custom element as its target 

     var ev = document.createEvent("Events"); 
     ev.initEvent("MyExtensionEvent", true, false); 
     element.dispatchEvent(ev); 
    });    
    }); 
</script> 

Krom kodu (jquery kullanılabilir varsayar) güvenilmeyen koddan. Ancak bu etkinlik dinleyicisini seçici olarak ekleyebilirsiniz, böylece sitenizdeki yalnızca güvenilen sayfalar değerleri uzantıya geçirebilir.

+0

... ve gerçekten çok ilginç bir cevap. Özel etkinlik ve dinleyici tekniğiyle gerçekten çok ilgileniyorum. Bunun, sayfa javascript'in uzantıdaki bir işlevi "çağırması" için en iyi yol olacağını düşünüyor musunuz? Örneğin. siteler arası XHR'yi tıklama (kendi güvenilir uygulamanız ve alan adlarımda) uygulamak için. – Cheekysoft

+0

Bunun en iyi * yol olup olmadığından emin değilsiniz, ancak etkili ve oldukça güvenli görünüyor. Sadece dinleyiciye bir XHR harici bir siteye istek göndermeyi denedim ve işe yaradı! –

+0

Bu önerilen tekniktir, evet: . – Nickolay

1

Uzantınızdaki XMLHttpRequest nesnesine bağlanıp similar to what this GreaseMonkey script does (description) isteklerini izleyebilirsiniz. Onreadystatechange'a bir sarıcı ekleyin ve aynı zamanda, tamamlandığında uzantıyı bilgilendiren bir sarıcı ekleyin. Muhtemelen kendi sayfanızı ziyaret ederken bunu yaptığınızdan emin olmanızı sağlayan bir kod da isteyebilirsiniz.

Firebug, Net paneli için benzer şeyler yapıyor, bunun için codebase biraz daha korkutucu olsa da :) Firebug Lite watchXHR function'a da baktım, ancak bu kod işe yaramazsa benim için biraz fazla kurnazlık oluyor bana haber ver.

İlgili konular