解决mv3版本浏览器插件,不能注入js脚本问题

背景

浏览器插件升级mv3版本后,不能再使用content_script内容脚本向原浏览器(top)注入script标签达到注入脚本的目的。浏览器认为插入未经审核的脚本是不安全的行为。

引入ifream

由插件(扩展)插入一个ifream标签。ifream子页面中包含的script标签中脚本允许插入到top页面中。但是插入后存在跨域问题:

  1. 完全跨域(二级域名和主域名都不相同)
// 完全跨域的域名
document.domain = 'aaa.xxx.com' // 父页面域名
document.domain = 'bbb.ccc.com' // 子页面域名

在这里插入图片描述

  1. 不完全跨域
// 二级域名不同,主域名相同
document.domain = 'aaa.xxx.com' // 父页面域名
document.domain = 'bbb.xxx.com' // 子页面域名
  1. 不跨域

这里不讨论不跨域不完全跨域的问题。毕竟扩展插入的子页面大部分都是插入到别人的网站里面。
扩展创建ifream标签,引入子页面:

let ifELe = document.createElement('iframe')
ifELe.src = 'domain' // 具体的逻辑由ifream子页面处理
// ifELe.src = 'https://www.baidu.com'
ifELe.style.width = '100%'
ifELe.setAttribute('data-name', 'xxx')

document.body.appendChild(ifELe)

注!引入的子页面首先要支持被其他页面嵌入或不包含一些限制。否则会被父页面阻止加载。

解决ifream和父页面完全跨域问题

跨域时,子ifream页面不能获取到父页面window document对象
可以使用消息广播进行数据传输,绕过跨域问题。

// ifream子页面:监听父页面发来的数据:ifream里面的window对象
  window.addEventListener('message-type', function(e){
      console.log(e.detail)
  })

// top父页面:父页面的window对象
 window.dispatchEvent(new CustomEvent('message-type', {
       detail: {
          name: '张三',
          age: 18
       }
 }))

补充:关于跨域通信问题

    详情可参考:top与ifream消息传递,同源通信?跨域通信?

    top和ifream子页面跨域消息传递?不能使用自定义事件监听,必须使用window.postMessage('message-type',{data: ''}, '*')发送跨域消息。

参考链接

  1. iframe相关及跨域解决方案 - 掘金
  2. iframe跨域解决办法_iframe跨域解决方案-CSDN博客
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白说(๑• . •๑)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值