我使用 Range 对象作为表示当前选择的另一个 Range 对象的限制器,这样任何在选定范围内但在限制范围边界之外的东西都会被修剪掉。为了比较两个范围的位置,我使用了 Range.compareBoundaryPoints() 函数,但结果没有意义。
我正在使用的元素如下所示:
<p id="myBlock" contenteditable="true">
Hello hello hello, this is a great big block of test text.
</p>
Run Code Online (Sandbox Code Playgroud)
范围的定义和它们的位置关系检索如下:
var limitingRange = document.createRange();
limitingRange.selectNodeContents($('#myBlock')[0]);
var selectedRange = window.getSelection().getRangeAt(0).cloneRange(); //Use whatever method is supported by the browser to get the Range
var endToStart = limitingRange.compareBoundaryPoints(Range.END_TO_START, selectedRange);
var startToEnd = limitingRange.compareBoundaryPoints(Range.START_TO_END, selectedRange);
var startToStart = limitingRange.compareBoundaryPoints(Range.START_TO_START, selectedRange);
var endToEnd = limitingRange.compareBoundaryPoints(Range.END_TO_END, selectedRange);
Run Code Online (Sandbox Code Playgroud)
然后我在文本中选择单词“this”并运行该函数。我的范围看起来像这样(我发明了 .start 和 .end 符号来尝试使我的描述更清晰):
(limitingRange.start)Hello hello hello, (selectedRange.start)this(selectedRange.end) 是一大块测试文本。(limitingRange.end)
结果值为:
endToStart = -1
startToEnd = 1
startToStart = -1
endToEnd = 1
我对如何解释函数的结果感到困惑。例如,根据规范,如果 selectedRange 的结束出现在limitingRange 的开始之前,则endToStart 应该包含-1,但显然情况并非如此。这里发生了什么?
我正在回答我自己的问题:输入正在发生的事情让我真正理解了函数的行为,这真的很奇怪。
a.compareBoundaryPoints(X_TO_Y, b) 的结果是 aY 与 bX 的比较 -1 如果 aY 在 bX 之前,如果它们在相同的位置,则为 0,如果在之后则为 1。
所以在上例的 endToStart 中,limitingRange.start 与 selectedRange.end 进行了比较,-1 表示limitingRange.start 在前。
startToEnd:limitingRange.end 在 selectedRange.start 之后,所以结果是 1。
startToStart:limitingRange.start 在 selectedRange.start 之前,所以结果是 -1。
endToEnd:limitingRange.end 在 selectedRange.end 之后,所以结果为 1
留给我的只有一个问题:为什么这个函数会这样?常量的名称与人们直觉所期望的相反。
| 归档时间: |
|
| 查看次数: |
480 次 |
| 最近记录: |