三星键盘光标位置问题JS setSelectionRange

时间:2017-11-21 23:41:27

标签: javascript angularjs samsung-mobile

此角度指令在数字输入字段中每三位数自动插入逗号(例如“1000”变为“1,000”)。它在我测试的所有浏览器中都正确保留了光标位置,除了三星键盘的三星手机,例如运行Android 7.0的Galaxy S8,三星体验版本8.1。

在三星上,如果我输入“1000”,则会插入逗号,我的光标会在数十位和一位之间结束,而它应该一直向右。

是否有针对此问题的已知修复程序?

angular.module('someWebApp')
  .directive('commaInput', function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, ngModelController) {
      var el = element[0];

      function clean(x) {
      while (x.toString().indexOf(",") != -1)
      {
        x = x.replace(",", "");
      }
      return x.replace(/\B(?=(?:\d{3})+(?!\d))/g, ",");
    }

      ngModelController.$parsers.push(function(val) {
        var cleaned = clean(val);

        // Avoid infinite loop of $setViewValue <-> $parsers
        if (cleaned === val) return val;

        var start = el.selectionStart + cleaned.length - val.length;
        var end = el.selectionEnd + cleaned.length - val.length;

        // element.val(cleaned) does not behave with
        // repeated invalid elements
        ngModelController.$setViewValue(cleaned);
        ngModelController.$render();

        el.setSelectionRange(start, end);
        return cleaned;
      });
    }
  }
});

html输入使用此指令(逗号输入)并具有type =“tel”。

1 个答案:

答案 0 :(得分:0)

这似乎是某些设备的问题。我在Samsung S7设备上遇到了类似的问题。我唯一可行的解​​决方案是将setSelectionRange()方法推入setTimeout()。

setTimeout(() => {
    el.setSelectionRange(selStart, selEnd);
});

可以忽略setTimeout方法上的millisecond参数,因为我们无需等待执行。