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