我刚开始学习如何做的扩展......浏览器扩展程序弹出注入的JavaScript不止一次
我想它,以便弹出第一次打开时,它的JavaScript注入到活动选项卡。弹出窗口中还有一些按钮与注入的JavaScript进行交互。
我遇到的问题是每次打开弹出窗口时,都会将JavaScript注入到活动选项卡中。每发生一次,所有保存的变量都会重置。所以,我最终做出了一个全局变量来解决这个问题。
下面是代码的样本,我使用:
popup.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My Extension</title>
<link href="popup.css" rel="stylesheet">
<script src="popup.js"></script>
</head>
<body>
<div class="controls">
<div class="action1">action 1</div>
<div class="action2">action 2</div>
</div>
</body>
</html>
popup.js
var command = {
action1 : function(){
chrome.tabs.executeScript(null, {
code: 'myExtension("action1");'
});
},
action2 : function(){
chrome.tabs.executeScript(null, {
code: 'myExtension("action2");'
});
}
};
chrome.windows.getCurrent(function(win) {
chrome.tabs.query({
'windowId': win.id,
'active': true
}, function(tabArray) {
// windows.done pretty much doesn't do anything
if (!window.done) {
chrome.tabs.insertCSS(tabArray[0].id, {
file: 'myextension.css'
});
chrome.tabs.executeScript(null, {
file: 'myextension.js'
}, function(){
window.done = true;
chrome.tabs.executeScript(null, {
code: 'myExtension("init");'
});
});
}
// action1
var el = document.querySelector('.action1');
el.removeEventListener('click', commands.action1);
el.addEventListener('click', commands.action1);
// action2
var el = document.querySelector('.action2');
el.removeEventListener('click', commands.action2);
el.addEventListener('click', commands.action2);
});
});
在我myextension.js
文件,我做这样的事情如此我不会丢失我需要保存的内部变量:
(function(){
window.myExtension = function(command) {
if (typeof myExtensionVariables === 'undefined') {
window.myExtensionVariables = {
que : [],
flags : {}
}
}
if (command === 'init') {
// initialize!
}
// etc
};
})();
我不认为我需要一个background.html
或background.js
,
我真的想是为了防止JavaScript注入的发生不止一次。
有什么建议吗?
哦!我没有意识到'executeScript'在回调中有一个参数。太好了,谢谢! – Mottie
虽然你在'{code:...}'之前忘了'null',但我会编辑你的答案;) – Mottie
@Mottie,它是一个可选参数,你不必指定它。 – wOxxOm