我正在尝试为chrome制作自动登录按钮扩展程序。我的代码如下:
options.html:
function gotoAdmin(){
chrome.tabs.create({'url': "http://www."+currentTabDomain+"/admin"}, function(tabId,changeInfo,tab) {
chrome.tabs.executeScript(null, {file: "login.js"});
});
}
...
<img src="admin.png" onClick="gotoAdmin()">
login.js:
$(document).ready(function(){
$('input[name=username]').val('foo');
$('input[name=password]').val('bar');
$('#form').submit();
});
的manifest.json:
"permissions": [
"tabs", "http://*/*", "https://*/*"
],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["jquery-1.7.2.min.js"],
"run_at": "document_start"
}
],
"background": {
"scripts": ["background.js"]
}
我的问题是,当我通过开发人员控制台打开选项选项卡并启动gotoAdmin()时,jQuery事件就可以了,并且自动登录正常工作,但是当我单击图像而没有打开开发人员控制台时,它不会从login.js做任何事情(甚至没有打开警报)。
答案 0 :(得分:4)
我知道,我加入聚会的时间太晚了,但是 - 如果有人在寻找类似问题的答案(如我所做的那样)时遇到这个问题 - 这是我使用的解决方案:
问题是,只要打开新选项卡,弹出窗口就会关闭,这会导致执行中的任何JS也停止。因此,由于chrome.tabs.create(<specs>, <callback>)
位于弹出窗口中,因此永远不会执行回调函数。
解决方案是让背景页面(或更好的 event page )为您处理标签创建过程。然后,您必须通过通知背景/事件页面来启动该过程。
步骤1:
在弹出窗口中,使用
// Add whatever arguments you need to pass, in <msg>
chrome.runtime.sendMessage(msg);
步骤2:
让背景/事件页面接收消息并执行:
// a. Listen for a message, adding a listener.
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
// I got the message, let's parse it.
...
// b. Act upon it, creating the tab etc.
chrome.tabs.create(<specs>, <callback>);
...
});
另外,请查看文档,了解有关 Message Passing 的更多信息。
答案 1 :(得分:0)
您必须将tab.id
而不是null
传递给executeScript函数,而chrome.tabs.create
只将tab
参数传递给回调函数,而不是tabId,changeInfo,tab
:
chrome.tabs.create({'url': "http://www."+currentTabDomain+"/admin"}, function(tab) {
chrome.tabs.executeScript(tab.id, {file: "login.js"});
});