在CoffeeScript/JavaScript中使用鼠标光标位置作为范围起点
Using mouse cursor position as a range starting point in CoffeeScript/JavaScript
正如标题所述,我想使用光标的位置作为范围的起点。
现在有像这样的简单样本
<html>
.
.
<p>The quick brown fox jumps over the lazy dog</p>
.
.
</html>
在CS/JS方面,我将事件侦听设置为鼠标移动,试图打印出光标位置的偏移量,但我没有使用正确的方法,最终得到undefined
或no method error
s。
再次,非常简单的CS暂时,因为我真的只是想测试一下。
$(document).ready ->
$(document).mousemove ->
target = event.target
console.log("#{target.offset()}") // also tried .rangeOffset .offset
理想情况下,我想要一些可以输入到range.setStart()
函数中的内容。
例如,如果我将鼠标悬停在fox中的f上,我希望偏移量返回为16,这样我就可以像range.setStart(target,16)
那样设置范围的开始。
如果能为我指明正确的方向,我们将不胜感激。
编辑:在输入并提交后,我意识到期望元素给我回偏移信息是多么愚蠢我迷路了,请指引我。
经过大量的谷歌搜索和数小时的故障排除,我终于找到了一个适合我的解决方案。
函数document.caretPositionFromPoint()
或Webkit的函数document.caretRangeFromPoint()
从事件中获取X和Y坐标,并返回插入符号位置,然后我可以使用该位置创建范围的起点。
$(document).ready ->
setRange = (event) ->
if document.caretPositionFromPoint
#for Firefox
else if document.caretRangeFromPoint
range = document.caretRangeFromPoint(event.pageX, event.pageY)
targetNode = range.startContainer
offset = range.startOffset
range.setStart(targetNode, offset)
range.setEnd(targetNode, 10) #just to test
sel = window.getSelection()
sel.removeAllRanges()
sel.addRange(range)
element = document.getElementById("content")
element.addEventListener('mousemove', setRange, true) #eventlistener instead of .mousemove for event bubbling
您应该使用pageX或pageY,就像这个
$(document).ready ->
$(document).mousemove (e) ->
console.log("#{e.pageX}")
console.log("#{e.pageY}")
如果您需要获得相对于div的位置,例如
$(document).ready ->
$(document).mousemove (e) ->
console.log("#{e.pageX - $('#divID').offset().left}")
console.log("#{e.pageY - $('#divID').offset().top}")
应用到你的案例中,它会给你类似于的东西
$(document).ready ->
$('p').mousemove (e) ->
console.log("#{e.pageX - $('p').offset().left}")
console.log("#{e.pageY - $('p').offset().top}")
将鼠标移到包含文本的段落上会使您的鼠标位于段落中
看看它在这里工作http://jsfiddle.net/zXnk9/
编辑
如果你需要获得你悬停的角色的索引,你可以使用这样的技巧:
将文本包装在一个与文本宽度完全相同的容器中
<span>The quick brown fox jumps over the lazy dog</span>
然后进行以下计算
$(document).ready ->
// define the container for the text you are intersted in
container = $('span')
// on mouseover
container.mouseover (e) ->
// get container width
container_width = container.width()
// compute the avg character width base on the container width and the number of characters contained in your text.
// (If you have some complex formatting inside your container, you would have to adjust this calculation.)
char_width = p_width / container.text().length
// get the position of your mouse inside
position_inside = e.pageX - container.offset().left
// define the index of the character you are interested in
char_index = Math.floor(position_inside / char_width) - 1
// use it as you wish
// print it for example
console.log("#{char_index}")
你可以在这里检查它的工作情况。我已经将事件设置为点击,这样你就可以在福克斯的f上准确地尝试它,它返回16。http://jsfiddle.net/zXnk9/1/
编辑2:为了一种可靠的方式来做你正在尝试做的
加载文档时,将容器中的每个字符放入一个html节点中,如
$(document).ready ->
// set your container
container = $('span')
// define a replacement text string
replacement_container_text = ''
// iterate over each character inside your container
$(container.text().split('')).each (i, char) ->
// put it inside a span and add it to your replacement text string
replacement_container_text += '<span>' + char + '</span>'
// set the replacement text string as the html content of your container
// this replaces the original text with the initial text with each
// character wrapped into a span
// (which can then be caught as targets for your mousemove events)
container.html(replacement_container_text)
然后,您可以使用以下获取鼠标所在字符的索引
container.mousemove (e) ->
range_start = container.children('span').index $(e.target)
console.log(range_start)
这将适用于多行容器、段落等。
参见工作示例http://jsfiddle.net/2TBFV/
- 自定义函数中的光标位置
- jQuery/Javascript>on单击将文本放置在最后一个已知的光标位置
- 当用户单击按钮(在光标位置)时,在输入字段中添加一个文本字符串
- 如何在按键事件发生后获取文本光标的位置
- 内容可编辑分区-根据内部HTML位置的光标位置
- 保持光标位置元素在顶部使用 svg
- 保存键控触发器时保持光标位置的最佳做法
- 如何在java脚本中获取光标位置
- 获取光标位置或光标在 TinyMCE 中的行数
- 如何在每次页面重新加载时更改渐变背景,同时保持光标位置元素处于活动状态
- 在Chrome中,光标位置异常地位于输入值的末尾
- 在光标位置的文本区域中插入一个字符串,并进行一些更改
- 如何从谷歌地图事件访问光标位置(即页面的x和y轴)
- 如何在光标所在的位置绘制线条?HTML5画布使用MrDoob's和谐
- 如何在网页加载asp.net上显示文本框中第二个字母的光标位置
- 当前光标位置(百分比)
- GWT:如何从当前光标位置或所选文本中获取css样式的属性
- 在光标位置插入HTML,并使用javascript将光标移动到插入的HTML的末尾
- jQuery:使用插件Tipsy将工具提示附加到鼠标光标位置
- 不带HTML的光标位置需要转换为带HTML的位置