如何查找 HTML 是否包含在所选文本中
How to find if a HTMLElement is enclosed in Selected text
是否可以找出一个HTML环境是否完全包含在选择中?我有一个场景,用户在 HTML 编辑器中选择一些文本并从列表中应用一些自定义样式。现在,我需要更改包含在该选择中的每个 span 元素的 class 属性,并用具有所选样式的新 span 包围该选择。我能够在Firefox和safari中使用DOM Range的compareBoundaryPoints方法找出特定的span元素是否在选择中,但它不适用于IE。
有没有办法找出一个元素是否完全包含在IE的选定范围内?
谢谢
卡皮尔
正如@standardModel所说,Rangy在IE中为您提供了完整的* DOM Range支持,并且有一个有用的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
}
如果您不想使用像 Rangy 这样笨重的东西,以下函数将告诉您是否完全选择了元素:
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 突变下的范围更新
你可能想看看Rangy。这使得xbrowser范围和选择变得更加容易。
相关文章:
- 无法将包含文本和图像的SVG保存到画布
- 检查选择器在jQuery中是否包含文本(即不是媒体)
- jQuery 隐藏按钮,如果它们不包含文本
- 创建包含文本内容的新 Google 云端硬盘文件 (javascript)
- 使用XPath选择包含文本的节点,而不考虑CasperJS中的空白
- 使用DOM javascript包含文本和图片的按钮
- 若文本框中包含文本,则不允许用户离开页面
- 如果其他字段包含文本,则阻止文本字段
- 时刻.js以日期中间格式包含文本
- 检查文本框是否包含文本,如果包含,则发送
- 如何 chk 如果 span 标签是否包含文本
- 将包含文本框的 HTML 表转换为具有文本框值的 HTML 表
- 如何加载仅包含文本内容的 iFrame
- 将拖放链接拖放到仅包含文本的文本框中
- 包含文本和 URL 的图像列表视图
- 检查 span 元素是否包含“文本”,并且是父元素的最后一个子元素
- jQuery/JS 仅选择直接包含文本的元素
- JS.检查输入属性src是否包含文本
- 单击链接时,检查文本字段是否包含文本
- jQuery next直到包含文本节点