【发布时间】:2013-07-14 18:28:27
【问题描述】:
我正在尝试存储一个 contentEditable 元素的选择并稍后恢复它。
我想观察paste事件并像以前一样存储HTML,清除html然后在所选位置手动插入粘贴的文本并进行一些更改。
看看这个例子:jsfiddle.net/gEhjZ
当您选择文本的一部分时,点击store,再次删除选择并点击restore,它按预期工作。
但是当你第一次点击store,然后点击overwrite html将HTML替换为完全相同的HTML,然后尝试restore,什么都没有发生。
我认为使用.cloneRange() 会有所作为,但事实并非如此。即使是对象的深层副本 ($.extend(true, {}, oldRange)) 也无法解决问题。一旦我覆盖了 HTML,选择对象 sel 也会被更改。更改选择上下文将擦除范围对我来说很有意义,但我正在尝试将其恢复为完全相同的 HTML。
我知道我可以使用rangy,但我真的不想为了这个小功能而使用一个庞大的库。我错过了什么?任何帮助将不胜感激!
注意:仅适用于 Firefox/Chrome,因此无需跨浏览器破解。
更新:
@Tim Down 的答案在使用 div 时有效,但我实际上使用的是 iframe。当我做这个例子时,我认为它不会有任何区别。
现在,当我尝试恢复 iframe 的主体时,出现以下错误:TypeError: Value does not implement interface Node. 在以下行 preSelectionRange.selectNodeContents(containerEl);。我没有从谷歌搜索中得到太多。我试图包装正文的内容并恢复包装的html,但我得到了同样的错误。
jsfiddle 在这种情况下不起作用,因为它使用 iframe 来显示结果本身,所以我在这里举个例子:snipt.org/AJad3
没有包装也一样:snipt.org/AJaf0
更新 2:
当然,我想我必须使用editable.get(0)。但是现在 iframe 选择的start 和end 是0。见snipt.org/AJah2
【问题讨论】:
标签: javascript jquery range selection contenteditable