【发布时间】:2019-09-27 12:58:50
【问题描述】:
我正在尝试使用 window.Selection() API 从浏览器中获取我用光标选择的所有单词的数组。我可以使用 window.getSelection() 捕获选择本身,然后通过 window.getSelection().toString() 将这些内容打印出来,但不幸的是,这只是将单词连接在一起而没有空格。
相反,我想选择文本并获取每个单词的数组,因为这就是它们实际上被附加到 DOM 的方式(通过 PDF 文本层)。所以,
The brown dog jumps
返回
['The', 'brown', 'dog', 'jumps']
如果你使用 .toString(),你只需得到
Thebrowndogjumps
现在,如果我使用 .getRangeAt() 来获取范围,该对象将为我提供锚节点(即“The”)和 extentNode(即“jumps”),但我不知道如何捕捉两者之间的内容。因此,我无法选择所有文本。
注意:这是一个涉及 window.getSelection() API 的非常具体的问题 - 请不要仅仅假设这是一些基本的字符串操作废话并链接到一些“可能的重复”,除非您链接到的答案实际上讨论 getSelection API。
我特意问的是如何从返回的 .getSelection() 对象中获取单词数组。
编辑:这是我尝试过的一些触发 onKeyUp() 的代码:
handleSelect = (text) => {
const selectObj = window.getSelection();
console.log(selectObj)
let selection = selectObj.toString();
console.log(selection)
let ranges = []
for(let i = 0; i < selectObj.rangeCount; i++) {
ranges[i] = selectObj.getRangeAt(i);
}
console.log(ranges[0])
let rangeObj = ranges[0]
console.log(rangeObj.extractContents())
debugger
// let range = selectObj.getRangeAt()
// console.log(range)
}
这有点hacky,但我解决了:
handleSelect = (text) => {
const selectObj = window.getSelection();
let selection = selectObj.toString();
let ranges = []
for(let i = 0; i < selectObj.rangeCount; i++) {
ranges[i] = selectObj.getRangeAt(i);
}
let rangeObj = ranges[0]
let content = rangeObj.extractContents()
let str = ""
for (let i = 1; i < content.children.length - 1; i++) {
str += ' ' + content.children[i].innerText
}
console.log(str)
基本上,Range 对象具有 .extractContents() 作为一种方法,该方法创建一个作为 HTMLElement 列表的 documentFragment,然后您可以遍历它以创建选择字符串。
【问题讨论】:
-
请向我们展示您的尝试。没有代码,你的问题没有多大意义。
-
@yoursweater 能否请您替换图像以进行等效的代码提取,以便我可以复制并尝试使用它?
-
@RicardoRocha 实际上解决了它......关键是找出 Range.extractContents()
-
@yoursweater 不错!发布您的答案并接受它,以便其他人在需要时可以得到您的帮助。
-
@RicardoRocha 感谢您的帮助
标签: javascript dom browser selection