0

我正在围绕Rangy JavaScript 插件开发一个 JavaScript 包装器。我正在尝试做的事情:给定一个 jQuery 选择器和一个范围,检测该范围​​是否包含在选择器中。这是一个用户将阅读文档并能够对特定部分进行评论的空间。所以我有一个id="viewer"包含文档的 div,并且我有一个按钮区域,可以在用户选择一些文本后执行操作。这是(损坏的)功能:

function selectedRangeInRegion(selector) {
    var selectionArea = $(selector);
    var range = rangy.getSelection().getRangeAt(0);
    var inArea = (selectionArea.has(range.startContainer).length > 0);

    if (inArea) {
        return range;
    } else {
        return null;
    }
}

似乎selectionArea.has(range.startContainer)返回了一个大小为 0 的数组。我尝试过像这样的包装:$(range.startContainer)。有小费吗?


我为这个问题开发了一个解决方案。这假设您有一个 div 选择器并且您的内容没有任何 div:

function containsLegalRange(selector, range) {
  var foundContainingNode = false;

  var container = range.commonAncestorContainer

  var nearestDiv = $(container).closest("div");    
  if (nearestDiv.attr("id") == selector) {
    return true
  }
  else {
    return false
  }
}
4

2 回答 2

2

这不是has()工作原理:传递给它的参数是选择器字符串或 DOM 元素,而range.startContainer实际上可能是文本节点或元素的 DOM 节点。

我认为不会有像您希望的那样简单的方法。以下是我能想到的最简单的事情。

jsFiddle:http: //jsfiddle.net/TRVCm/

代码:

function containsRange(selector, range, allowPartiallySelected) {
    var foundContainingNode = false;
    $(selector).each(function() {
        if (range.containsNode(this, allowPartiallySelected)) {
            foundContainingNode = true;
            return false;
        }
    });
    return foundContainingNode;
}
于 2011-06-25T23:03:22.720 回答
0

.has() 有时可能很奇怪,并且.length == 0在不应该的时候产生。试试这种方式:

function selectedRangeInRegion(selector) {
  var range = rangy.getSelection().getRangeAt(0);
  var selectionArea = selector + ':has(\'' + range.startContainer + '\')';
  var inArea = $(selectionArea).length > 0);
  if (inArea) {
    return range; 
  }
  else {
    return null;
  }
}
于 2011-06-24T22:53:24.733 回答