Javascript 选项卡侦听器未被来自后台脚本的消息激活
如果我有一个内容脚本getTradingData.js(来自background.js),我将向选项卡发送一条消息,代码如下: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
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。