我将div设置为contentEditable
,并使用“white-space:pre
”进行样式设置,因此它保留了换行符之类的内容。在Safari,FF和IE中,div看起来很像,工作原理也一样。一切都很好。我想要做的是从这个div中提取文本,但以这种方式不会丢失格式 - 特别是换行符。从contentEditable div中提取文本
我们正在使用jQuery,它的text()
函数基本上会执行预定义的DFS,并将DOM分支中的所有内容粘合到一起。这会丢失格式。
我看了一下html()
函数,但似乎所有三个浏览器都会在我的contentEditable
div的幕后生成实际的HTML。假设我键入此进入我的div:
1
2
3
这些结果如下:
的Safari 4:
1
<div>2</div>
<div>3</div>
火狐3.6:
1
<br _moz_dirty="">
2
<br _moz_dirty="">
3
<br _moz_dirty="">
<br _moz_dirty="" type="_moz">
IE 8:
<P>1</P><P>2</P><P>3</P>
呃。这里没什么一致的。令人惊讶的是,MSIE看起来是最理智的! (大写P标签和所有)
该div将动态设置样式(字体,颜色,大小和对齐),这是使用CSS完成的,所以我不确定是否可以使用pre
标签(这是在我用Google发现的某些页面上暗示)。
有谁知道任何JavaScript代码和/或jQuery插件或从contentEditable div中提取文本的方式,以保留换行符?如果我不需要,我宁愿不重新创建解析轮。
更新:我从jQuery 1.4.2中挑选了getText
函数,并修改了它,使用空白大部分完好地提取它(我只添加了一行,添加了一个换行符);
function extractTextWithWhitespace(elems) {
var ret = "", elem;
for (var i = 0; elems[i]; i++) {
elem = elems[i];
// Get the text from text nodes and CDATA nodes
if (elem.nodeType === 3 || elem.nodeType === 4) {
ret += elem.nodeValue + "\n";
// Traverse everything else, except comment nodes
} else if (elem.nodeType !== 8) {
ret += extractTextWithWhitespace2(elem.childNodes);
}
}
return ret;
}
我调用该函数并使用其输出将其分配到使用jQuery的XML节点,是这样的:
var extractedText = extractTextWithWhitespace($(this));
var $someXmlNode = $('<someXmlNode/>');
$someXmlNode.text(extractedText);
生成的XML是通过AJAX调用最终被发送到服务器。
这适用于Safari和Firefox。
在IE上,只有第一个'\ n'似乎以某种方式被保留。寻找到它更多,它看起来像jQuery是设置文本像这样(jQuery的1.4.2.js的4004线):
return this.empty().append((this[0] && this[0].ownerDocument || document).createTextNode(text));
上createTextNode
读了起来,看来IE的实现可以混搭空白。这是真的还是我做错了什么?
有意思的是,IE浏览器的行为最为理智:contentEditable最初是IE专有的;它从5.5开始就已经在IE了,所以我想他们已经有了最多的时间让它运行良好。 – Yahel 2010-11-12 03:30:57