簡體   English   中英

firefox擴展和頁面javascript之間的通信

[英]Communication between firefox extension and page javascript

我正在開發一個基於網絡的javascript / html應用程序與一個姐妹firefox擴展。

應用程序的page-javascript在頁面加載后立即執行一些XHR調用,以便引入並顯示頁面所需的所有內容。

有沒有辦法在沒有輪詢DOM的情況下,我的擴展程序可以知道頁面的初始化過程是否完整?

有趣的問題確實..

我剛剛在MozillaZine論壇上通過這篇文章找到了一個簡單的方法來實現這個目標。 該技術基本上包括在網頁中定義自定義DOM元素,用一些任意屬性填充它,然后將其用作自定義事件的目標。 可以捕獲事件並將其用於將值從網頁傳遞到擴展名。

網頁 (假設jquery可用)

<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>

Chrome代碼:

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

請注意,doc.addEventListener有第四個參數,表示它將接受來自不受信任代碼的事件。 但是,您可以有選擇地添加此事件偵聽器,以便只有您站點中的受信任頁面才能將值傳遞給擴展。

您可以從擴展中掛接XMLHttpRequest對象並監視請求, 類似於GreaseMonkey腳本所做的描述 )。 添加一個包裝器到onreadystatechange,就像他添加一個打開的包裝器一樣,在完成時通知擴展。 可能還需要一些代碼,以確保您在訪問自己的頁面時只執行此操作。

Firebug為它的Net面板做了類似的事情,雖然它的代碼庫有點令人生畏:)我還看了一下Firebug Lite watchXHR函數 ,但是如果你可以解決的話,那段代碼對我來說太狡猾了讓我知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM