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>

我正在研究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>
这是一些简单的文本
当用户选择单词“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,谢谢,很好的建议,但是如果有两个类似的单词用单独的标记括起来,那么它就不起作用了。对不起,我不明白为什么它不起作用?您正在从元素对象获取值。您好,谢谢,建议不错,但是如果有两个类似的单词用单独的标记括起来,则无法使用。很抱歉,我无法理解为什么无法使用?您正在从元素对象获取值。