如何删除文本选择中的子元素
How to remove the child element(s) in a text selection
我不知道要探索这个。我在选择div 中的文本时附加 span
元素。 工作正常。
如果用户再次选择span
元素(文本内侧或外侧(,如何删除现有元素并换行到新的span
元素。 所以我不会为任何span
元素获得孩子。(span 是父元素,允许除 span 元素以外的子元素(
如何清除文本选择中的span
?
我正在将边框应用于跨度(突出显示(
现场演示
.js:
function selHTML() {
var nNd = document.createElement("span");
var w = getSelection().getRangeAt(0);
console.log(w);
try {
w.surroundContents(nNd);
$(nNd).addClass('highlight');
} catch (ex) {
console.log("The Range has partially selected a non-Text node.")
}
}
$("#addText").on('click', function(event) {
event.preventDefault();
$(selHTML());
});
$("button").click(function(){
$(selHTML());
});
$("div.content").mouseup(function(event) {
var range = window.getSelection().getRangeAt(0);
if (!range.collapsed) {
var bounds = range.getBoundingClientRect();
var x = bounds.left + ((bounds.right - bounds.left - $(".savetooltipAll").outerWidth()) / 2);
var y = bounds.top - $(".savetooltipAll").outerHeight() + $(window).scrollTop();
$(".savetooltipAll").css("top", (y+(bounds.top*3)) + 'px');
$(".savetooltipAll").css("left",x + 'px');
$(".savetooltipAll").show();
} else {
$(".savetooltipAll").hide();
}
});
$("div.content").mousedown(function(event) {
var range = window.getSelection();
console.log(range.type);
});
我建议每次用户进行选择时,您只需清除父元素中的所有范围即可。然后,您可以每次重新开始,从而允许您实现逻辑来跟踪这些跨度的去向。
此外,每次创建跨度时,都应将起始索引和结束索引的数据存储在文本中。这样,您就不必依赖 span 元素来告诉您这些选择的位置,并且您的逻辑可以与视图或显示的创建分离。
您还可以存储多组起点和终点,以便当用户一个接一个地选择多个区域时,它们会不断添加到您的数据中。你最终可能会得到这样的东西:
[
{start: 2, end: 6},
{start: 8, end: 21}
]
(一个数组,其中每个对象代表一个选择,或"跨度"(
现在你有了这些数据,你可以检查对象是否有重叠......如果一个结束一个又一个开始,只需将它们合并为一个。
完成所有逻辑后,可以将 span 元素重新添加到页面中。
您可以检查所选内容是否突出显示了跨度,如果存在,则在突出显示之前删除范围内的跨度。请参阅下面的条件,
if (w.startContainer.parentElement.className == 'highlight') {
$(w.startContainer.parentElement).replaceWith(function () {
return $(this).contents();
});
}
注意:以上只是一个您可以使用的概念。代码查找span.highlight
,如果您决定也解开其他元素,则可以展开检查。
演示:http://jsfiddle.net/jsr150L5/
function selHTML() {
var nNd = document.createElement("span");
var w = getSelection().getRangeAt(0);
console.log(w);
console.log(w.startOffset + ' ' + w.endOffset);
try {
if (w.startContainer.parentElement.className == 'highlight') {
$(w.startContainer.parentElement).replaceWith(function () {
return $(this).contents();
});
}
if (w.endContainer.parentElement.className == 'highlight') {
$(w.endContainer.parentElement).replaceWith(function () {
return $(this).contents();
});
}
w.surroundContents(nNd);
$(nNd).addClass('highlight');
} catch (ex) {
console.log("The Range has partially selected a non-Text node.")
}
}
$("#addText").on('click', function (event) {
event.preventDefault();
$(selHTML());
});
$("button").click(function () {
$(selHTML());
});
$("div.content").mouseup(function (event) {
var range = window.getSelection().getRangeAt(0);
if (!range.collapsed) {
var bounds = range.getBoundingClientRect();
var x = bounds.left + ((bounds.right - bounds.left - $(".savetooltipAll").outerWidth()) / 2);
var y = bounds.top - $(".savetooltipAll").outerHeight() + $(window).scrollTop();
$(".savetooltipAll").css("top", (y + (bounds.top * 3)) + 'px');
$(".savetooltipAll").css("left", x + 'px');
$(".savetooltipAll").show();
} else {
$(".savetooltipAll").hide();
}
});
$("div.content").mousedown(function (event) {
var range = window.getSelection();
console.log(range.type);
});
.highlight {
border: 1px solid red;
}
.savetooltipAll {
position: absolute;
display:none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="content">
<p>Lorem ipsum dolor sit amet, <strong>consectetur</strong> adipisicing elit. Error ipsa quo illum excepturi autem voluptatem, maiores tempora quasi temporibus architecto ratione delectus modi qui cum earum, omnis itaque nam iure!</p>
</div>
<div class="savetooltipAll">
<button>Click</button>
</div>
<input type="button" id="addText" value="Surround">
相关文章:
- WebdriverIO waitForExist()选择元素's选定的选项
- 如何选择元素的第n个子元素
- Angular没有根据模型更新我的选择元素
- jquery使用name from变量按类选择元素
- 如何使用jQuery按数据日期属性选择元素
- 向html选择元素添加选项
- 使用Jquery在相同类型的元素中选择元素
- 他们是如何使用angular/jqLite find()方法按属性名称和值选择元素的?ng conf 2015
- 如何在Angular中清除选择元素中的过滤器
- 使用其中一个元素作为参考点,从Javascript数组中选择元素
- Javascript选择元素到字符串的比较
- Angular始终选择选择元素中的第一个选项
- 使用 jquery .find() 遍历按类和存储属性选择元素
- 通过 id json, jquery 选择元素
- 如何基于另一个已经存在的选择器选择元素
- 禁用多个选择元素中的非“选定”选项,但使用 jquery 的一个除外
- HTML 选择元素的只读等效项
- 在iPad上,如何通过Javascript事件在选择元素上设置focus()而不显示选项
- 单击事件似乎不适用于 IE 中的选择元素
- Angular js,在选择元素上,我想 POST 数据以将其保存在数据库中,然后我想使用 PUT 更新它而无需重新加载