检测双击 Firefox 扩展按钮
Detect double click in firefox extension button
我需要检测双击我的扩展按钮并打开另一个网站,我需要在当前选项卡中打开该网站。
index.js:
var buttons = require('sdk/ui/button/action');
var tabs = require("sdk/tabs");
var button = buttons.ActionButton({
id: "mozilla-link",
label: "Visit Mozilla",
icon: {
"16": "./icon-16.png",
"32": "./icon-32.png",
"64": "./icon-64.png"
},
onClick: handleClick
});
function handleClick(state) {
tabs.open("http://www.mozilla.org/");
}
ActionButton 本身没有 onDoubleClick
处理程序。所以,你需要做一些技巧来实现你想要的功能。
您可以为第一次点击指定一个处理程序,在这个处理程序中,您可以删除它自己并为双击定义一个新的处理程序,如下面的代码所示。
index.js:
var tabs = require("sdk/tabs");
var { ActionButton } = require("sdk/ui/button/action");
var { setTimeout } = require("sdk/timers");
var button = ActionButton({
id: "my-button",
label: "my button",
icon: {
"16": "./icon-16.png",
"32": "./icon-32.png",
"64": "./icon-64.png"
},
onClick: firstClick
});
function firstClick(state) {
button.removeListener("click", firstClick);
button.on("click", subsequentClicks);
tabs.activeTab.url = "http://www.mozilla.org/";
tabs.activeTab.reload();
setTimeout(function() {
console.log("remove double click after an interval");
button.removeListener("click", subsequentClicks);
button.on("click", firstClick);
}, 1000);
}
function subsequentClicks(state) {
button.removeListener("click", subsequentClicks);
tabs.activeTab.url = "http://www.google.com/";
tabs.activeTab.reload();
}
另一个技巧是在 firstClick
处理程序中定义了一个 setTimeout 函数,用于在间隔 1 秒后将事物恢复为第一次点击的初始状态。
为了确保subsequentClicks
执行时的功能性,它会自行revose为监听器。
如评论中所述,问题在于双击它时首先加载 mozilla.org 然后 google.com
我的一个扩展中有类似的要求。下面是我用来确定按钮点击是单次还是双次的代码:
var clickCnt = 0; // Click counter
var delay = 250; // Maximum time (milliseconds) between clicks to be considered a double-click
var timer;
chrome.browserAction.onClicked.addListener(function(tab){
clickCnt++;
if(clickCnt > 1){
// Double-click detected
chrome.tabs.executeScript({
code: '// Code to execute on double-click'
});
clickCnt = 0;
clearTimeout(timer)
}else{
timer = setTimeout(function(){
// No clicked detected within (delay)ms, so consider this a single click
chrome.tabs.executeScript({
code: '// Code to execute on single-click'
});
clickCnt = 0;
}, delay);
}
return true;
});
我需要检测双击我的扩展按钮并打开另一个网站,我需要在当前选项卡中打开该网站。
index.js:
var buttons = require('sdk/ui/button/action');
var tabs = require("sdk/tabs");
var button = buttons.ActionButton({
id: "mozilla-link",
label: "Visit Mozilla",
icon: {
"16": "./icon-16.png",
"32": "./icon-32.png",
"64": "./icon-64.png"
},
onClick: handleClick
});
function handleClick(state) {
tabs.open("http://www.mozilla.org/");
}
ActionButton 本身没有 onDoubleClick
处理程序。所以,你需要做一些技巧来实现你想要的功能。
您可以为第一次点击指定一个处理程序,在这个处理程序中,您可以删除它自己并为双击定义一个新的处理程序,如下面的代码所示。
index.js:
var tabs = require("sdk/tabs");
var { ActionButton } = require("sdk/ui/button/action");
var { setTimeout } = require("sdk/timers");
var button = ActionButton({
id: "my-button",
label: "my button",
icon: {
"16": "./icon-16.png",
"32": "./icon-32.png",
"64": "./icon-64.png"
},
onClick: firstClick
});
function firstClick(state) {
button.removeListener("click", firstClick);
button.on("click", subsequentClicks);
tabs.activeTab.url = "http://www.mozilla.org/";
tabs.activeTab.reload();
setTimeout(function() {
console.log("remove double click after an interval");
button.removeListener("click", subsequentClicks);
button.on("click", firstClick);
}, 1000);
}
function subsequentClicks(state) {
button.removeListener("click", subsequentClicks);
tabs.activeTab.url = "http://www.google.com/";
tabs.activeTab.reload();
}
另一个技巧是在 firstClick
处理程序中定义了一个 setTimeout 函数,用于在间隔 1 秒后将事物恢复为第一次点击的初始状态。
为了确保subsequentClicks
执行时的功能性,它会自行revose为监听器。
如评论中所述,问题在于双击它时首先加载 mozilla.org 然后 google.com
我的一个扩展中有类似的要求。下面是我用来确定按钮点击是单次还是双次的代码:
var clickCnt = 0; // Click counter
var delay = 250; // Maximum time (milliseconds) between clicks to be considered a double-click
var timer;
chrome.browserAction.onClicked.addListener(function(tab){
clickCnt++;
if(clickCnt > 1){
// Double-click detected
chrome.tabs.executeScript({
code: '// Code to execute on double-click'
});
clickCnt = 0;
clearTimeout(timer)
}else{
timer = setTimeout(function(){
// No clicked detected within (delay)ms, so consider this a single click
chrome.tabs.executeScript({
code: '// Code to execute on single-click'
});
clickCnt = 0;
}, delay);
}
return true;
});