关于 HTML编辑器 中ie无法获取 iframe.contentWindow.document.write('html...') 的dom节点 问题

frankqnj 2008-11-30 05:30:51
不好意思. 我没有分.送 新人..

想写自己的编辑 才发现问题多多...
开始的时候 我使用了一个真正的页面作为 iframe.src 引用...
这时.貌似ie是可以 用类似 iframe.contentWindow.body.innerHTML 取到东西. 也就是说 是可以获取到 dom节点的.
但是 这种情况在 opera9.5下 有点小问题.
我查了. 都说是 opera9.5 + 对 document.open() .close() 有些问题.. 我给opera写了单独的代码. 问题仍然出现. 即 编辑区域居然在iframe外面..而iframe里面 却有一个 和iframe 等高的 大大的 focus.... 鼠标点编辑区 . iframe边框 会变成虚线 输入文字. 会把iframe删除掉. 也就是 他居然把iframe放到编辑区里去了
我的dom结构肯定没问题. 因为其他浏览器 全部正常. 最后我无奈的发现 我把 iframe.src 属性去掉 . 而完全采用 打开新文档流的方式 写入dom结构 .则 opera才变的正常了.....

刚要高兴. 才突然发现 这样做 带来了新的问题 .ie无法获取 到iframe.contentWindow 的节点......... 也就无法获取 body中的 数据部分了....
实在是很想不通 到底该如何处理呢?

这是我的代码参考yahoo editor的模式.


{//HtmlEditor target 预替换的 textarea 节点id
function HtmlEditor(target) {
if (!(target = document.getElementById(target))) return false;
var iframe = document.createElement('iframe');
this.textarea = target;
this.iframe = iframe;
var iframeTextContent = ''
iframeTextContent += '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
iframeTextContent += '<html xmlns="http://www.w3.org/1999/xhtml" >';
iframeTextContent += '<head> <title>text edit area</title>';
iframeTextContent += '<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />';
iframeTextContent += '<link rel="stylesheet" type="text/css" href="../css/mxjia_config.css" /></head>';
iframeTextContent += '<body style="padding:3px;margin:0px;font-size:12px;cursor:text;text-align:left;line-height:16px;">测试</body></html>';
this.iframeTextContent = iframeTextContent;
}


HtmlEditor.prototype = {
//获取TextArea对象
getTextArea: function() {
return this.textarea;
},
//获取iframe对象
getIframe: function() {
return this.iframe;
},
//获取iframe引用的子窗体对象
getWin: function() {
return this.iframe.contentWindow;
},
//获取iframe引用窗体对象的document对象
getDoc: function() {
return this.getWin().document;
},
//获取iframe应用窗体的body对象
getBox: function() {
return this.getDoc().body;
},
//开启document对象的 DesignModel
openDocDesignMode: function() {
try {
this.getDoc().open();
this.getDoc().write(this.iframeTextContent);
this.getDoc().close();
this.getDoc().designMode = 'on';
}
catch (e) {
setTimeout(arguments.callee, 10);
}
},
//创建并初始化iframe对象
init: function() {
this.iframe.id = 'iframe_' + this.textarea.id || 'iframe_htmlEditor';
this.iframe.className = this.textarea.className;
mxjia.insertAfter(this.iframe, this.textarea);
this.textarea.style.display = 'none';
this.openDocDesignMode();
alert(this.getDoc().body); //这里 在ie中 打印出 null 其他浏览器全部正常....
}

}
}

...全文
2906 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
soular 2010-11-06
  • 打赏
  • 举报
回复
路过看看
阿云ivan 2008-12-01
  • 打赏
  • 举报
回复
IE是可以获取到iframe.contentWindow 的节点的

document.getElementById('iframe id').contentWindow.document.getElementById('节点id')
frankqnj 2008-12-01
  • 打赏
  • 举报
回复
感谢你. 的回复 唯一一个 理我的人

我的问题出在 应该把 designMode='on' 写在document.write前面 如果放在后面则ie会有问题. 其他浏览器没问题.. 以后注意这个细节就好了..

谢谢你的回复 . 仍然送分给你
frankqnj 2008-11-30
  • 打赏
  • 举报
回复
请大家帮帮想想问题所在. 谢谢啦!

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧