切换谷歌chrome扩展多次
Toggle a google chrome extension multiple times
所以我有一个我的谷歌chrome扩展,当点击它附加事件监听器到页面上的所有元素,并插入CSS (loll .js和style.css)。
当我再次点击图标时,图标改变了,但我也希望JS和CSS被删除。我似乎移不掉它们。现在我要分离事件监听器
当然,我想当你再次点击扩展图标,添加所有的JS和CSS回来。这可能吗?
我现在是这样设置的:
background.js
var toggle = false;
chrome.browserAction.onClicked.addListener(function(tab) {
toggle = !toggle;
if(toggle){
chrome.browserAction.setIcon({path: "on.png", tabId:tab.id});
chrome.tabs.executeScript(null, { file: "jquery.js" }, function() {
chrome.tabs.executeScript(null, { file: "lol.js" }, function() {
})
});
chrome.tabs.insertCSS(tab.id, {
file: "style.css"
});
} else {
chrome.browserAction.setIcon({path: "off.png", tabId:tab.id});
chrome.tabs.executeScript(null, { file: "jquery.js" }, function() {
chrome.tabs.executeScript(null, { file: "undo.js" }, function() {
})
});
}
});
lol_js (主js)
var $body = $('body');
$body.append('<div class="the_result_one"></div>');
$body.addClass('steves_sweet_ext');
var clearIt = false;
function myClick(e) {
$('.active_result_class').removeClass('active_result_class');
if (clearIt) {
$('.the_result_one').html('');
$('.the_active_class').removeClass('the_active_class');
}
if ($(this).hasClass('hover-it')) {
e.preventDefault();
$(this).removeClass('hover-it');
} else {
$(this).addClass('hover-it');
}
e.stopPropagation();
var target_elem = $(e.target);
target_elem.addClass('the_active_class');
if ($('.the_active_class').length == 2) {
var first_one = $('.the_active_class:first');
var second_one = $('.the_active_class:last');
$('.the_result_one').addClass('active_result_class');
$('.the_result_one').html(calcPos(first_one, second_one));
$('.the_active_class').removeClass('the_active_class');
clearIt = true;
} else {
clearIt = false;
}
}
function myMouseover(e) {
var target_elem = $(e.target);
target_elem.addClass('hover-it');
}
function myMouseout(e) {
var target_elem = $(e.target);
target_elem.removeClass('hover-it');
}
$('.steves_sweet_ext').on('click', '*', myClick);
$('.steves_sweet_ext').on('mouseover', '*', myMouseover);
$('.steves_sweet_ext').on('mouseout', '*', myMouseout);
undo.js(尝试撤销llo .js事件监听器)
$('.steves_sweet_ext').off('click', '*', myClick);
$('.steves_sweet_ext').off('mouseover', '*', myMouseover);
$('.steves_sweet_ext').off('mouseout', '*', myMouseout);
在lol.js
中添加的函数存在于该脚本自己的沙盒中,并且在undo.js
中不可见,因此您无法注销它们。
使用消息传递来切换lol.js
:
-
llo .js,添加监听器:
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { if ("toggle" in message) { var target = $('.steves_sweet_ext'); var onOff = message.toggle ? "on" : "off"; target[onOff]('click', '*', myClick); target[onOff]('mouseover', '*', myMouseover); target[onOff]('mouseout', '*', myMouseout); } });
-
background.js
var toggle = {}; // each tab has its own state chrome.browserAction.onClicked.addListener(function(tab) { var state = !toggle[tab.id]; chrome.browserAction.setIcon({path: state ? "on.png" : "off.png", tabId:tab.id}); if (tab.id in toggle) { // {frameId: 0} will throw on Chrome prior to v41 try { chrome.tabs.sendMessage(tab.id, {toggle: state}, {frameId: 0}) } catch(e) { chrome.tabs.sendMessage(tab.id, {toggle: state}) } } else { // tabId param is optional, thus omitted chrome.tabs.insertCSS({file: "style.css"}); chrome.tabs.executeScript({file: "jquery.js" }, function() { chrome.tabs.executeScript({file: "lol.js" }, function() { }); }); } toggle[tab.id] = state; });
至于CSS,样式表是在内部注入的,而不是在document.styleSheets
中,所以没有办法"切换"它,但有变通办法:
-
在
style.css
的所有选择器前加上一些自定义类:body.someclass .selector
和在lol.js
中简单地切换主体类(确保名称是唯一的):document.body.classList.toggle("someclass", message.toggle)
-
加载
style.css
的内容,并把它放到一个<style id="someid">
元素,你可以切换(确保id是唯一的):document.getElementById("someid").disabled = !message.toggle;
相关文章:
- chrome扩展中的navigator.geolocation.getCurrentPosition
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- chrome扩展更改主机/域警告
- 如何在chrome扩展中重定向到html页面
- Chrome扩展没有't在重新加载之前考虑期权价值
- 如何通过自己获得Chrome扩展的用户反馈/错误报告
- 试图阻止Chrome通过扩展关闭
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- 从选项页面更新chrome扩展清单权限
- 如何将chrome扩展功能移植到移动设备(特别是jquery和trello)
- Chrome扩展:遍历不同的页面并收集数据
- Chrome扩展 chrome.storage 如何同时进行大量获取和设置并避免竞争条件
- Chrome扩展:Chrome.tabs.executeScript不工作
- 中的访问扩展chrome://extensions页
- 如何在扩展Chrome DevTool时检索请求的启动器
- Chrome扩展-Chrome报警API为创建的每个新报警重新安排所有报警
- 是否有任何方法来扩展chrome's __commandLineAPI
- 谷歌Chrome扩展Chrome .tab . onupdate . addlistener
- 创建在页面上注入脚本的扩展chrome内容
- Chrome扩展:Chrome扩展中未定义的变量,即使它存在于控制台中