由于@standardModel说,瘦长让你在IE全* DOM范围的支持,并有一个有用的方法getNodes()
,您可以使用:
var sel = rangy.getSelection();
if (sel.rangeCount) {
var range = sel.getRangeAt(0);
var spans = range.getNodes([1], function(node) {
return node.nodeName.toLowerCase() == "span" && range.containsNode(node);
});
// Do stuff with spans here
}
如果你不想使用笨重的东西瘦长,下面的函数会告诉你,如果一个元素被完全选择:
function isSelected(el) {
if (window.getSelection) {
var sel = window.getSelection();
var elRange = document.createRange();
elRange.selectNodeContents(el);
for (var i = 0, range; i < sel.rangeCount; ++i) {
range = sel.getRangeAt(i);
if (range.compareBoundaryPoints(range.START_TO_START, elRange) <= 0
&& range.compareBoundaryPoints(range.END_TO_END, elRange) >= 0) {
return true;
}
}
} else if (document.selection && document.selection.type == "Text") {
var textRange = document.selection.createRange();
var elTextRange = textRange.duplicate();
elTextRange.moveToElementText(el);
return textRange.inRange(elTextRange);
}
return false;
}
的jsfiddle例如:http://jsfiddle.net/54eGr/1/
(*)除了处理DOM突变下的范围更新
感谢您的回复Tim。我不能使用Rangy,但您的解决方案对我来说工作得很好。谢谢 – 2011-05-05 05:31:44