content访问document和window对象数据

别想了!访问不到。content与页面只共享DOM元素的访问,不能访问到页面内方法和对象属性。
通常地,content采用脚本注入的方式来实现对原生页面上方法 or 对象属性的访问!

对比一下!下面两段 content.js 代码有什么不同

// content.js
// 假设原生页面有一个属性需要访问,window.data = 1

// 第一段
function test1() {
  // window是页面上对象,但是不共享访问
  return window.data
}

// 第二段
function test2() {
  // 创建元素
  var script = document.createElement('script')
  script.type = 'text/javascript'
  script.innerHTML = 'document.body.setAttribute("data", window.data)'
  // 元素插入文档(脚本注入),插入的脚本直接运行,向body上插入一个data属性和数据
  document.head.appendChild(script)
}

// ===> 描述:

test1(): 是想要直接调用页面上的对象,所以是调用不到的,因为数据不共享
test2(): 是将脚本通过content.js 注入到页面中,由页面自己去执行页面环境的代码得到我们想要的数据。

注!将数据放到DOM元素上,就可以直接通过document访问了。如果没有元素(或脚本)就想办法变成元素(或脚本)来访问!

content内容里面的脚本不能和浏览器页面环境共享,content脚本和页面不在一个环境里面:

在这里插入图片描述

借助扩展环境的脚本,生成页面dom节点,将新脚本注入到页面脚本中去:

注!这是mv2版本向页面注入js脚本,mv3之后扩展程序不允许执行任何未经扩展审核的js脚本了,动态创建script标签被认定为是不安全的。

  // 创建元素
  var script = document.createElement('script')
  script.type = 'text/javascript'
  // 要插入的页面脚本内容 innerHTML
  script.innerHTML = 'document.body.setAttribute("data", window.data)'
  // 元素插入文档(脚本注入),插入的脚本直接运行,向body上插入一个data属性和数据
  document.head.appendChild(script)
JavaScript中,如果你想利用对象将iFrame内的数据缓存,并在子页面返回时不丢失之前的填写内容,可以采取以下几个步骤: 1. **获取iFrame内容**: 使用`contentWindow`或`contentDocument`属性访问iFrame内嵌页面的内容。例如: ```javascript const iframe = document.getElementById('your_iframe_id'); let iframeContent = iframe.contentWindow || iframe.contentDocument; ``` 2. **创建数据存储对象**: 创建一个全局变量或在window对象上定义一个对象,用于存储iFrame中的关键数据,如: ```javascript window.iframeData = {}; ``` 3. **填充并保存数据**: 当用户在iFrame内输入数据时,将其添加到`iframeData`对象: ```javascript function saveFormData(data) { iframeData.formData = data; } // 比如监听表单事件 document.getElementById('your_form').addEventListener('submit', (e) => { e.preventDefault(); saveFormData(e.target); }); ``` 4. **缓存数据**: 子页面加载完毕后,检查是否有缓存的数据,如果有则恢复到iFrame: ```javascript function loadCachedData() { if (window.iframeData && window.iframeData.formData) { // 将数据设置回iFrame document.getElementById('your_form').elements.forEach((element) => { element.value = iframeData.formData[element.name]; }); } } // 页面加载完成时调用 window.onload = loadCachedData; ``` 5. **保持数据同步**: 考虑到跨域限制,如果你需要双向数据交换,可以使用第三方库如`postMessage`或者服务器端的技术。 **相关问题--:** 1. 如何处理跨域问题以便能访问iFrame内容? 2. 如果用户关闭了浏览器再打开,如何保证数据仍然存在? 3. 是否有更好的方式长期存储大量数据而不是依赖本地缓存?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小白说(๑• . •๑)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值