在略读所有可能的问题和答案之后,我将以这种方式尝试。
我正在编写一个RTE,但无法成功地在一个可信的元素中提取文本。 这样做的原因是,每个浏览器以稍微不同的方式处理节点和按键(#13)事件(例如,一个创建'br',另一个'div','p'等) 为了使这一切保持一致,我正在编写一个跨浏览器编辑器,它使用e.preventDefault()杀死所有默认操作;
以下情景:
1)用户点击#13键(检查)
2)检测到插入位置(检查)
3)在插入符号(check)
之后的元素之后创建新的p(aragraph)4)如果插入符和元素之间的文本(节点)结束,则将其解压缩(???)
5)将文本(节点)放入新创建的p(aragraph)(检查)
你可以想象,除了第4点,一切都有效。
在众所周知的js rangy库中有类似的功能,其中提取了特定的选择。
我需要的是:从插入符号到可疑段落(p,h1,h2,...)元素的末尾获取并提取所有文本(当然还有标记,因此splitBoundaries)。
欢迎任何线索,提示或片段! 提前谢谢。
亲切的问候, P
答案 0 :(得分:5)
您可以通过创建一个Range对象来实现此目的,该对象包含从插入符号到包含块元素末尾的内容并调用其extractContents()
方法:
function getBlockContainer(node) {
while (node) {
// Example block elements below, you may want to add more
if (node.nodeType == 1 && /^(P|H[1-6]|DIV)$/i.test(node.nodeName)) {
return node;
}
node = node.parentNode;
}
}
function extractBlockContentsFromCaret() {
var sel = window.getSelection();
if (sel.rangeCount) {
var selRange = sel.getRangeAt(0);
var blockEl = getBlockContainer(selRange.endContainer);
if (blockEl) {
var range = selRange.cloneRange();
range.selectNodeContents(blockEl);
range.setStart(selRange.endContainer, selRange.endOffset);
return range.extractContents();
}
}
}
这在IE< = 8中不起作用,它不支持Range或与其他浏览器相同的选择对象。您可以使用Rangy(您提到的)来提供IE支持。只需将window.getSelection()
替换为rangy.getSelection()
。
jsFiddle:http://jsfiddle.net/LwXvk/3/