我正在研究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
}
}
答案 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;
}
}