在Chrome中插入一个元素到一个范围将清除所选内容
Inserting an element into a range clears the selection in Chrome
我试图在选择的开始插入一个标记(我用来将元素定位在选择的顶部)。
我在Chrome中遇到了一个奇怪的情况,当range.insertNode
行执行时,选择被清除:
$(document).on('mouseup', function (e) {
var range = window.getSelection().getRangeAt(0).cloneRange();
range.collapse(true);
var markerElement = document.createElement("span");
markerElement.appendChild(document.createTextNode("'ufeff"));
// this will sometimes make the selection disappear in Chrome
range.insertNode(markerElement);
// make sure the marker is removed
setTimeout(function(){
markerElement.parentNode.removeChild(markerElement);
}, 250);
});
这里有一个jsbin
的例子,你可以用它来尝试:http://jsbin.com/agojib/1/edit
如果选择单个字母,它将清除所选内容。其他选择都可以。
注意:我使用的代码的修改,我如何能定位一个元素旁边的用户文本选择?
好的,我想我明白了:http://jsbin.com/agojib/7/edit
$(document).on('mouseup', function (e) {
var range = window.getSelection().getRangeAt(0);
// clone the current range
var clone = range.cloneRange();
range.collapse(true);
var markerElement = document.createElement("span");
markerElement.appendChild(document.createTextNode("'ufeff"));
// insert the marker in the first range
range.insertNode(markerElement);
// retrieve the selection
var selection = window.getSelection();
// remove all the ranges
selection.removeAllRanges();
// add the previously cloned range
selection.addRange(clone);
// make sure the marker is removed
setTimeout(function(){
markerElement.parentNode.removeChild(markerElement);
}, 250);
});
解决方案基本上是克隆范围,在第一个范围内插入标记,并使用克隆的范围重新选择以前选择的文本。
相关文章:
- 在 SlickGrid 中编辑后,根据不同列中的另一个单元格清除单元格
- 如何在选择另一个列表框值时清除列表框值
- 如果“上一个”为空,则清除下一个嵌套的选择标记
- 如果一个javascript模块为null,那么它的侦听器将被清除
- javascript:如何在另一个输入值更改时清除输入框
- 清除具有一个名称的多个文本输入框
- 清除基于另一个字段的选择字段选项
- 选择另一个对象应触发“之前:选择:清除”事件
- AngularJS:在使用基于选择的过滤器后,它赢得了'如果仅限于一个属性,则不清除
- 清除一个ajaxed表单中的内容
- 如何在Javascript中制作一个清除两个文本区域的按钮
- 编写一个时间函数,在游戏中清除倒计时并重新启动
- JQuery禁用,并清除除一个标记为“;全部”;
- 正在清除最后一个JSON响应
- V8 GC何时触发其第一个小GC循环(清除)
- 使用jquery,如果我点击表单上的所有文本框,我如何清除其中一个
- 单击另一个文本框时清除文本输入(如果它是空的)-jQuery
- 如何从另一个iFrame中清除iFrame的内容
- Canvas Html5:多个画布,清除其中一个会同时清除另一个画布
- 随时日期选择器添加一个清除按钮