Rangy范围包含在jquery选择器中

时间:2011-06-24 22:37:16

标签: javascript jquery dom rangy

我正在研究Rangy JavaScript plugin周围的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
  }
}

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;
  }
}