chrome.tabs.executeScript仅在Developer Console打开时触发

时间:2012-04-24 00:25:24

标签: google-chrome google-chrome-extension

我正在尝试为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做任何事情(甚至没有打开警报)。

2 个答案:

答案 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"});
    });