Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有可能计算出p';是否发生了鼠标单击事件?_Javascript_Jquery_Html_Textarea_Mouseevent - Fatal编程技术网

Javascript 有没有可能计算出p';是否发生了鼠标单击事件?

Javascript 有没有可能计算出p';是否发生了鼠标单击事件?,javascript,jquery,html,textarea,mouseevent,Javascript,Jquery,Html,Textarea,Mouseevent,我有一个包含文本的。当点击时,我创建了一个,其中包含中的文本。有没有可能计算出点击发生在文本的哪个位置,并将的光标移动到同一点?我不这么认为,没有。DOM只知道哪个元素接收到点击事件,它不区分包含元素中的文本片段,除非它们本身就是元素。我怀疑你是否想用自己的元素标记来包装文本中的每个字符:)我猜这需要相当多的修改才能正确,而你也不可能完全正确。但您可能需要使用event.clientX和event.clientY 编辑--当我回答时,我不知道这件事。看起来很可能完全正确。 另一个想法是:设置文

我有一个包含文本的
。当点击
时,我创建了一个
,其中包含
中的文本。有没有可能计算出点击发生在
文本的哪个位置,并将
的光标移动到同一点?

我不这么认为,没有。DOM只知道哪个元素接收到点击事件,它不区分包含元素中的文本片段,除非它们本身就是元素。我怀疑你是否想用自己的元素标记来包装文本中的每个字符:)

我猜这需要相当多的修改才能正确,而你也不可能完全正确。但您可能需要使用event.clientX和event.clientY

编辑--当我回答时,我不知道这件事。看起来很可能完全正确。


另一个想法是:设置文本区域的样式,使其看起来像纯文本,并在单击时重新设置样式,使其看起来像表单字段。

希望这个简单的示例有帮助:

<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>

函数getPosition()
{   
var currentRange=window.getSelection().getRangeAt(0);
返回电流范围.endOffset;
}
功能设置位置(elemId、caretPos){
var elem=document.getElementById(elemId);
if(elem!=null){
if(元素createTextRange){
var range=elem.createTextRange();
range.move('character',caretPos);
range.select();
}
否则{
如果(元素选择开始){
元素焦点();
元素设置选择范围(caretPos,caretPos);
}
其他的
元素焦点();
}
}
}
功能测试()
{
setPosition('testId',getPosition());
}

1234567890

123467890

或者您可以使用第三方JS库,如jQuery—请参阅。

ooo,我喜欢这种替代方案。在未来的发展中,我可能不得不对此进行修补。好主意:textarea样式。这也是我想到的最好的事情,但我仍然看到一些缺点,例如,当在
中输入多个段落时,以后可能需要将其拆分为单独的
。看来我会在这方面或那方面妥协。@Yeti的回答似乎与你所说的相矛盾,David。这也是我不知道的。@morgancodes:我当然希望雪人的解决方案能奏效。我得留着它,以防我遇到同样的事情:)@jpalecek塞维利亚的理发师用jQuery?@peter@jpalecek那个雕像。我们现在能停止吗?谢谢你的回答!我真的希望这能奏效;希望在接下来的几天里有机会尝试一下。