JavaScript完全在节点内选择文本
我正在研究JavaScript中的文本选择和范围 我需要获取完全围绕选定文本的任何节点,例如:JavaScript完全在节点内选择文本,javascript,jquery,html,Javascript,Jquery,Html,我正在研究JavaScript中的文本选择和范围 我需要获取完全围绕选定文本的任何节点,例如: <div>this is <span>some simple</span> text</div> <span id="f_span">some simple</span> <script> var x = document.getElementById("f_span"); </script>
<div>this is <span>some simple</span> text</div>
<span id="f_span">some simple</span>
<script>
var x = document.getElementById("f_span");
</script>
这是一些简单的文本
当用户选择单词“some simple”时,我需要知道它完全位于节点内。
然而,如果他们只选择“一些”,那么这并不完全在节点内,因为没有选择“简单”一词
最终要求是仅当选择了节点内的整个文本时,才能够修改节点上的类
jquery也是可行的。谢谢
为了给它添加更多的上下文,当用户选择一些文本时,我们会给它添加一些符号,比如说“粗体”。用户可以根据自己的意愿经常编辑父div中的文本,以便每次编辑都可以添加一个包含选定文本的新范围。我们可能会得到这样的结果:
<div><span class="text-bold">Hi</span>, <span class="text-red">this <span class="text-italic">is</span></span> a sample text item</div>
您好,这是一个示例文本项
因此,跨度可以根据用户的需要来来去去 您每次都希望获得
DOM
。因此,您可以将id设置为HTML元素对象
,并从中获取值。例如:
<div>this is <span>some simple</span> text</div>
<span id="f_span">some simple</span>
<script>
var x = document.getElementById("f_span");
</script>
一些简单的
var x=document.getElementById(“f_span”);
然后,您可以检查
x
值是否等于用户选择的值 您每次都希望获得DOM
。因此,您可以将id设置为HTML元素对象
,并从中获取值。例如:
<div>this is <span>some simple</span> text</div>
<span id="f_span">some simple</span>
<script>
var x = document.getElementById("f_span");
</script>
一些简单的
var x=document.getElementById(“f_span”);
然后,您可以检查
x
值是否等于用户选择的值 您可以使用setInterval
每隔x秒获取所选文本。使用联接功能,您可以获得所选文本
对于用户的选择:
function getSelected() {
if(window.getSelection) { return window.getSelection(); }
else if(document.getSelection) { return document.getSelection(); }
else {
var selection = document.selection && document.selection.createRange();
if(selection.text) { return selection.text; }
return false;
}
return false;
}
它返回一个对象,为您提供选择的偏移量。如果
result.anchorOffset=0
和result.focusOffset=result.anchorNode.length
(如果它从节点开始,长度等于整个节点的长度),则用户选择了您的所有节点。您可以使用setInterval
每隔x秒获取一次所选文本。使用联接功能,您可以获得所选文本
对于用户的选择:
function getSelected() {
if(window.getSelection) { return window.getSelection(); }
else if(document.getSelection) { return document.getSelection(); }
else {
var selection = document.selection && document.selection.createRange();
if(selection.text) { return selection.text; }
return false;
}
return false;
}
它返回一个对象,为您提供选择的偏移量。如果
result.anchorOffset=0
和result.focusOffset=result.anchorNode.length
(如果它从节点开始,长度等于整个节点),则用户选择了您的所有节点。感谢您的回复,它允许我拼凑出我的解决方案:
function applyTextFormatClass(className) {
var selection = getSelected();
var parent = selection.getRangeAt(0).commonAncestorContainer; //see comment and link below
if (parent.nodeType !== 1) {
parent = parent.parentNode; //we want the parent node
}
var tagText = parent.innerText;
var selectText = selection.toString();
if (tagText.length !== selectText.length) {
addNodeAroundSelectedText(selection, className); //create new node
} else {
addClass(parent, className); //add class to existing node
}
}
commonAncestorContainer:感谢您的回复,它让我能够拼凑出我的解决方案:
function applyTextFormatClass(className) {
var selection = getSelected();
var parent = selection.getRangeAt(0).commonAncestorContainer; //see comment and link below
if (parent.nodeType !== 1) {
parent = parent.parentNode; //we want the parent node
}
var tagText = parent.innerText;
var selectText = selection.toString();
if (tagText.length !== selectText.length) {
addNodeAroundSelectedText(selection, className); //create new node
} else {
addClass(parent, className); //add class to existing node
}
}
commonAncestorContainer:尝试Rangy库:嗨,谢谢Rory,但我希望避免更多插件,理想情况下最好是纯javascript解决方案尝试Rangy库:嗨,谢谢Rory,但我希望避免更多插件,理想情况下最好是纯javascript解决方案Hi,谢谢,很好的建议,但是如果有两个类似的单词用单独的标记括起来,那么它就不起作用了。对不起,我不明白为什么它不起作用?您正在从元素对象获取值。您好,谢谢,建议不错,但是如果有两个类似的单词用单独的标记括起来,则无法使用。很抱歉,我无法理解为什么无法使用?您正在从元素对象获取值。