在内容脚本和选项页面之间进行通信
Communicate between content script and options page
我已经看到了很多问题,都是关于背景页面到内容脚本的。
总结我的扩展有一个选项页面,和一个内容脚本。内容脚本处理存储功能(chrome.storage
操作)。每当用户更改选项页面中的设置时,我都希望向内容脚本发送消息以存储新数据。
我的代码:
options.js
var data = "abcd"; // let data
chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
chrome.tabs.sendMessage(tabs[0].id, "storeData:" + data, function(response){
console.log(response); // gives undefined :(
});
});
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
// not working
});
我的问题:
- 为什么这个方法不起作用?
- 是否有其他(更好的)方法来处理这个程序?
1)为什么这个方法不起作用?
你正在尝试给自己发消息:chrome.tabs.query({ active: true, currentWindow: true }, ...);
返回了一个选项页面,你正在做某事
2)是否有其他(更好的)方法。
这取决于您要发送消息的页面。您可以只向所有页面发送消息:使用空过滤器查询并遍历结果。
您可以使用内容脚本跟踪最后一个活动选项卡,但这听起来过于复杂。
或者,您可以使用更改chrome.storage
在所有扩展上下文中生成onChanged
事件的事实。如果您修改保存在chrome.storage
中的选项,您的内容脚本可以侦听onChanged
事件并根据需要重新处理它们的数据,这样您就可以完全跳过消息传递。
精确匹配模式:
{ currentWindow: true, url: 'http://127.0.0.1/*' }
选项页
chrome.tabs.query({ currentWindow: true, url: 'http://127.0.0.1/*' }, tabs => {
chrome.tabs.sendMessage(tabs[0].id, 'popup-tabs send a message');
});
内容脚本chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
console.log('request: ', request);
});
相关文章:
- firefox插件和dev/panel之间的通信
- 如何在两个不同的iframe HTML之间进行通信
- Angularjs事件与发布/订阅指令之间的通信
- Firefox插件SDK:在侧边栏和主脚本之间通信对象
- Ember.js:接受的子组件和父组件之间通信的最佳实践
- 如何在Windows Phone 8.1应用程序中在C#和Javascript之间传递数据或通信
- 如何在Famo.us中的两个视图(不同的js文件)之间进行通信
- 在Jquery或Javascript中获取两个范围或日期之间的通信周数
- 如何在同源选项卡之间建立通信
- 如何在 PHP 和 JS 中的并发会话之间进行通信
- 如何在两个动画画布元素之间进行通信
- 在 HTML5 和 C# Web 套接字通信之间
- angularjs 中控制器和指令之间的通信
- 歌剧扩展脚本和它们之间的通信
- 如何使用js在两个aspx页面之间进行通信
- 多个应用程序之间的通信
- Socket.IO:如何在同一服务器中的Socket.on()事件之间通信/交换数据
- chrome扩展的浏览器操作、后台脚本和内容脚本之间通信的上下文和方法
- 使用PhoneGap/Cordova时应用程序和服务器之间通信的最佳实践
- 使用AJAX在两个JavaScript文件之间通信并发送数据