我有一个内容脚本,注入一个iframe到网页。
content.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">×</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)
1.动态设置span中名和姓的值(从当前网页的DOM中提取)
问题:
1)我不知道如何将frame.html上的click事件传播到内容脚本以关闭iframe(无法在frame.js和content.js之间建立通信)
2)无法为#fname和#lname设置span. textContent,因为frame.js无法读取网页DOM。
1条答案
按热度按时间zphenhs41#
扩展消息传递(iframe控制逻辑)
使用chrome. tabs. sendMessage与iframe的所有者选项卡通信,可以使用iframe内部的chrome. tabs. getCurrent检索所有者选项卡。
content.js:
iframe.js:
扩展消息(双向端口)
在iframe中使用chrome.tabs.connect初始化端口,然后在内容脚本中使用它。
内容脚本:
iframe脚本:
Web消息传递(双向MessagePort)
它的速度非常快,支持二进制数据类型,如Blob或ArrayBuffer,但需要一定的注意,以避免被网页拦截:
1.在封闭的ShadowDOM内创建iframe以避免暴露
window[0]
1.不要设置iframe的
src
,而是使用url参数中的随机密钥导航其内部的location
,这样其URL就不会被使用chrome.dom.openOrClosedShadowRoot的网页或其他扩展欺骗。1.通过postMessage将安全的MessagePort传递到iframe
1.使用此安全MessagePort进行双向通信
//内容. js
//文件名:
//文件系统
navigator.serviceWorker
消息传递,在内容脚本和扩展的服务工作器**之间建立直接双向端口://文件系统
//背景. js