2009-07-18 99 views
11

我有一些JavaScript基于用户选择的操作html。对于真正的浏览器,我使用杠杆的“范围”的对象,方法得到这样的:检测JavaScript中的换行符的问题范围对象

var sel = window.getSelection(); 
    var range = sel.getRangeAt(0); 
    var content = range.toString(); 

内容变量包含所有选定的文本,它工作正常。但是我发现我无法检测到结果字符串中的换行符。例如:

选定的文本:

ABC

高清

GHI

range.toString()的计算结果为 “ABCDEFGHI”。

对特殊字符的任何搜索都不会返回\ n \ f \ r或甚至\ s的实例。但是,如果我将变量写入可编辑控件,则换行符会再次出现。

有谁知道我错过了什么?

这些选择和操作在可编辑的div上可能是相关的。 Chrome,FireFox和Opera中也有相同的行为。令人惊讶的是IE浏览器需要完全不同的代码,但这里没有任何问题,除了它只是IE浏览器。

非常感谢。

+0

'range.toString()评价为“abcdefghi”'是什么意思?你用什么来检验这个价值?调试器?警报()? – 2009-07-18 04:39:25

+0

你正在将`range`值写入可编辑控件或`range.toString()`吗? – RaYell 2009-07-18 04:48:36

回答

11

编辑我的帖子:

做实验了一下,我发现sel.toString()回报新线CONTENTEDITABLE的div,而range.toString()返回正确的换行符在正常不可编辑的div但不可编辑的,因为你的报道。

虽然找不到任何解释。

这是一个有用的链接http://www.quirksmode.org/dom/range_intro.html

1

我发现至少两种其他的方式,所以你仍然可以使用的范围内找到在Mozilla插入符的位置。

的一种方法是调用

var documentFragment = rangeObj.cloneContents(); 

,其保持的childNodes的阵列,以及任何换行符将显示为类的节点“HTMLBRElement”。


另一种方法是确保每个“br”标签后跟一个换行符(0x0a)!

这不会以任何可见的方式伤害HTML内容,但是现在当range.toString()被调用时,所有HTML中断都会被转换为纯文本换行符!


我希望这有助于 - 即使这个话题是非常古老的。 (我已经是死灵巫师了,呵呵):)