WedX - журнал о программировании и компьютерных науках

Маска ввода кредитной карты при размытии

У меня есть ввод в моей форме, который принимает номер кредитной карты.

  <input type="text" class="form-control" name="CCnumber" ng-model="CCnumber" ng-blur="balanceParent.maskCreditCard(this)">

При размытии я хотел бы замаскировать ввод кредитной карты следующим образом:

4444************

И затем, в фокусе, я хотел бы вернуть исходный номер кредитной карты:

4444333322221111

Используя ng-blur, я могу сделать простой javascript, чтобы вернуть замаскированный ввод.

    vm.maskCreditCard = function(modalScope) {
      if(modalScope.CCnumber){
      var CCnumber = modalScope.CCnumber.replace(/\s+/g, '');
      var parts = CCnumber.match(/[\s\S]{1,4}/g) || [];
      for(var i = 0; i < parts.length; i++) {
        if(i !== 0) {
        parts[i] = '****';
      }
    }
    modalScope.CCnumber = parts.join("");
  }
};

Моя проблема заключается в том, чтобы вернуть этот номер, как только пользователь снова сосредоточится на вводе. Есть ли способ сохранить начальное значение ввода, а также замаскировать его?


  • конечно, просто добавьте новую переменную. 06.10.2015

Ответы:


1

Я бы создал директиву атрибута для этого. Лучшей практикой Angular является управление DOM внутри директивы, а не контроллера.

В вашем случае, когда вы привязываете событие blur к элементу, вы должны сохранить текущее значение в переменную. Затем вы можете получить доступ к этой переменной при привязке события focus.

 angular.module('CreditApp', [])
     .directive('maskInput', function() {
         return {
             restrict: "A",
             link: function(scope, elem, attrs) {
                 elem.bind("blur", function() {
                     var number = elem.val();
                     elem.val(elem.val().slice(0,4) + elem.slice(4).replace(/\d/g, '*'));
                 });
                 elem.bind("focus", function() {
                     elem.val(number);
                });
             }
        }
  });

Я только что создал plunkr для этого

https://plnkr.co/edit/ZywTmF7xfz2FyvRULLjL?p=preview

Попробуйте ввести номер кредитной карты в поле ввода и щелкните за его пределами. Это событие blur, и номер кредитной карты будет замаскирован. Теперь снова щелкните внутри поля, и значение будет восстановлено.

06.10.2015
  • Имеет смысл. Спасибо! Сохранит ли это значение ng-модели? 06.10.2015

  • 2

    Вы можете использовать атрибуты data-, чтобы сохранить его. Я знаю версию jQuery:

    $(function () {
      $("#cCard").blur(function () {
        cCardNum = $(this).val();
        $(this).data("value", cCardNum);
        if (cCardNum.length > 4) {
          $(this).val(cCardNum.substr(0, 4) + "*".repeat(cCardNum.length - 4))
        }
      }).focus(function () {
        $(this).val($(this).data("value"));
      });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <input type="text" id="cCard" />

    Это полифилл для функции String.prototype.repeat:

    if (!String.prototype.repeat) {
      String.prototype.repeat = function(count) {
        'use strict';
        if (this == null) {
          throw new TypeError('can\'t convert ' + this + ' to object');
        }
        var str = '' + this;
        count = +count;
        if (count != count) {
          count = 0;
        }
        if (count < 0) {
          throw new RangeError('repeat count must be non-negative');
        }
        if (count == Infinity) {
          throw new RangeError('repeat count must be less than infinity');
        }
        count = Math.floor(count);
        if (str.length == 0 || count == 0) {
          return '';
        }
        // Ensuring count is a 31-bit integer allows us to heavily optimize the
        // main part. But anyway, most current (August 2014) browsers can't handle
        // strings 1 << 28 chars or longer, so:
        if (str.length * count >= 1 << 28) {
          throw new RangeError('repeat count must not overflow maximum string size');
        }
        var rpt = '';
        for (;;) {
          if ((count & 1) == 1) {
            rpt += str;
          }
          count >>>= 1;
          if (count == 0) {
            break;
          }
          str += str;
        }
        return rpt;
      }
    }
    
    06.10.2015

    3

    Найдите рабочий плункер для директивы angularjs для форматирования номера карты в xxxxxxxxxxxx3456 Fromat. Маскировка номера карты

    angular.module('myApp', [])
    
       .directive('maskInput', function() {
        return {
                require: "ngModel",
                restrict: "AE",
                scope: {
                    ngModel: '=',
                 },
                link: function(scope, elem, attrs) {
                    var orig = scope.ngModel;
                    var edited = orig;
                    scope.ngModel = edited.slice(4).replace(/\d/g, 'x') + edited.slice(-4);
    
                    elem.bind("blur", function() {
                        var temp;
                        orig  = elem.val();
                        temp = elem.val();
                        elem.val(temp.slice(4).replace(/\d/g, 'x') + temp.slice(-4));
                    });
    
                    elem.bind("focus", function() {
                        elem.val(orig);
                   });  
                }
           };
       })
      .controller('myCtrl', ['$scope', '$interval', function($scope, $interval) {
        $scope.creditCardNumber = "1234567890123456";
      }]);
    
    23.09.2016
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]