我仍在学习使用javascript编程的知识,而且我也不熟悉Chrome扩展程序。 我尝试开发一个扩展程序,该扩展程序会将选定的文本或图像传输到另一个网页。 一切都可以正常发送图像和文本。 但是,当我多次使用扩展名时,出现文本问题。例如,如果我使用3次,它将在与发送信息的网页相同的选项卡上打开3次。 我认为问题可能出在每次单击时都会注入的内容脚本。但是我不确定,也不知道解决方案。
这是背景文件:
function getClickHandler() {
function getPageDetails(callback) {
// Inject the content script into the current page
chrome.tabs.executeScript(null, { file: 'content.js' });
// Perform the callback when a message is received from the content script
chrome.runtime.onMessage.addListener(function(message) {
// Call the callback function
callback(message);
});
};
function onPageDetailsReceived(details) {
transfer1= details.summary;
transfer2= details.url;
transfer3= details.title;
page = " http://www.example.com/testing.php?trans1=" + transfer1+"&trans2="+transfer2+"&trans3="+transfer3;
chrome.tabs.create({"url": page});
}
return function(info, tab) {
// The srcUrl property is only available for image elements.
var url = info.srcUrl;
if (url == null)
{
getPageDetails(onPageDetailsReceived);
}
else
{
page = " http://www.example.com/testing.php?trans4=" + url;
chrome.tabs.create({"url": page});
}
};
};
chrome.contextMenus.create({
title : "testing",
type : "normal",
contexts : ["image","selection"],
onclick: getClickHandler()
});
这是content.js:
chrome.runtime.sendMessage({
'title': document.title,
'url': window.location.href,
'summary': window.getSelection().toString(),
});
感谢您的帮助和建议!
答案 0 :(得分:0)
每次调用chrome.runtime.onMessage.addListener
时,它都会添加一个另一个侦听器,所有侦听器都会在每个消息上触发。
如果您打算只调用一个特定的处理程序一次,则需要通过引用该处理程序的调用removeListener
来实现一些自注销逻辑。
如果您只需要一个不变的处理程序(这似乎是您的情况),则需要注意只调用一次addListener
。
从当前代码的外观来看,您可以在顶层使用chrome.runtime.onMessage.addListener
:
chrome.runtime.onMessage.addListener(function(message) {
onPageDetailsReceived(message);
});
,然后将其从getPageDetails
中删除。我知道有意将callback
配置为可配置,但是您在这里不需要它,或者至少您需要确保侦听器仅注册一次。