firefox监听tab的关闭事件

我之前有提过这个问题:http://www.oschina.net/question/113421_229068

一直没有找到满意的答案,今天终于通过add on解决了》

可以使用onbeforeunload/onunload方法但是有局限性,比如当用户点击back/forward/refresh以及在address bar中输入其它url都会触发该事件,解决办法在这里:
http://eureka.ykyuen.info/2011/02/22/jquery-javascript-capture-the-browser-or-tab-closed-event/


后来我尝试使用Firefox addon来解决。。。。。。。。。。。。

最终add-on的代码如下lib/main.js

var tabs = require("sdk/tabs");
var self = require("sdk/self");
var pageMod = require("sdk/page-mod");

//当前已经打开的tab数
var openTabs = 0;
//要监听的URL关键字
var monitorURL = "oschina";

//contentScript在每次页面打开时被执行。下面是往页面中的window注入一个全局变量
//在页面中可以检测这个注入的变量是否存在,如果存在,则该网页成功被add-on注入了js变量。
pageMod.PageMod({
	include : new RegExp(".*" + monitorURL + ".*"),
	// contentScriptFile:[self.data.url("my-script.js")]
	contentScript : 'unsafeWindow.pageScriptObject.version = "' + self.version + '"'
});

//当任意tab的URL地址栏变化时触发(刷新的时候也会触发)
tabs.on("ready", function(currentTab) {
	console.log("Ready: currentTab=", currentTab.url);
	var openTabs = 0;
	//遍历所有的tab页面,只找出感兴趣的地址
	for (let tab of tabs) {
		if (tab.url.indexOf(monitorURL) != -1) {
			openTabs++;
			// force close newly opened tab if we already open it.
			if (openTabs == 2) {
				currentTab.close();
			}
		}
	}
});

//以下是监听tab页的关闭事件。没用上.
/*
 * tabs.on("close", function(tab){ if(tab.url.indexOf(monitorURL) != -1){
 * openTabs--; console.log("openTabs=", openTabs); } });
 */


页面上检测add-on是否安装的代码如下:

//在页面中定义一个全局变量(add-on在加载后会自动修改这个变量的内容)
window.pageScriptObject = {"version" : "0"};
//期望的add on版本。
var requiredVersion = '1.0';

 $(document).ready(function(){
	 
	var intervalListener = self.setInterval(function() {
		checkAddOn();
	}, 1000);
	
	//尝试检测的次数
	var times = 0;
	//实际安装的add-on版本号
	var installedVersion;
	
	function checkAddOn (){
		 times++;
		 console.log("checking addon: ", times);
		 
		 installedVersion = window.pageScriptObject.version;
		 if (installedVersion > 0  || times > 3) {
			 	
		        window.clearInterval(intervalListener);
			 	
		        if(times > 3) {
			 		console.log("Tried 3 times, addon not detected.")
			 		//go to error page here.
			 		alert("Firefox Add-on not detected, click OK to install the latest Add-on.");
			 		window.location= "/path/to/my-addon.xpi";
			 	} else {
			 		//addon installed. pass.
			 		console.log("Addon version:", installedVersion);
			 		
			 		var comparedResult = versionCompare(installedVersion, requiredVersion);
	   	    		if(comparedResult < 0 ){
	   	    			alert("Your Add-on is not the latest, click OK to install the latest Add-on.");
	   	    			window.location= "/path/to/my-addon.xpi";
	   	    		} else {
	   	    			console.log("You have the required addon installed.")
	   	    		}
			 	}
		 }
   	}
});



教程如下:

https://developer.mozilla.org/en-US/Add-ons/SDK/Tutorials/Installation 
https://developer.mozilla.org/en-US/Add-ons/SDK/Tutorials/Getting_started

关于tabs的API用法如下:
https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/tabs 
https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/page-mod

怎么让add on 访问 dom(从Firefox30开始)
https://blog.mozilla.org/addons/2014/04/10/changes-to-unsafewindow-for-the-add-on-sdk/

##如何取得当前Add-on的版本号
http://stackoverflow.com/questions/28369513/how-can-i-get-the-firefox-add-on-version-number

其它:
http://stackoverflow.com/questions/24626156/how-to-access-dom-in-firefox-addon-script
http://stackoverflow.com/questions/24573345/accessing-to-dom-functions-from-firefox-extenstion
https://developer.mozilla.org/en-US/Add-ons/SDK/Tutorials/Modifying_Web_Pages_Based_on_URL
https://developer.mozilla.org/en-US/Add-ons/SDK/Tutorials

####firefox add-ons不能直接访问dom(可以),写extensions则没有任何限制:

https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/Tutorial

###20150710新增
https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/package_json
https://developer.mozilla.org/en-US/Add-ons/SDK/Guides
https://developer.mozilla.org/en-US/Add-ons/SDK/Guides/Two_Types_of_Scripts
https://developer.mozilla.org/en-US/Add-ons/SDK/Guides/Content_Scripts/Communicating_With_Other_Scripts|
这里有好多例子!!!

https://github.com/mdn/addon-sdk-content-scripts

###20150727解决bug,,代码在firefox38可用firefox31报错:
https://blog.mozilla.org/addons/2014/04/10/changes-to-unsafewindow-for-the-add-on-sdk/

相关的不兼容的代码:
```js
console.log("Got duplicate tab, alerting error message.")
        
        //duplicates!!!
        var worker = currentTab.attach({
            // before close, show user some pop-up message.
            // note that we must use \\n here to indicate a new line.
            contentScript: 'unsafeWindow.document.write("");unsafeWindow.alert("Only on....");self.port.emit("doClose");'
        });
        worker.port.on("doClose", function(message) {
            console.log("I am closing duplicate tab.")
            currentTab.close();
        })

```

报错信息如下:

DOMException
  - prototype DOMExceptionPrototype
    - ABORT_ERR = 20
    - DATA_CLONE_ERR = 25
    - DOMSTRING_SIZE_ERR = 2
    - HIERARCHY_REQUEST_ERR = 3
    - INDEX_SIZE_ERR = 1
    - INUSE_ATTRIBUTE_ERR = 10
    - INVALID_ACCESS_ERR = 15
    - INVALID_CHARACTER_ERR = 5
    - INVALID_MODIFICATION_ERR = 13
    - INVALID_NODE_TYPE_ERR = 24
    - INVALID_STATE_ERR = 11
    - NAMESPACE_ERR = 14
    - NETWORK_ERR = 19
    - NOT_FOUND_ERR = 8
    - NOT_SUPPORTED_ERR = 9
    - NO_DATA_ALLOWED_ERR = 6
    - NO_MODIFICATION_ALLOWED_ERR = 7
    - QUOTA_EXCEEDED_ERR = 22
    - SECURITY_ERR = 18
    - SYNTAX_ERR = 12
    - TIMEOUT_ERR = 23
    - TYPE_MISMATCH_ERR = 17
    - URL_MISMATCH_ERR = 21
    - VALIDATION_ERR = 16
    - WRONG_DOCUMENT_ERR = 4
    - code = 18
    - columnNumber = 0
    - data = null
    - filename =
    - inner = null
    - lineNumber = 0
    - location = {"language":0,"languageName":"C++","filename":null,"name":null,"lineNumber":0,"sourceLine":"","caller":null}
    - message = The operation is insecure.
    - name = SecurityError
    - result = 2152923154
  - prototype Object
JavaScript error: http://www.bing.com/Passport.aspx?popup=1, line 3: Permission denied to access property 'sj_evt'

###cfx的下载地址已经被替换成jpm了

不过这里还能找到下载地址:https://blog.mozilla.org/addons/2014/08/19/announcing-add-on-sdk-1-17/

转载于:https://my.oschina.net/uniquejava/blog/470443

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值