Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Rangy选择接下来的N个单词_Javascript_Rangy - Fatal编程技术网

Javascript 使用Rangy选择接下来的N个单词

Javascript 使用Rangy选择接下来的N个单词,javascript,rangy,Javascript,Rangy,我可以使用Rangy选择下一个单词,如下所示: $(function () { $("#select-next-one-word").click(function () { var selection = rangy.getSelection(); selection.expand("word", { wordOptions: { includeTrailingSpace: true

我可以使用Rangy选择下一个单词,如下所示:

$(function () {
    $("#select-next-one-word").click(function () {
        var selection = rangy.getSelection();
        selection.expand("word", {
            wordOptions: {
                includeTrailingSpace: true
            }
        });

        selection.collapseToEnd();
        selection.expand("word");
    });
});


但是如何将选择扩展到接下来的N个单词呢?

这应该会给您带来正确的方向。我修改了您的“选择下两个单词”功能,如下所示:

$(function () {
    $("#select-next-two-words").click(function () {
        var selection = rangy.getSelection();

        selection.expand("word", {
            wordOptions: {
                includeTrailingSpace: true
            }
        });
        selection.collapseToEnd();
        var range = selection.getRangeAt(0);
        range.moveEnd("word", 2);
        selection.setSingleRange(range);
    });
});
我在范围上使用
moveEnd
将其结尾向前移动两个单词。但是,这不会修改屏幕上的选择。您必须使用
setSingleRange
设置选择,以便屏幕上的内容反映更改


对于任意数量的单词,您只需将range.moveEnd(“单词”,2)更改为您想要的任何数字。

这将为您指明正确的方向。我修改了您的“选择下两个单词”功能,如下所示:

$(function () {
    $("#select-next-two-words").click(function () {
        var selection = rangy.getSelection();

        selection.expand("word", {
            wordOptions: {
                includeTrailingSpace: true
            }
        });
        selection.collapseToEnd();
        var range = selection.getRangeAt(0);
        range.moveEnd("word", 2);
        selection.setSingleRange(range);
    });
});
我在范围上使用
moveEnd
将其结尾向前移动两个单词。但是,这不会修改屏幕上的选择。您必须使用
setSingleRange
设置选择,以便屏幕上的内容反映更改


对于任意数量的单词,您只需将
范围。moveEnd(“单词”,2)
更改为您想要的任何数字。

我建议从选择中获取一个范围,将其扩展为包含整个单词,将其折叠到结尾,再次向前移动整个范围两个字,然后使用
moveStart()
将范围的起始点向后移动两个字。有点复杂,但达到了我所理解的预期结果

演示:

代码:


我建议从所选内容中获取一个范围,将其扩展到包含整个单词,将其折叠到末尾,再次向前移动整个范围两个单词,然后使用
moveStart()
将范围的开头向后移动两个单词。有点复杂,但达到了我所理解的预期结果

演示:

代码:



您的JSFIDLE可以很好地处理两个单词,但有什么不符合预期?例如,当光标位于“dolor”上时,单击“选择下两个单词”按钮不会选择“sit amet”。是的,它每两个单词选择一个单词,因为我想它会在第二次迭代中覆盖所选内容。当我了解了Rangy的工作原理后,我会再回来讨论。我已经阅读了Rangy的所有文档,但仍然没有任何线索。他们的文档很糟糕,我本可以用中文阅读,结果也一样。@user1835565:Rangy文档是极简主义的,并且假设Rangy所基于的domapi是知识的。我同意一些已完成的示例会有所改进。您的JSFIDLE可以很好地处理两个单词,但有什么不符合预期?例如,当光标位于“dolor”上时,单击“选择下两个单词”按钮不会选择“sit amet”。是的,它每两个单词选择一个单词,因为我猜它会在第二次迭代中覆盖所选内容。当我了解了Rangy的工作原理后,我会再回来讨论。我已经阅读了Rangy的所有文档,但仍然没有任何线索。他们的文档很糟糕,我本可以用中文阅读,结果也一样。@user1835565:Rangy文档是极简主义的,并且假设Rangy所基于的domapi是知识的。我同意一些已完成的示例会有所改进。当我在光标位于“amet”上时点击“选择下两个单词”按钮时,选择了“Concertetur adipising”。你知道我如何选择“Concertetur adipsing”(忽略“,”并包括最后一个空格)?@jpen:我想出了一个方法。但它并不十分漂亮。见更新的答案。@jpen:啊,我说得太快了。如果你把插入符号放在“concertetur”中,那么它会正确地突出显示接下来的两个单词,但下次按下按钮时会跳过“Maecenas”。我会再想一想。@jpen:我想,首先调用
expand()
,再次更新并修复了它。非常感谢您的帮助!当光标处于“ipsum”时按下“选择下一个2字”按钮时,“选择下一个”被选中。如何限制contenteditable div中的选择?当我在光标位于“amet”时点击“选择下一个两个单词”按钮时,选择了“连续编辑”。你知道我如何选择“Concertetur adipsing”(忽略“,”并包括最后一个空格)?@jpen:我想出了一个方法。但它并不十分漂亮。见更新的答案。@jpen:啊,我说得太快了。如果你把插入符号放在“concertetur”中,那么它会正确地突出显示接下来的两个单词,但下次按下按钮时会跳过“Maecenas”。我会再想一想。@jpen:我想,首先调用
expand()
,再次更新并修复了它。非常感谢您的帮助!当光标处于“ipsum”时按下“选择下一个2字”按钮时,“选择下一个”被选中。如何限制contenteditable div中的选择?