firefox扩展和页面javascript之间的通信

firefox扩展和页面javascript之间的通信,javascript,firefox,firefox-addon,Javascript,Firefox,Firefox Addon,我正在开发一个基于web的javascript/html应用程序,它有一个姊妹的firefox扩展 应用程序的页面javascript在页面加载后立即执行一些XHR调用,以便引入并显示页面所需的所有内容 有没有一种方法,在不轮询DOM的情况下,我的扩展可以知道页面的初始化过程已经完成?您可以从扩展钩住XMLHttpRequest对象并监视请求,()。向onreadystatechange添加一个包装,就像他向open添加了一个包装一样,完成后会通知扩展。可能还需要一些代码,确保您只在访问自己的页

我正在开发一个基于web的javascript/html应用程序,它有一个姊妹的firefox扩展

应用程序的页面javascript在页面加载后立即执行一些XHR调用,以便引入并显示页面所需的所有内容


有没有一种方法,在不轮询DOM的情况下,我的扩展可以知道页面的初始化过程已经完成?

您可以从扩展钩住XMLHttpRequest对象并监视请求,()。向onreadystatechange添加一个包装,就像他向open添加了一个包装一样,完成后会通知扩展。可能还需要一些代码,确保您只在访问自己的页面时才这样做


Firebug的网络面板也有类似的功能,但其代码库有点吓人:)我也看过了,但那个代码对我来说太狡猾了,如果你能解决的话,请告诉我。

确实是个有趣的问题

我刚刚在MozillaZine的论坛上发现了一个实现这一点的简单方法。该技术主要包括在web页面中定义自定义DOM元素,用一些任意属性填充它,然后将其用作自定义事件的目标。事件可以被捕获,并用于将值从网页传递到扩展

网页(假设jquery可用)


请注意,doc.addEventListener有第四个参数,表示它将接受来自不受信任代码的事件。但是,您可以有选择地添加此事件侦听器,以便只有来自您站点的受信任页面才能向扩展传递值。

。。。一个非常有趣的答案。我对自定义事件和侦听器技术非常感兴趣。您认为这是页面javascript能够“调用”扩展中的函数的最佳方式吗。e、 g.在点击时实现跨站点XHR(在我自己受信任的应用程序和域内)。不确定这是否是最好的方法,但它似乎是高效且相当安全的。我刚刚尝试将一个对外部站点的XHR请求封装到侦听器中,效果很好!这是推荐的技术,是:。
<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>
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);