停止重新定位光标

时间:2015-12-11 07:37:25

标签: javascript angularjs angularjs-directive

我有一个数字格式化的角色。

我需要将光标放在我执行插入或删除数字的位置。

目前在插入或删除后,光标会被追加到最后(我不需要这种行为,我希望光标留在那里)

  // This runs when we update the text field
  ngModelCtrl.$parsers.push(function(viewValue) {
    return viewValue.replace(/,/g, '');
  })

我的工作代码请随意从here

分叉

1 个答案:

答案 0 :(得分:1)

您可以使用输入字段的selectionStartselectionEnd属性来获取当前光标位置,然后使用setSelectionRange()方法在值更新后设置它(请参阅{ {3}}用于API参考)。

为此,您可以修改keydown事件处理程序以存储更改前的值(包括逗号)和光标位置:

$element.bind('keydown', function(event) {
    // Store previous value (including commas) and cursor position
    prevVal = $element.val();
    start = $element[0].selectionStart;
    end = $element[0].selectionEnd;

    if (key == 46) {
        // Delete pressed, so increment cursor position
        start++;
        end++;
    }
    ...
});

如果按下删除键(而不是退格键),上面的代码会增加光标位置,因为光标位置将保持不变(当然考虑到货币格式化逗号)。

然后可以修改listener函数以计算货币值的长度差异(包括格式化逗号)并在键入密钥后相应地设置光标位置:

var listener = function() {
    ...
    // Calculate new cursor position and update
    var diff = $element.val().length - prevVal.length;
    $element[0].setSelectionRange(start+diff, end+diff); 
    ....
}

有关正常工作的演示,请参阅here