【问题标题】:Is it possible to simulate a keypress in AngularJS?是否可以在 AngularJS 中模拟按键?
【发布时间】:2019-01-14 14:13:08
【问题描述】:

每当按逗号 (,) 进行十进制输入而不是文本时,我都需要在输入上写入点 (.)。我需要以某种方式模拟 Keypress 或 KeyDown 编程。

我尝试了所有答案here,但都没有奏效:

我为输入编写了以下指令代码:

app.directive('ngKommatopoint', function() {
    return {
      link : function($scope, element, attrs) {
              element.bind("keydown keypress", function(event) {
                      if(event.which === 188) {
                          element.trigger(
                              $.Event( 'keydown', { keyCode:190,which:190})
                          );
                     }
                  });
          },
    restrict: 'A'
  };  });

此解决方案不起作用,因为它从不调用“Dot”事件。知道为什么它不起作用吗?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    在 ngModelController 上使用解析器/格式化程序来拦截用户输入。

    您的解决方案将跳过复制/粘贴,但解析器/格式化程序不会。

    https://dzone.com/articles/parsers-and-formatters-custom

    您可以处理模型的所有更改并根据需要对其进行解析

    更新

    这里是小提琴:https://jsfiddle.net/gudzdanil/un56mjez/2/

    
    app.directive('nodot', function(){
      return{
        require:'ngModel',
        link: function(scope, elem, attrs, ctrl){
          ctrl.$parsers.unshift(replace);
          function replace(val){
            var newVal = val.replace(/,/g, '.');
                    ctrl.$viewValue = newVal;
            ctrl.$render()
                    return newVal;
          }
        }
      };
    });
    

    【讨论】:

    • 这适用于文本。十进制怎么写?这正是我正在寻找的。​​span>
    • 你可以替换所有非小数
    • var newVal = val.replace(/,/g, '.').replace(/[^\d.]/g, '');
    • @Saman 使用 $parsers 你可以随心所欲地处理输入,只要写下你需要的条件
    • $commitViewValue 方法修复了在下一步解析器处理的值更新后解析器比较前一个视图值和当前值的问题,以便在第二个输入解析器不执行,因为前一个值等于当前值.检查更新jsfiddle.net/gudzdanil/un56mjez/13
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多