Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 选项卡侦听器未被来自后台脚本的消息激活_Javascript_Google Chrome Extension - Fatal编程技术网

Javascript 选项卡侦听器未被来自后台脚本的消息激活

Javascript 选项卡侦听器未被来自后台脚本的消息激活,javascript,google-chrome-extension,Javascript,Google Chrome Extension,如果我有一个内容脚本getTradingData.js(来自background.js),我将向选项卡发送一条消息,代码如下: alert("Automated TradingView Extension is running"); chrome.tabs.query({ url: 'https://www.tradingview.com/*' }, function(tabs) { if (tabs.length == 1) { chrome.tabs.sendMessage

如果我有一个内容脚本getTradingData.js(来自background.js),我将向选项卡发送一条消息,代码如下:

alert("Automated TradingView Extension is running");

chrome.tabs.query({
  url: 'https://www.tradingview.com/*'
}, function(tabs) {
  if (tabs.length == 1) {
    chrome.tabs.sendMessage(tabs[0].id, {subject: "testConnection"}, function(response) {
      alert(response); //THIS RETURNS UNDEFINED
      if (response.msg == "getTradingDataScriptHere") {
        alert("Script Already Injected. Do not reinject"); //THIS IS NOT RUNNING
      } else {
        chrome.tabs.executeScript(tabs[0].id, {file: "jquery-2.2.3.min.js"});
                chrome.tabs.executeScript(tabs[0].id, {file: "jquery.waituntilexists.min.js"});
                chrome.tabs.executeScript(tabs[0].id, {file: "getTradingData.js"});
                alert("Injected all Nessessary Scripts for Auto Trading View to work"); //THIS IS NOT RUNNING
      }
    });
  } else {
    alert("Please have one and only one tradingview chart page opened.");
  }
});

var price = "Waiting For Price"

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.subject == "getPrice") {
      sendResponse({
        price: price
      });
    } else if (request.from == "getTradingData" && request.subject == "scriptLoaded") {
        //getTradingData.js Script has Fully Loaded onto Website

    } else if (request.from == "getTradingData" && request.subject == "updatePrice") {
        price = request.price
    }
  });
但是,响应返回为未定义。所以基本上我没有得到回复

下面是我的getTradingData.js中应该响应消息的内容:

 alert("getTradingData.js is Running");

//Send message to let the extension know the script has been injected on site
chrome.runtime.sendMessage({
    from:    'getTradingData',
    subject: 'scriptLoaded'
});

chrome.runtime.onConnect.addListener(function(port) { //THIS DOESN'T WORK EITHER
  console.assert(port.name == "tradingdata");
  port.onMessage.addListener(function(request) {
    if (request.msg == "Knock knock")
      port.postMessage({subject: "price"});
    else if (msg.answer == "Madame")
      port.postMessage({question: "Madame who?"});
    else if (msg.answer == "Madame... Bovary")
      port.postMessage({question: "I don't get it."});
  });
});

//to check if script already injected
chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    alert("got message"); //THIS IS NOT RUNNING
    if (request.subject == "testConnection") {
        sendResponse({msg: "getTradingDataScriptHere"});
    }
 });

//wait till item has loaded
$(".dl-header-figures").waitUntilExists(function(){
    alert($(".dl-header-figures").text());
    updatePrice();
});

function updatePrice(){
    alert("updating price");
    chrome.runtime.sendMessage({
        from:    'getTradingData',
        subject: 'updatePrice',
        price: $(".dl-header-figures").text()
    });
}

//TODO: Use long lived connections for this to work: https://developer.chrome.com/extensions/messaging
// setInterval(updatePrice(), 3000);
然而,这从来没有被激活,我从来没有得到警报得到消息

下面是my manifest.json的外观:

{
  "manifest_version": 2,

  "name": "Automated TradingView Strategy",
  "description": "This extension shows a Google Image search result for the current page",
  "version": "1.0",

  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "background": {
    "scripts": ["jquery-2.2.3.min.js", "background.js"]
  },
  "content_scripts": [
    {
      "matches": ["https://www.tradingview.com/chart/*", "http://www.tradingview.com/*"],
      "js": ["jquery-2.2.3.min.js", "jquery.waituntilexists.min.js", "getTradingData.js"]
    }
  ],
  "permissions": [
    "activeTab",
    "tabs",
    "*://*.tradingview.com/*",
    "https://ajax.googleapis.com/"
  ]
}

我做错了什么?我如何才能让它发送回复。即使我刷新扩展插件,该扩展插件应该重新加载background.js,而不重新加载已经插入内容脚本的选项卡,我也没有得到响应,因为侦听器没有被激活。

您在后台脚本中到底想做什么

加载扩展时,chrome.tabs.query只运行一次,而且,由于清单的原因,使用chrome.tabs.executeScript注入的脚本应该已经被注入

我不知道您到底想做什么,但是,您可以在每次更新选项卡时侦听事件创建后更新的选项卡-chrome.tabs.onUpdated.addListener

更新的background.js:

alert("Automated TradingView Extension is running");

chrome.tabs.query({
  url: 'https://www.tradingview.com/*'
}, function(tabs) {
    console.log(tabs);
  if (tabs.length == 1) {

    chrome.tabs.sendMessage(tabs[0].id, {subject: "testConnection"}, function(response) {
        if (response) {
            alert("Script Already Injected. Do not reinject");
        } else {
            chrome.tabs.executeScript(tabs[0].id, {file: "jquery-2.2.3.min.js"});
                chrome.tabs.executeScript(tabs[0].id, {file: "jquery.waituntilexists.min.js"});
                chrome.tabs.executeScript(tabs[0].id, {file: "getTradingData.js"});
                alert("Injected all Nessessary Scripts for Auto Trading View to work");
        }
    });
  } else {
    alert("Please have one and only one tradingview chart page opened.");
  }
});

var price = "Waiting For Price"

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.subject == "getPrice") {
      sendResponse({
        price: price
      });
    } else if (request.from == "getTradingData" && request.subject == "scriptLoaded") {
        //getTradingData.js Script has Fully Loaded onto Website

    } else if (request.from == "getTradingData" && request.subject == "updatePrice") {
        price = request.price
    }
  });

您会得出这样的结论:它是background.js中唯一的代码。没有足够的证据证明这一点。我正在尝试让注入tradingview.com/chart/*页面的脚本与背景脚本通信。但要确保始终注入脚本,即使没有重新加载该选项卡,并且只插入扩展。我已经编辑添加了上面的所有代码。@Pabi现在我看到了完整的源代码,我想我知道其中一个问题。您正在查询已打开该网站的选项卡。但是如果它在加载扩展之前已经打开,它将不会有任何内容脚本在那里侦听消息。。。因此,未定义的。如果您检查chrome.runtime.lastError,我相信您会看到一些消息,说它无法建立连接。您的清单中有一个输入错误,可能是https或*的http。