Javascript 获取与父元素相比的范围

标签 javascript selection range

我有一个函数返回一个包含两个元素的数组(在 IE 中不起作用)

  • 用户在 div (id=text) 中选择内容的 html 代码
  • 选择范围

如果用户在文本 div 中选择一个简单的字符串,范围将返回正确的值,但是当用户在 div 的子元素(例如 div#text->p)中选择一个字符串时,范围的值与子元素,但我希望它们与父元素相关(div#text)

这里有一个 JsFiddle http://jsfiddle.net/paglia_s/XKjr5/ :如果您在茶区中选择一串普通文本或普通文本+粗体文本,您将得到正确的选择,而如果您选择粗体单词(“am”),您将得到错误的选择,因为范围与子元素。

有办法让范围始终与 div#text 相关吗?

最佳答案

你可以使用我的Rangy图书馆及其新的TextRange module ,它提供了 Range 和 Selection 方法,用于在容器元素的可见文本内进行字符偏移量的转换。例如:

var container = document.getElementById("text");
var sel = rangy.getSelection();
if (sel.rangeCount > 0) {
    var range = sel.getRangeAt(0);
    var rangeOffsets = range.toCharacterRange(container);
}

rangeOffsets 具有相对于 container 内可见文本的属性 startend。可见文本不一定与 jQuery 的 text() 方法返回的内容相同,因此您需要使用 Rangy 的 innerText() 实现。示例:

http://jsfiddle.net/timdown/KGMnq/5/

或者,如果您不想使用 Rangy,您可以改编我的函数 posted on Stack Overflow before 。但是,这些依赖于 DOM Range 和 Selection API,因此无法在 IE < 9 上运行。

关于Javascript 获取与父元素相比的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10919680/

相关文章:

javascript - 将文本和后面的字母替换为其他文本

extjs - 记住刷新 extjs 网格中的选定行后

css - 更改悬停在 SCSS/CSS 中自定义颜色的文本选择内的下划线颜色?

algorithm - 使用预处理在 O(1) 时间内查询数组中的范围中值

javascript - 如何修改包含跨度的节点?

javascript - 在 LocalStorage 中构建数组

javascript - 如何缩小自定义Chartjs水平线的高度并增加线宽?

jQuery 选择性悬停

python - 如何从列表中收集范围?

javascript - 从 html 输入值调用数组