我有一个内容可编辑的div(id为'editor1'),允许用户输入文本。然后有一个功能,允许他们为任何突出显示的文本着色。我的js使用window.getSelection().getRangeAt(0)
,但问题是它们可以突出显示div之外的单词,它们的颜色也会改变。目前为止我试过:
function red(){
{
var getText = document.getElementById("editor1").innerHTML;
var selection = getText.getSelection().getRangeAt(0);
var selectedText = selection.extractContents();
var span = document.createElement("span");
span.style.color = "red";
span.appendChild(selectedText);
selection.insertNode(span);
}
}
Fiddle:https://jsfiddle.net/xacqzhvq/
正如你所看到的,如果我突出显示"这也会变成红色",我也可以使用按钮使其变成红色。如何仅在editor1div中为突出显示的文本着色?
您可以使用.baseNode
从选择中获取节点元素。从那里您可以获得父节点并使用它进行比较。
function red(){
// If it's not the element with an id of "foo" stop the function and return
if(window.getSelection().baseNode.parentNode.id != "foo") return;
...
// Highlight if it is our div.
}
在下面的例子中,我让div
有一个id
,你可以检查它以确保它是那个元素:
演示
正如@z0mBi3所指出的,这将是第一次工作。但可能不适用于许多高光(如果它们碰巧被清除)。div
内的<span>
元素创建了一个层次结构,其中div
是许多span
元素的父元素。解决方案是遍历节点的祖先,直到找到id为"foo"
的节点。
幸运的是,您可以使用jQuery通过使用他们的.closest()
方法:来为您做到这一点
if($(window.getSelection().baseNode).closest("#foo").attr("id") != "foo") return;
以下是.closest()
的原生JS实现方法的答案。
试试这个代码:
function addBold(){
if(window.getSelection().focusNode.parentElement.closest("#editor").id != "editor") return;
const selection = window.getSelection().getRangeAt(0);
let selectedParent = selection.commonAncestorContainer.parentElement;
let mainParent = selectedParent;
if(selectedParent.closest("b"))
{
//Unbold
var text = document.createTextNode(selectedParent.textContent);
mainParent = selectedParent.parentElement;
mainParent.insertBefore(text, selectedParent);
mainParent.removeChild(selectedParent);
mainParent.normalize();
}
else
{
const span = document.createElement("b");
span.appendChild(selection.extractContents());
selection.insertNode(span);
mainParent.normalize();
}
if (window.getSelection) {
if (window.getSelection().empty) { // Chrome
window.getSelection().empty();
} else if (window.getSelection().removeAllRanges) { // Firefox
window.getSelection().removeAllRanges();
}
} else if (document.selection) { // IE?
document.selection.empty();
}
};
<div id="editor" contenteditable="true">
You are the programmers of the future
</div>
<button onclick="addBold()">Bold</button>
我得到了代码,并添加了以下答案的编辑:
使用Window.getSelection()加粗/取消加粗所选文本
特定id内的getSelection().focusNode不起作用
你在找这个吗,
//html
<body>
<p id='editor1'>asdf</p>
<button onclick='red()'>
RED
</button>
</body>
//JavaScript
window.red = function(){
//var getText = document.getElementById("editor1").innerHTML;
var selection = window.getSelection().getRangeAt(0);
var selectedText = selection.extractContents();
var span = document.createElement("span");
span.style.color = "red";
span.appendChild(selectedText);
selection.insertNode(span);
}
Plunker:https://plnkr.co/edit/FSFBADoh83Pp93z1JI3g?p=preview