来源:自学PHP网 时间:2014-12-15 15:58 作者: 阅读:次
[导读] 本文为大家介绍下关于iframe节点初始化的问题:如果没有把iframe元素加入到DOM树中,iframe中的文档是不会初始化的...
本文为大家介绍下关于iframe节点初始化的问题:如果没有把iframe元素加入到DOM树中,iframe中的文档是不会初始化的
复制代码 代码如下: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); 大家看看上面的代码,有没有发现哪里出现了批漏? 我想如果没有和我有类似经历的童鞋估计是看不出这段代码有什么问题的。那么大家不妨去跑一下,也许你很快就会发现问题。 下面由我来揭晓答案: 这段代码会抛找不到对象的异常。找不到哪个对象?找不到document对象,啥?怎么可能找不到document对象?当然,这个document对象是iframe的document对象。做过富文本的都知道要先获取了iframe的document对象才可以设置为可编辑。但是为什么我们获取不了document对象呢?这里我就不卖关子了。我说说我的解决流程吧。 首先我去谷歌了一下发现我获取document的写法是没有错的。然后我在想难道是Chrome的原因?难道Chrome抽风不支持这两个对象?于是换到了Firefox。结果还是一样。那么可以肯定的是,肯定是自己的代码问题。 后来通过对比网上的代码,发现自己的appendChild位置有点不对,于是乎就将它提前到了获取document对象前: 复制代码 代码如下: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其实里面包含的是另一个文档,而这个文档只有初始化了才能拥有一个document对象。而如果没有把iframe元素加入到DOM树中,iframe中的文档是不会初始化的。因此,在一开始我们的代码里,我们获取的ifr变量中的contentDocument值是null,也就说明了此时iframe中的文档没有初始化。 顺着这条线,我再检查了别的节点的初始化情况,发现其实别的元素节点只要一旦创建,无论是否加入到DOM树中都会拥有其本身的属性和方法。也就是说在众多元素节点中iframe算是个异类吧。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com