javascript - jquery 获取点击后的光标位置

标签 javascript jquery

我有一个包含大量输入/文本区域的表单,使用该表单的管理员可以将动态值添加到文本中,例如:页面标题 =“您好{name},欢迎来到{shop_name}”。在表单的底部,我有一个所有可用动态值的列表。

问:我想做的是点击列表中的一个值,它会找出先前输入的焦点并插入该值。

更简单地说我将如何制作this jsFiddle这个 input=text 的工作方式与它对 textarea 的工作方式一样吗?因此,如果我将光标放在输入字段中,它将在此处添加 foo 值而不是文本区域。

HTML

<form action="" method="post">     
    <label for="name">Name:</label> 
    <input name="name" type="text" />

    <label for="message">Message:</label> 
   <textarea name="message">Lorem ipsum dolor sit amet, consectetur adipiscing elit. </textarea>

    <input value="Submit" type="submit" />          
</form>

<h3>Insert short code</h3>
<ul class="inserts">
    <li><a href="#" data-foo="{foo_1}">Foo 1</a></li>
    <li><a href="#" data-foo="{foo_2}">Foo 2</a></li>
    <li><a href="#" data-foo="{foo_3}">Foo 3</a></li>
    <li><a href="#" data-foo="{foo_4}">Foo 4</a></li>
    <li><a href="#" data-foo="{foo_5}">Foo 5</a></li>
</ul>

JS

jQuery.fn.extend({
    insertAtCaret: function (myValue) {
        return this.each(function (i) {
            if (document.selection) {
                //For browsers like Internet Explorer
                this.focus();
                var sel = document.selection.createRange();
                sel.text = myValue;
                this.focus();
            } else if (this.selectionStart || this.selectionStart == '0') {
                //For browsers like Firefox and Webkit based
                var startPos = this.selectionStart;
                var endPos = this.selectionEnd;
                var scrollTop = this.scrollTop;
                this.value = this.value.substring(0, startPos) + myValue + this.value.substring(endPos, this.value.length);
                this.focus();
                this.selectionStart = startPos + myValue.length;
                this.selectionEnd = startPos + myValue.length;
                this.scrollTop = scrollTop;
            } else {
                this.value += myValue;
                this.focus();
            }
        });
    }
});

$(".inserts a").click(function (e) {
    e.preventDefault();
    $('textarea').insertAtCaret(
        $(this).data("foo")
    );
});

最佳答案

一种简单的方法是将光标在输入字段中的最后位置存储在一个变量中。单击一个按钮后,您可以轻松地将值插入到所需位置。足够深思熟虑了吗? ;)

编辑: 要在位置 x 上插入字符串,您可以使用此 jQuery caret plugin或在位置 x 上拆分原始输入内容并在其间添加新内容。

也许您还想看看 this thread .

我的解决方案如下:

var pos = 0;

$('yourField').on('click keypress', function () {
    pos = $(this).caret().start
});

// inside your click function you can use the following
// $.fn.caretTo( index , [ offset ] )
// to add input to a specific position

关于javascript - jquery 获取点击后的光标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17613431/

相关文章:

选择触发器上的 jQuery 在 ie 中不起作用

javascript - 您可以使用书签将网页嵌入到网站吗?

jquery切换 - 在切换功能之间切换?

javascript - JQuery 按钮将侧边菜单移动到左侧并使用动画将内容 View 调整为全宽不工作

javascript - 计时器不倒计时

javascript - 部署到 Heroku 时读取 Vue 存储中的 dyno 元数据

javascript - 停用和激活电子邮件表单

php - 使用ajax设置时$_GET变量没有保持设置状态?

javascript - 拆分解析的 rss 结果

javascript - 使用 html 中的 PHP 将 HTTP post 数据从 Android 应用程序发送到服务器