Получить элемент по идентификатору, который не работает | JavaScript

#javascript

#javascript

Вопрос:

У меня есть простая форма оформления заказа, работающая на CardJs, но поле ММ / ГГ не работает при вызове onblur:

введите описание изображения здесь

Мой js-код:

     var elCard = document.getElementById("number-cc");
    var elMonth = document.getElementById("month-cc");
    var elYear = document.getElementById("year-cc");
    var elCvc = document.getElementById("cvc-cc");
    elCard.onblur = createToken;
    elMonth.onblur = createToken;
    elYear.onblur = createToken;
    elCvc.onblur = createToken;
  

Мой HTML-код:

                           <div class="card-js" data-icon-colour="#158CBA">
                           <input class="card-number form-control"
                                  name="my-custom-form-field__card-number"
                                  placeholder="Número do cartão"
                                  autocomplete="off"
                                  id="number-cc"
                                  required>
                           <input class="name" id="name-cc" name="name"
                                  placeholder="Nome impresso no cartão"
                                  required>
                           <input class="expiry-month" placeholder="MM" id="month-cc" required>
                           <input class="expiry-year" placeholder="AA" id="year-cc" required>
                           <input class="cvc" id="cvc-cc" required>

                        </div>
  

Остальные поля формы ( number-cc и cvc-cc ) работают правильно. Мне интересно, является ли ошибка причиной того, что этот ввод (ММ / ГГ) объединен только в одном поле. Когда страница загружается, она создает другую input без атрибута id, как показано ниже:

введите описание изображения здесь

Есть идеи, как я могу достичь onblur в этом поле ММ / ГГ?

CardJs:https://github.com/CardJs/CardJs/blob/master/examples/02_customise-fields.html

Спасибо!

РЕДАКТИРОВАТЬ: я не знаю, не могу ли я получить селектор запроса, потому что есть некоторые другие классы ‘expiry’ выше input class='expiry' , как упоминалось ранее. Вот полный код, загруженный на страницу:

введите описание изображения здесь

РЕДАКТИРОВАТЬ 2:

Публикация полного js-кода:

     PagSeguroDirectPayment.setSessionId(session_id);
    console.log(session_id);

    var elName = document.getElementById("name-cc");
    elName.onblur = createHash;

    console.log(document.querySelector('input.expiry'));
    document.querySelector('input.expiry').onblur = console.log('Hello');

    var flag;

    function createHash() {
        PagSeguroDirectPayment.onSenderHashReady(function(response){
            if(response.status == 'error') {
                console.log(response.message);
                return false;
            }
            var hash = response.senderHash; //Hash estará disponível nesta variável.
            var elToken = document.getElementById("hash");
            elToken.setAttribute("value", hash);
        });
    }

    var elCard = document.getElementById("number-cc");
    var elMonth = document.getElementById("month-cc");
    var elYear = document.getElementById("year-cc");
    var elExpiry = document.querySelector('input.expiry');
    var elCvc = document.getElementById("cvc-cc");

    elCard.onblur = createToken;
    elExpiry.onblur = createToken;
    elCvc.onblur = createToken;

    function createToken() {

        var sixDig = elCard.value.substring(0,7).replace(/s /g, '');

        PagSeguroDirectPayment.getBrand({
            cardBin: sixDig,
            success: function(response) {
             flag = response.brand.name;
            },
            error: function(response) {
              console.log(response);
            },
            complete: function(response) {
              console.log(response);
            }
        });

            console.log('Card #: '   elCard.value);
            console.log('Mês: '   elMonth.value);
            console.log('Ano: '   elYear.value);
            console.log('CVC: '   elCvc.value);
            console.log('Bandeira: '   flag);
            console.log("Expiry: "   elExpiry.value);


        PagSeguroDirectPayment.createCardToken({
            cardNumber: elCard.value.replace(/ /g,''), // Número do cartão de crédito
            brand: flag, // Bandeira do cartão
            cvv: elCvc.value, // CVV do cartão
            expirationMonth: elMonth.value, // Mês da expiração do cartão
            expirationYear: 20   elYear.value, // Ano da expiração do cartão, é necessário os 4 dígitos.

            success: function(response) {
                var token = response.card.token;
                console.log('Token do cartão: '   token);
                var elToken = document.getElementById("token");
                elToken.setAttribute("value", token);
            },
            error: function(response) {
                console.log(response);
                // Callback para chamadas que falharam.
            },
            complete: function(response) {
                console.log(response);
                // Callback para todas chamadas.
            }
        });
    }
  

Ответ №1:

Обратите внимание, что ввод#month-cc и ввод #year-cc имеют type="hidden" значение, поэтому они не видны в браузере.

То, что вы на самом деле хотите настроить для onblur, это:

 const expiry = document.querySelector('input.expiry')
expiry.onblur = createToken
  

Редактировать:

Если есть другие элементы, на которые можно настроить таргетинг input.expiry , тогда вам нужно быть более конкретным, чтобы убедиться, что вы нацелены на правильный.

Вы можете попробовать: document.querySelector('.expiry-container .expiry-wrapper div input.expiry')

Если это все еще не работает, вы можете использовать document.querySelectorAll и выяснить, какой индекс является вашим целевым вводом, и добавить к нему прослушиватель событий onblur

Комментарии:

1. have type="hidden" какой вопрос вы читаете?

2. посмотрите на скриншот

3. @Doron, я запустил код, но onblur все еще не работает =/ Я только что сделал это: var elCard = document.getElementById(«number-cc»); var elYear = document. Выбор запроса (‘input.expiry’) var elCvc = document.getElementById(«cvc-cc»); elCard.onblur = createToken; elYear.onblur = createToken; elCvc.onblur = createToken;

4. elYear определяется при попытке его регистрации?

5. Да: var elExpiry = document. Выбор запроса(«ввод.истечение срока действия»); elExpiry.onblur = createToken;