在firefox中進行擴充有兩種方式,一種是extension,另外一種為plugin。
extension是firefox的附加組件,它可以改變firefox的現有功能和增加一些新功能,extension相對於plugin來說輕量級一些,它是通過javascript和XUL(XML的變相方式)來實現的。而plugin則是一個獨立的application,firefox通過特定的api介面進行相應的互動來擴充瀏覽器自身的功能,連結參考。
Firefox是mozilla核心,自身引擎主要是通過C語言實現,但是瀏覽器介面和其上的一系列操作卻又都是通過JS和XUL結合來實現的。因為extension是採用同樣的原理,所以可以看做其是FF在瀏覽器介面和小功能之上的天然延伸。
因為在extension中的擴充功能是通過js來實現的,而在瀏覽器載入的頁面中,我們很多時候都需要調用extension上的函數,以期使用extension上的功能,但是在web所在的document的scope中extension卻是不可見的,為了做到web page與extension之間的互動,firefox採用事件監聽的方式來完成這個功能。
首先在extension的js檔案中監聽特定的使用者DOM事件
function myListener(evt) { alert("Received from web page: " + evt.target.getAttribute("attribute1") + "/" + evt.target.getAttribute("attribute2")); }document.addEventListener("MyExtensionEvent", function(e) { myListener(e); }, false, true);// The last value is a Mozilla-specific value to indicate untrusted content is allowed to trigger the event.
然後在web page中分發相應的事件
var element = document.createElement("MyExtensionDataElement");element.setAttribute("attribute1", "foobar");element.setAttribute("attribute2", "hello world");document.documentElement.appendChild(element); var evt = document.createEvent("Events");evt.initEvent("MyExtensionEvent", true, false);element.dispatchEvent(evt);
通過這樣的方式就能在所有的web page中trigger extension中相應的功能了,完成了web page對extension的主動互動。