内容脚本之间的通信| Chrome 扩展程序

佐约

我有一个将 iframe 注入网页的内容脚本。

内容.js

var iframe = document.createElement('iframe');
    iframe.id = "frame";
    iframe.style.cssText = "position:fixed;top: 15px;right: 15px;width: 250px;height: 245px;overflow: hidden;background-color:#FFFFFF;border-radius: 5px;";
    iframe.src = chrome.runtime.getURL('frame.html');
    document.body.appendChild(iframe);

iframe 显示一些文本值,有一个提交和一个关闭按钮。

frame.html 的一部分

<div class="header">
   <span class="close">Name</span>
   <span class="close-btn" id="close-btn">&times;</span>
</div>
<div class="details-container">
    <span class="label">First Name : </span> 
    <span id="fname" type="text" ></span>
</div>
<div class="details-container">
    <span class="label">Last Name : </span> 
    <span id="lname" type="text" /></span>
</div>
<div class="btn-details-container">
    <button class="copy" id="copy-name">Copy</button>
</div>

frame.html 有 frame.js 链接到它。

我想在这里做两件事。

  1. 当用户单击 iframe 上的关闭按钮时关闭/删除/隐藏 iframe(#close-btn)
  2. 动态设置span中名字和姓氏的值(从当前网页的DOM中提取)

问题:

1)我不知道如何将frame.html上的点击事件传播到内容脚本以关闭iframe(无法在frame.js和content.js之间建立通信)

2) 无法为#fname 和#lname 设置span.textContent,因为frame.js 无法读取网页DOM。

哇哦

基于 Chrome 和 Chromium 的浏览器

使用chrome.tabs.sendMessage与 iframe 的所有者选项卡通信,可以使用iframe 内的chrome.tabs.getCurrent检索

内容.js:

var FRAME_URL = chrome.runtime.getURL('frame.html');
var iframe = document.createElement('iframe');
iframe.src = FRAME_URL;
document.body.appendChild(iframe);
    
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  switch (msg.cmd) {
    case 'close':
      iframe.remove();
      iframe = null;
      break;
    case 'getData':
      sendResponse([
        ['fname', document.querySelector('.web.page.selector.for.fname').textContent],
        ['lname', document.querySelector('.web.page.selector.for.lname').textContent],
      ]);
      break;
  }
});

iframe.js:

tellParent({cmd: 'getData'}, data => {
  for (const [id, val] of data) {
    document.getElementById(id).textContent = val;
  }
});

document.querySelector('.close-btn').onclick = () => {
  tellParent({cmd: 'close'});
};

function tellParent(msg, callback) {
  chrome.tabs.getCurrent(tab => {
    chrome.tabs.sendMessage(tab.id, msg, {frameId: 0}, callback);
  });
}

火狐

Firefox 的内部架构不同,因此它运行的 iframe 与内容脚本具有相同的限制,并且它们无法访问chrome.tabs. 解决方法是通过后台脚本发送消息。

  • iframe.js 需要一个不同的 tellParent:

    function tellParent(msg, callback) {
      chrome.runtime.sendMessage(msg, callback);
    }
    
    
  • 背景.js

    chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
      if (sender.frameId) {
        chrome.tabs.sendMessage(sender.tab.id, msg, {frameId: 0}, sendResponse);
        return true;
      }
    });
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在chrome扩展程序的浏览器操作,后台脚本和内容脚本之间进行通信的上下文和方法?

在自定义Chrome开发者工具面板和Chrome扩展程序内容脚本之间直接通信

创建的iframe与扩展程序,Google Chrome扩展程序之间的通信

无法在Chrome扩展程序中从内容脚本通信到弹出窗口

Chrome扩展程序和服务器之间的安全通信

chrome扩展程序中的内容脚本和背景页面之间的消息传递无法正常工作

Chrome扩展程序中内容脚本和背景页面之间消息传递的安全性

在Chrome扩展程序中将远程脚本作为内容脚本

从Chrome扩展程序到网页的通信

动态地注入内容脚本 - Chrome扩展程序

如何包含Chrome扩展程序内容脚本的样式?

Chrome扩展程序-在内容脚本中接收请求

Chrome扩展程序内容脚本未触发代码

如何选择何时启动Chrome扩展程序的内容脚本?

Chrome扩展程序:内容脚本未找到dom元素

Chrome扩展程序的内容脚本不影响特定网站

Chrome扩展程序:检查是否已插入内容脚本

Chrome扩展程序:如何全局捕获/处理内容脚本错误?

使用背景页面和内容脚本的Chrome扩展程序

Chrome扩展程序-在URL更新上加载内容脚本

Chrome扩展程序后台页面和内容脚本同步

Chrome扩展程序,内容脚本和XSS攻击

是否可以通过Chrome扩展程序内容脚本修改Cookie?

允许在Chrome扩展程序内容脚本中使用jQuery

将按钮注入网站(Chrome扩展程序内容脚本)

Chrome扩展程序内容脚本中的Polymer元素

如何取消Chrome扩展程序内容脚本中的事件绑定?

Chrome扩展程序:需要时调用内容脚本

Chrome扩展程序内容脚本不起作用