【问题标题】:How to get chrome extension to sendMessage only once?如何让chrome扩展只发送一次?
【发布时间】:2016-06-15 17:39:31
【问题描述】:

我的 chrome 扩展的当前版本从当前选项卡中提取一组字符串,打开一个具有特定 url 的新选项卡,然后继续插入字符串并使用 jQuery 提交表单。我遇到的问题是,如果我之后打开一个单独的选项卡并使用表单转到 URL,它会继续再次插入数据并提交表单。它将持续执行此操作,因此我永远无法在使用 chrome 扩展程序自动化之外使用该网站。

这是 background.js 中发送字符串的函数。

chrome.browserAction.onClicked.addListener(function (tab) { //Fired when User Clicks ICON
    if(zip){
        zipCode = zip;
        zip = null;
    }else{
        zipCode = prompt('Zip code');
    }    
    if(/^\d{5}(-\d{4})?$/.test(zipCode)){
        var newURL = "https://www.medicare.gov/find-a-plan/questions/home.aspx?search";
        chrome.tabs.create({ url: newURL });
        chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
            id = "2136760320";          
            if (changeInfo.status == 'complete') {   
                chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
                    chrome.tabs.sendMessage(tabId, {zip: zipCode, pass: pwd, drugID: id}, function(response) {});  
                });
            }
        });
    }
});

这是与 URL 匹配并与 jquery 一起插入的内容脚本。仅当 chrome 扩展程序是打开页面的扩展程序时,我才需要它运行。

var pwd = "";
var id = "";

var onMessageHandler = function(message, sender, sendResponse){
    pwd = message.pass;
    id = message.drugID;
    $("#saveWorkID").val(id);
    var date = pwd.split("/");
    var month = date[0];
    if (month.length < 2) month = "0" + month;
    var day = date[1];
    var year = date[2];
    $("#month").val(month);
    $("#day").val(day);
    $("#year").val(year);
    $("#lnkFind span").trigger("click");
}
chrome.runtime.onMessage.addListener(onMessageHandler);

上述页面之前的页面还有另外两个内容脚本正在运行,但不确定它们是否有必要。

这是manigest.json

{
  "manifest_version": 2,

  "name": "PDP Lookup",
  "description": "Lookup the PDP druglist of a current user",
  "version": "1.0",
  "icons": {"48": "icon.png",
          "128": "icon128.png" },
  "browser_action":
  {
    "default_icon": "icon.png"
  },
  "background":{
    "scripts": [
      "jquery.js",
      "background.js"
    ]
  },
  "content_scripts": [
        {
            "matches": [
                "https://www.medicare.gov/find-a-plan/questions/home.aspx?search"
            ],
            "js": [
                "jquery.js",
                "stage1.js"
            ]
        },
        {
            "matches": [
                "https://www.medicare.gov/find-a-plan/questions/enter-your-information.aspx"
            ],
            "js": [
                "jquery.js",
                "stage2.js"
            ]
        },
        {
            "matches": [
                "https://XXX.XXX.XXX/XX*"
            ],
            "js": [
                "jquery.js",
                "search.js"
            ]
        },
        {
            "matches": [
                "https://plancompare.medicare.gov/pfdn/PlanFinder/DrugSearch"
            ],
            "js": [
                "jquery.js",
                "stage3.js"
            ]
        }

  ],
  "permissions": [
    "tabs",
    "https://*/*",
    "http://*/*"
  ]
}

任何有关如何防止内容脚本尝试读取已发送消息的帮助将不胜感激。

【问题讨论】:

标签: javascript jquery google-chrome-extension


【解决方案1】:

不要通过manifest文件注入内容脚本,而是尝试在chrome.tabs.create的回调函数中注入,类似

chrome.tabs.create({ url: newURL }, function(tabcreated){ chrome.tabs.executeScript(tabcreated,{file:"jquery.js"},function(){ chrome.tabs.executeScript(tabcreated,{file:"stage1.js"}); }); })

这样,它只会在您的扩展程序创建选项卡后注入,而不是在以任何其他方式打开具有该 URL 的选项卡时注入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-13
    • 2011-09-11
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多