浏览器页面中所选文本的坐标
我需要文本选择开头的像素坐标(页面上的任何位置,而不是文本区域中)。
我尝试使用光标坐标,但这效果不太好,因为光标坐标和选择的开头并不总是相同(例如,当用户拖动文本时)。
我希望有人能提供解决方案!
I need the coordinates in pixels of the beginning of the text selection (anywhere on the page, not in a textarea).
I tried using the cursor coordinates but this didn't work quite well because the cursor coordinates and the beginning of the selection are not always the same (for example when a user drags over a text).
I hope someone has the solution!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在 IE >= 9 和非 IE 浏览器(Firefox 4+、2009 年初发布的 WebKit 浏览器、Opera 11,可能更早)中,您可以使用
getClientRects()
方法范围
。在 IE 4 - 10 中,您可以使用可从所选内容中提取的TextRange
的boundingLeft
和boundingTop
属性。这是一个可以在最新浏览器中执行您想要的操作的函数。请注意,在某些情况下,您可能会错误地获取坐标
0, 0
,如 @Louis 的评论中所述。在这种情况下,您将不得不退回到临时插入元素并获取其位置的解决方法。jsFiddle:http://jsfiddle.net/NFJ9r/132/
代码:
更新
根据评论,我提交了一个 WebKit 错误,现在已修复
https://bugs.webkit.org/show_bug.cgi?id=65324
In IE >= 9 and non-IE browsers (Firefox 4+, WebKit browsers released since early 2009, Opera 11, maybe earlier), you can use the
getClientRects()
method ofRange
. In IE 4 - 10, you can use theboundingLeft
andboundingTop
properties of theTextRange
that can be extracted from the selection. Here's a function that will do what you want in recent browsers.Note that there are some situations in which you may wrongly get co-ordinates
0, 0
, as mentioned in the comments by @Louis. In that case you'll have to fall back to a workaround of temporarily inserting an element and getting its position.jsFiddle: http://jsfiddle.net/NFJ9r/132/
Code:
UPDATE
I submitted a WebKit bug as a result of the comments, and it's now been fixed.
https://bugs.webkit.org/show_bug.cgi?id=65324
如果插入符号位于空元素中,TimDown 的上述答案不起作用。
下面的代码解决了该问题。请注意,它与 TimDown 的解决方案几乎相同,只是此代码在调用
range.getClientRects() 之前检查
range.getClientRects()
数组是否具有length>0
0]The above answer by TimDown does not work if the caret is in an empty element.
The code below solves the problem. Note how it is almost identical to TimDown's solution except that this code checks the
range.getClientRects()
array haslength>0
before callingrange.getClientRects()[0]
下面的代码是 Tim Down 给出的解决方案的简化和现代化版本。它还使用了更加浏览器兼容的选择 API (
window.getSelection()
而不是window.document.selection
)The code below is a simplified and modernized version of the solution given by Tim Down. It also uses a more browser compatible selection API (
window.getSelection()
instead ofwindow.document.selection
)