iframe节点初始化的问题探讨
今日,我产生了一种复习富文本编辑器制作原理的冲动。我决定亲手实践一下,凭借一年前所编写的简单富文本编辑器的经验,我开始重新。当我尝试运行我之前的代码时,遇到了一个问题。
让我们看看这段代码:
```javascript
var ifr = document.createElement('iframe');
ifr.width = 300;
ifr.height = 300;
var idoc = ifr.contentDocument || ifr.contentWindow.document;
idoc.designMode = 'on';
idoc.contentEditable = true;
idoc.write('<html><head><style>body{ margin:0px; }</style></head><body></body></html>');
document.body.appendChild(ifr);
```
对于没有类似经验的读者来说,可能很难发现其中的问题。但我发现,这段代码在尝试访问iframe的document对象时可能会抛出异常。为什么会找不到document对象呢?这个问题困扰了我一段时间。
经过深入研究,我发现问题的关键在于iframe的初始化。iframe内部包含的是一个独立的文档,这个文档需要被初始化才能拥有document对象。而如果我们没有把iframe元素加入到DOM树中,那么这个文档是不会被初始化的。这就意味着,在我们一开始的代码里,我们尝试获取的ifr变量中的contentDocument值是null,因为此时iframe中的文档还没有被初始化。
这个发现让我意识到,iframe在元素节点中的特殊性:它的初始化状态取决于是否已经被加入到DOM树中。而其他元素节点,无论是否加入DOM树,都会拥有其本身的属性和方法。
那么,如何解决这个错误呢?我在谷歌搜索后,通过对比网上的代码,发现只需要将appendChild的调用提前,就可以在获取document对象之前将iframe加入到DOM树中,从而避免了这个错误。修改后的代码如下:
```javascript
var ifr = document.createElement('iframe');
ifr.width = 300;
ifr.height = 300;
document.body.appendChild(ifr);
var idoc = ifr.contentDocument || ifr.contentWindow.document;
idoc.designMode = 'on';
idoc.contentEditable = true;
idoc.write('<html><head><style>body{ margin:3px; word-wrap:break-word; word-break: break-all; }</style></head><body></body></html>');
```
这次错误给我带来了宝贵的经验,也让我对富文本编辑器的制作原理有了更深的理解。这次的经历提醒了我,在编写涉及iframe等特殊元素的代码时,需要特别注意其初始化的状态和行为。
网站设计
- iframe节点初始化的问题探讨
- 成为黑客的几个必备技能
- VRay物理相机简介及其参数
- Paypal个人账户、高级账户和企业账户的区别
- Cross Iframe Trick:the Old New Thing(图)
- css网页设计非常有用的解决办法
- 16英寸MacBook Pro值得买吗 16英寸MacBook Pro详细评测
- 笔记本硬盘的术语解释
- Web端的邮件内容HTML格式规范总结
- Html5 webview元素定位工具的实现
- 电脑快捷键操作大全
- 电脑要升级内存需要看哪些参数 如何升级电脑的
- ai怎么设计炫酷光影效果的背景图-
- CSS自适应布局实现子元素项目整体居中,内部项
- Flash cs3鼠绘教程:图文讲解铰连身体部分
- 28家百货集团联合天猫双十一 推出O2O专场