【转】关于JS的contentDocument,contentEditable,designMode

本文介绍了一种使Iframe自适应其内容高度的方法,并提供了JavaScript代码实现。此外,还详细介绍了如何通过设置iframe的设计模式属性来实现文档的可编辑性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Iframe自适应高度


<script language="JavaScript"> 
//** iframe自动适应页面 **//

//输入你希望根据页面高度自动调整高度的iframe的名称的列表
//用逗号把每个iframe的ID分隔. 例如: ["myframe1", "myframe2"],可以只有一个窗体,则不用逗号。

//定义iframe的ID
var iframeids=["content"]

//如果用户的浏览器不支持iframe是否将iframe隐藏 yes 表示隐藏,no表示不隐藏
var iframehide="yes"

function dyniframesize() 
{
var dyniframe=new Array()
for (i=0; i<iframeids.length; i++)
{
           if (document.getElementById)
{
//自动调整iframe高度
dyniframe[dyniframe.length] = document.getElementById(iframeids[i]);
if (dyniframe[i] && !window.opera)
{
dyniframe[i].style.display="block"
if (dyniframe[i].contentDocument && dyniframe[i].contentDocument.body.offsetHeight) //如果用户的浏览器是NetScape
dyniframe[i].height = dyniframe[i].contentDocument.body.offsetHeight; 
else if (dyniframe[i].Document && dyniframe[i].Document.body.scrollHeight) //如果用户的浏览器是IE
dyniframe[i].height = dyniframe[i].Document.body.scrollHeight;
}
}
//根据设定的参数来处理不支持iframe的浏览器的显示问题
if ((document.all || document.getElementById) && iframehide=="no")
{
var tempobj=document.all? document.all[iframeids[i]] : document.getElementById(iframeids[i])
tempobj.style.display="block"
}
}
}

if (window.addEventListener)
window.addEventListener("load", dyniframesize, false)
else if (window.attachEvent)
window.attachEvent("onload", dyniframesize)
else
window.onload=dyniframesize
</script>

将文档设置为设计模式 

要将整个文档设置为设计模式,可以对文档对象本身设置 designMode 属性。当文档处于设计模式时,将不运行脚本。这样,似乎在文档内设置一个按钮来打开或关闭设计模式是个好注意,但这样做没有作用。当用户打开它后,它将保持在设计模式状态。当他们下次单击此按钮时,它将被选定而不是被单击,他们再次单击它,将能够编辑它的值。这就是为什么如果要使用设计模式最好对框架或 IFrame 中的文档设置 designMode 属性的原因。下例展示如何为 IFrame 中的文档打开设计模式: 

<script for="btnDesign" event="onclick"> 
targetDoc = document.frames(0).document; 
if (targetDoc.designMode == "On") 
targetDoc.designMode = "Off"; 
else 
targetDoc.designMode = "On"; 
</script> 
<button 
<iframe src="blank.htm" style="border: black thin; width:100%; height:200px"></iframe> 

designMode 属性的值始终以首字母大写格式存储,即时它最初是以全部小写设置的。请在测试它的值时一定记住这点。designMode 属性的默认值是“Inherit”。 

contentEditable

IE5.0以上版本有一个编辑状态,designMode是document的属性,意思是设置或获取表明文档是否可被编辑的值,默认值为off或Inherit

HtmlEdit.document.designMode="On";

HtmlEdit是iframe对象ID

IE 中可以设置contentEditable="true"

把div的contentEditable属性设置为 true,在IE浏览器中就可以看到效果了,div中元素都变成可以编辑的了。
<div id="tt" contentEditable="true">
</div>

<body contentEditable="true">    则整个页面都可以编辑了。
Firefox中可以   使用javascript语句设置属性contentDocument.designMode为 "on"

iframeName.document.designMode="on" ;
其中iframeName 为iframe控件的name属性。

在 IE7和 FireFox2.0中测试通过

<think>嗯,用户现在问的是关于iframe.contentDocument的内容。之前他们问过如何在Vue中监听iframe的加载超时,现在这个问题可能也是他们在处理iframe相关开发时遇到的。首先,我需要回顾一下contentDocument的基本概念和用法。 iframe.contentDocument属性返回的是iframe内嵌页面的document对象,这样可以通过父页面的JavaScript来操作子页面的DOM。不过,这可能涉及到跨域问题,如果iframe的源和父页面不同源,浏览器会阻止访问contentDocument,这是安全策略的一部分。所以用户在使用时需要注意跨域限制。 接下来,我需要考虑用户为什么想知道这个属性。可能他们正在尝试从父页面控制或修改iframe中的内容,比如自动填充表单、修改样式,或者监听子页面的事件。这时候,了解如何正确获取和使用contentDocument就很重要了。 另外,用户可能遇到了一些问题,比如访问contentDocument时出现权限错误,或者不确定如何正确使用这个属性。需要解释清楚同源策略的影响,并提供解决方案,比如使用postMessage进行跨域通信。 在回答中,应该包括基本用法、注意事项、跨域处理的替代方案,以及示例代码。同时,要提醒用户在实际开发中的安全性,避免强行绕过跨域限制,这可能带来安全风险。 还需要考虑用户可能是在Vue项目中遇到这个问题,所以结合之前的回答,可能需要给出在Vue组件中使用contentDocument的最佳实践,比如在load事件触发后再访问,避免在iframe未加载完成时调用。 最后,要确保语言清晰,结构分明,帮助用户逐步理解contentDocument的使用场景和限制,同时提供实际可行的代码示例和解决方案。</think>以下是关于 `iframe.contentDocument` 的详细介绍: --- ### 一、核心概念 `iframe.contentDocument` 是用于获取 iframe 内嵌页面文档对象的关键属性,其特性包括: 1. **DOM访问入口** 通过该属性可直接操作 iframe 内的 DOM 树 2. **同源策略限制** 受浏览器安全策略约束,仅当父页面与 iframe 满足[同源策略](https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy)时可用 3. **实时引用** 始终指向当前 iframe 的文档对象 --- ### 二、基本使用示例 ```html <iframe id="myFrame" src="child.html"></iframe> <script> const iframe = document.getElementById('myFrame') iframe.onload = function() { try { // 获取文档对象 const childDoc = iframe.contentDocument // 操作子页面DOM const header = childDoc.querySelector('h1') header.style.color = 'red' // 访问子页面全局对象 const childWindow = iframe.contentWindow childWindow.alert('来自父页面的消息') } catch (err) { console.error('跨域访问被阻止:', err) } } </script> ``` --- ### 三、核心特性对比 | 属性/方法 | 返回值类型 | 可用场景 | 跨域限制 | |-----------------------|--------------|--------------------------|--------| | `iframe.contentDocument` | Document 对象 | DOM 操作 | 严格 | | `iframe.contentWindow` | Window 对象 | JavaScript 全局对象访问 | 严格 | | `iframe.src` | String | URL 读写 | 无 | --- ### 四、跨域问题解决方案 #### 1. 服务端配置 CORS ```http # 响应头配置示例 Access-Control-Allow-Origin: https://parent-domain.com Access-Control-Allow-Methods: GET ``` #### 2. 使用 postMessage 通信 **父页面**: ```javascript iframe.contentWindow.postMessage('要传递的数据', 'https://child-domain.com') ``` **子页面**: ```javascript window.addEventListener('message', (event) => { if (event.origin !== 'https://parent-domain.com') return console.log('收到消息:', event.data) }) ``` --- ### 五、实际应用场景 #### 1. 表单自动填充 ```javascript // 在安全同源环境下 const childForm = iframe.contentDocument.getElementById('loginForm') childForm.username.value = 'admin' childForm.password.value = 'securePass123' ``` #### 2. 样式动态修改 ```javascript iframe.contentDocument.documentElement.style.backgroundColor = '#f0f0f0' ``` #### 3. 事件监听代理 ```javascript iframe.contentDocument.addEventListener('click', (e) => { console.log('子页面点击事件:', e.target) }) ``` --- ### 六、注意事项 1. **加载时序控制** 必须等待 iframe 的 `load` 事件触发后才能访问 ```javascript // 错误示例(可能访问不到) const iframe = document.createElement('iframe') document.body.appendChild(iframe) console.log(iframe.contentDocument) // null // 正确方式 iframe.onload = function() { console.log(iframe.contentDocument) // 有效 Document } ``` 2. **安全限制规避** 以下方式无法绕过跨域限制: ```javascript // 无效尝试 try { /* 访问跨域 contentDocument */ } catch {} // 仍然会被浏览器阻止 ``` 3. **现代浏览器特性** Chrome 86+ 新增特性: ```javascript // 需要设置 iframe 的 allow 属性 <iframe allow="cross-origin-isolated"></iframe> ``` --- ### 七、替代方案推荐 当遇到跨域限制时,可考虑: 1. **反向代理** 通过 Nginx 统一域名 ```nginx location /child-app/ { proxy_pass https://child-domain.com/; } ``` 2. **API 网关** 建立中间层进行数据中 3. **服务器端渲染** 通过服务端获取 iframe 内容 --- ### 八、调试技巧 在 Chrome DevTools 中: 1. 选择 iframe 元素 2. 右键菜单选择 "Show iframe details" 3. 在 "Document" 标签页查看详细信息 ![Chrome DevTools iframe调试示意图](https://example.com/path-to-image.png)*(此处应为示意图)* --- 通过合理运用 `contentDocument` 可以实现跨文档的深度集成,但务必注意遵守浏览器的安全策略规范。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值