#javascript #forms #dom
Вопрос:
Мои навыки работы с JavaScript немного позеленели, но я пытаюсь улучшить следующее:
В настоящее время я использую скрипт для создания одного элемента ввода в форме с помощью атрибута имени ввода:
HTML:
<input type="number" class="form-control"
id="floatingInputGrid"
name="hoursstagingbudget" value="0" >
<label for="floatingInputGrid">Hours Staging Budget</label>
язык JavaScript:
var nameElement = document.forms.inputform.hoursstagingbudget
function nameFocus(e) {
var element = e.target || window.event.srcElement;
if ( element.value == "0" )
element.value = "";
}
function nameBlur(e) {
var element = e.target || window.event.srcElement;
if ( element.value === "" )
element.value = "0";
}
if ( nameElement.addEventListener ) {
nameElement.addEventListener("focus", nameFocus, false);
nameElement.addEventListener("blur", nameBlur, false);
} else if ( nameElement.attachEvent ) {
nameElement.attachEvent("onfocus", nameFocus);
nameElement.attachEvent("onblur", nameBlur);
}
Я хочу, чтобы все входные данные числового типа вели себя таким образом — я использую document.form…is для этого существует метод » тип «или просто метод «имя»?
Если нет, я думал, что буду использовать массив входных имен, но мне тоже не очень повезло применить эту идею.
Ищете самый разумный способ подойти к этому и выйти за рамки одного названного ввода в наилучшем возможном СУХОМ подходе. Заранее спасибо.
Ответ №1:
Я бы использовал DOM (объектную модель документа), чтобы получить все входные данные и подключить прослушиватель событий (использование document.forms
и т. Д. Не рекомендуется) :
var inputs = document.getElementById("yourformidhere").getElementsByTagName("input");
for(var i = 0; i < inputs.length; i ) {
var currentElement = inputs[i];
if(currentElement.addEventListener) {...};
else if (currentElement.attachEvent) {...};
}
Вот учебник о том, как использовать DOM, если вам интересно
Комментарии:
1. Спасибо за это! Работает так, как мне было нужно. Вырвал меня из моего туннельного видения!
Ответ №2:
Вероятно, лучше всего было бы использовать document.querySelectorAll
(документы). Это вернет вам список (не массив) всех элементов, соответствующих css-селектору, который вы передаете. Предполагая, что все ваши входные данные содержат class="form-control"
этот код, он должен делать то, что вы описали.
const inputElements = document.querySelectorAll(".form-control");
for(let i = 0; i < inputElements.length; i ){
if ( nameElement.addEventListener ) {
inputElements[i].addEventListener("focus", nameFocus, false);
inputElements[i].addEventListener("blur", nameBlur, false);
} else if ( nameElement.attachEvent ) {
inputElements[i].attachEvent("onfocus", nameFocus);
inputElements[i].attachEvent("onblur", nameBlur);
}
}
Ответ №3:
FWIW, в моем случае мне это было нужно только для ввода типа «число», и это окончательное решение, которое сработало (немного расширяя ответ PhoenixXKN):
var inputs=document.getElementById("inputform").getElementsByTagName("input");
for(var i = 0; i < inputs.length; i ) {
if(inputs[i].type.toLowerCase() == 'number') {
var currentElement = inputs[i];
if(currentElement.addEventListener) {...}
else if (currentElement.attachEvent) {...};
}
}