【发布时间】:2010-09-02 14:51:19
【问题描述】:
我有一个包含文本的<p>。单击<p> 时,我会创建一个<textarea>,其中包含来自<p> 的文本。是否可以在<p> 的文本中计算在哪里点击发生,并将<textarea> 的光标移动到同一点?
【问题讨论】:
标签: javascript jquery html textarea mouseevent
我有一个包含文本的<p>。单击<p> 时,我会创建一个<textarea>,其中包含来自<p> 的文本。是否可以在<p> 的文本中计算在哪里点击发生,并将<textarea> 的光标移动到同一点?
【问题讨论】:
标签: javascript jquery html textarea mouseevent
我不相信,不。 DOM 只知道哪个包含元素收到了点击事件,它不区分包含元素中的文本片段,除非它们本身就是元素。而且我怀疑你想用自己的元素标签来包装文本中的每个字符:)
【讨论】:
希望这个简单的例子有所帮助:
<html>
<head/>
<body>
<script type='text/javascript'>
function getPosition()
{
var currentRange=window.getSelection().getRangeAt(0);
return currentRange.endOffset;
}
function setPosition(elemId, caretPos) {
var elem = document.getElementById(elemId);
if(elem != null) {
if(elem.createTextRange) {
var range = elem.createTextRange();
range.move('character', caretPos);
range.select();
}
else {
if(elem.selectionStart) {
elem.focus();
elem.setSelectionRange(caretPos, caretPos);
}
else
elem.focus();
}
}
}
function test()
{
setPosition('testId', getPosition());
}
</script>
<p onclick = 'test()'>1234567890</p>
<textarea id='testId'>123467890</textarea>
</body>
</html>
或者您可以使用第三方 JS 库,例如 jQuery - 请参阅 this example。
【讨论】:
我猜这需要相当多的摆弄才能做到正确,而您将无法完全正确。但您可能会想要使用 event.clientX 和 event.clientY。
编辑——我回复时不知道这些东西。看起来很可能让它完全正确。 http://www.quirksmode.org/dom/range_intro.html
另一种想法:设置 textarea 的样式,使其看起来像纯文本,然后重新设置样式,使其在被点击时看起来像一个表单域。
【讨论】:
<textarea> 中输入了多个段落时,可能需要稍后将其拆分为单独的<textarea>s。看来我会在某一方面做出妥协。