Как изменить цвет метки, когда поле ввода получает текст? - PullRequest
0 голосов
/ 26 мая 2018

Я не понимаю, почему я получаю эту ошибку, когда я связываю свой JavaScript с несколькими страницами.Я пытаюсь использовать JavaScript, чтобы изменить цвет метки формы, как только ее поле ввода содержит текст.Он отлично работает в разделе «Вход», но не работает и выдает ошибку, когда я связываю его с файлом SignUp.html.Вот ссылка на мой проект на codepen, если вы не пример того, о чем я говорю.Я очень ценю любую помощь !!спасибо!

// LOGIN INPUT VARIABLES
let usernameInput = document.querySelector("#usernameInput");
let passwordInput = document.querySelector("#passwordInput");
// SIGN UP INPUT VARIABLES
let firstNameInput = document.querySelector("#firstNameInput");
let lastNameInput = document.querySelector("#lastNameInput");

usernameInput.addEventListener("input", function() {
    document.querySelector("#usernameLabel").style.color = "#98589e";
    if (usernameInput.value == '') {
        document.querySelector("#usernameLabel").style.color = "#b9c0c8";
    }
});

passwordInput.addEventListener("input", function() {
    document.querySelector("#passwordLabel").style.color = "#98589e";
    if (passwordInput.value == '') {
        document.querySelector("#passwordLabel").style.color = "#b9c0c8";
    }
});

firstNameInput.addEventListener("input", function() {
    document.querySelector("#firstNameLabel").style.color = "#98589e";
    if (firstNameInput.value == '') {
        document.querySelector("#firstNameLabel").style.color = "#b9c0c8";
    }
});

lastNameInput.addEventListener("input", function() {
    document.querySelector("#lastNameLabel").style.color = "#98589e";
    if (lastNameInput.value == '') {
        document.querySelector("#lastNameLabel").style.color = "#b9c0c8";
    }
});

https://codepen.io/EricGFig/project/editor/ZgPgRe

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Причина, по которой ваш код дает сбой, заключается в том, что вы пытаетесь присоединить прослушиватель событий к несуществующему элементу (null).

Чтобы решить эту проблему, создайте два отдельных файла JS или добавьте оператор if вокруг ваших слушателей:

// LOGIN INPUT VARIABLES
let usernameInput = document.querySelectorAll(".usernameInput");
let passwordInput = document.querySelectorAll(".passwordInput");
// SIGN UP INPUT VARIABLES
let firstNameInput = document.querySelectorAll(".firstNameInput");
let lastNameInput = document.querySelectorAll(".lastNameInput");

if (usernameInput) {
  usernameInput.addEventListener("input", function() {
    document.querySelector("#usernameLabel").style.color = "#98589e";
    if (usernameInput.value == '') {
        document.querySelector("#usernameLabel").style.color = "#b9c0c8";
    }
  });
}

if (passwordInput) {
  passwordInput.addEventListener("input", function() {
    document.querySelector("#passwordLabel").style.color = "#98589e";
    if (passwordInput.value == '') {
        document.querySelector("#passwordLabel").style.color = "#b9c0c8";
    }
  });
}

if (firstNameInput) {
  firstNameInput.addEventListener("input", function() {
    console.log('!!');
    document.querySelector("#firstNameLabel").style.color = "#98589e";
    if (firstNameInput.value == '') {
        document.querySelector("#firstNameLabel").style.color = "#b9c0c8";
    }
  });
}

if (lastNameInput) {
  lastNameInput.addEventListener("input", function() {
    document.querySelector("#lastNameLabel").style.color = "#98589e";
    if (lastNameInput.value == '') {
        document.querySelector("#lastNameLabel").style.color = "#b9c0c8";
    }
  });
}
0 голосов
/ 26 мая 2018

Как уже говорилось в других ответах, код завершается сбоем, потому что он пытается найти объект DOM, который не существует.

Хотя я бы справился с этим, используя классы CSS.Я бы заменил ваш JS на:

var trigger = document.getElementsByClassName('input-trigger')
for(var i = 0; i < trigger.length; i++) {
  trigger[i].addEventListener("input", addListener);
}

function addListener() {
    var labels = this.parentNode.childNodes;      
    for(var i = 0; i < labels.length; i++) {
        if (labels[i].className == 'input-validate') {
            if (this.value === '') {        
              labels[i].style.color = "#b9c0c8";
            } else {
              labels[i].style.color = "#98589e";
            }
        }
    }
}

Тогда вам просто нужно добавить класс 'input-trigger' к входам, которые вы хотите вызвать изменение цвета и 'input-validate' кметки, цвета которых вы хотите изменить.

Приведенный выше код более лаконичен.Он запускается первым классом, затем просматривает родительский элемент инициирующего элемента, а затем выбирает любые метки с классом 'input-validate' внутри этого родительского элемента.

Вот пример фрагмента этого кода:

var trigger = document.getElementsByClassName('input-trigger')
for(var i = 0; i < trigger.length; i++) {
  trigger[i].addEventListener("input", addListener);
}


function addListener() {
 	var labels = this.parentNode.childNodes;      
    for(var i = 0; i < labels.length; i++) {
      if (labels[i].className == 'input-validate') {
      	if (this.value === '') {      	
          labels[i].style.color = "#b9c0c8";
        } else {
          labels[i].style.color = "#98589e";
        }
      }
    }
 }
<ul class="form-list">
  <li class="form-list-row">
    <label id="usernameLabel" class='input-validate'>Username or Email</label><br>
    <input id="usernameInput" class='input-trigger' type="text" required>
  </li>
  <li class="form-list-row">
    <label id="passwordLabel" class='input-validate'>Password</label><br>
    <input id="passwordInput" class='input-trigger' type="password" required>
  </li>
</ul>

Хотя любой из приведенных примеров будет работать, я всегда предпочитаю попробовать написать краткий код многократного использования.

Надеюсь, это поможет!

0 голосов
/ 26 мая 2018

Ошибка:

Uncaught TypeError: Невозможно прочитать свойство addEventListener со значением NULL

Указывает на строку 8. Действительно, в вашем файле signUp.htmlу вас нет элемента с именем #usernameInput (на самом деле #passwordInput).

Так что usernameInput и passwordInput оба не определены при загрузке этого файла в signUp.html (они определяются только при загрузке вlogIn.html)

Поэтому вам не следует использовать один и тот же файл JavaScript для двух страниц.

У вас должен быть только следующий код JavaScript для страницы signUp.html:

let firstNameInput = document.querySelector("#firstNameInput");
let lastNameInput = document.querySelector("#lastNameInput");

firstNameInput.addEventListener("input", function() {
    document.querySelector("#firstNameLabel").style.color = "#98589e";
    if (firstNameInput.value == '') {
        document.querySelector("#firstNameLabel").style.color = "#b9c0c8";
    }
});

lastNameInput.addEventListener("input", function() {
    document.querySelector("#lastNameLabel").style.color = "#98589e";
    if (lastNameInput.value == '') {
        document.querySelector("#lastNameLabel").style.color = "#b9c0c8";
    }
});

Если вы действительно хотите сохранить один файл JavaScript, рассмотрите возможность использования функций для разделения кода.Например, есть функция для обработки стиля входа и еще одна для обработки стиля регистрации.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...