#javascript #html
#javascript #HTML
Вопрос:
Я создал 4 кнопки, и каждая кнопка имеет свой собственный идентификатор, и у меня есть функция, которая отображает заданный идентификатор элемента. поэтому я хочу применить его ко всем этим 4 кнопкам. что я сделал не так?
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<button id='b1'>Click</button>
<button id='b2'>Click</button>
<button id='b3'>Click</button>
<button id='b4'>Click</button>
<script type="text/javascript">
function show_id(element){
alert(element.id)
}
for(i=0; i!=document.getElementsByTagName('button');i ){
target = document.getElementsByTagName('button')[i]
target.onclick = show_id(target)
}
</script>
</body>
</html>
Комментарии:
1. Я думаю, было бы лучше использовать class вместо id.
2. будет ли это по-другому?
3. Вы , наверное , имели в виду
i!=document.getElementsByTagName('button').length
. В нынешнем виде вы сравниваете число с HTMLCollection, потенциально создавая бесконечный цикл, который останавливается только из-за ошибки, которую он создает внутри цикла.4. я изменил его, теперь все они предупреждают о последнем идентификаторе кнопки!
5. подождите, так вы хотели бы, чтобы кнопка, которая была нажата, делала оповещение?
Ответ №1:
Сделайте это, как показано ниже —
function show_id() {
alert(this.id)
}
var buttons = document.querySelectorAll("button");
for (var i = 0; i < buttons.length; i ) {
buttons[i].onclick = show_id;
}
<button id='b1'>Click</button>
<button id='b2'>Click</button>
<button id='b3'>Click</button>
<button id='b4'>Click</button>
Передача аргументов в событие onclick —
Использование HTML
—
function show(element, value) {
console.log(element.id);
console.log(value);
}
<button id='b1' onclick='show(this, "a")'>Click</button>
Использование JS
—
function show(value, event) {
console.log(value);
console.log(event.target.id);
}
var button = document.getElementById("b1");
button.onclick = show.bind(this, "a");
<button id='b1'>Click</button>
Но, как упоминалось @connexo, используется addEventListener
для привязки событий DOM.
Комментарии:
1. необходимо ли писать (элемент) после функции?
2. @badr, Нет, не требуется. Я удалил его.
3. я хочу знать, как использовать функцию с аргументами в атрибуте «onclick»
4. Я действительно рекомендую вам прекратить использовать циклы на основе индекса,
var
ключевое слово (если вы точно не знаете, почему вы используете его вместоconst
илиlet
), а такжеelement.onevent
-свойства. Используйте DOM API, который предлагаетelement.addEventListener(eventName, handlerFunction)
.5. @connexo, согласен! Я пытался придерживаться исходного кода, размещенного на постере, ради решения возникшей проблемы.
Ответ №2:
Вот как вы могли бы сделать это в современном JS:
for (const button of document.querySelectorAll('button'))
button.addEventListener('click', function() { console.log(this.id) })
<button id='b1'>Click</button>
<button id='b2'>Click</button>
<button id='b3'>Click</button>
<button id='b4'>Click</button>
Объяснение:
Когда вы регистрируете regular function()
в качестве прослушивателя событий, и он выполняется, потому что происходит событие, this
ключевое слово внутри функции будет указывать на элемент, на котором был зарегистрирован прослушиватель.
Комментарии:
1. Кстати, за последние 3 года я не использовал ни одного цикла for на основе индекса, и я ежедневно занимаюсь веб-разработкой как профессионал. Я рекомендую вам углубиться в
forEach
for...of
циклы и.2. я сделаю это, спасибо за помощь
Ответ №3:
Хорошо, обновите код для использования с querySelectorAll
и forEach
, возможно, это поможет вам понять.
document.querySelectorAll('button').forEach((button)=>{
button.addEventListener('click', function(){
console.log(this.id);
});
});
<button id='b1'>Click</button>
<button id='b2'>Click</button>
<button id='b3'>Click</button>
<button id='b4'>Click</button>
Комментарии:
1. Использование встроенных прослушивателей событий — действительно плохая практика кодирования, пожалуйста, не предлагайте это кому-то, кто уже прошел этот этап кодирования noob.
2. я хочу использовать функцию с аргументами в «onclick», вот что я хочу знать, как
Ответ №4:
Вы можете получить длину элементов вашей кнопки и выполнить итерацию по вашим кнопкам.
Я бы рекомендовал создать класс для чего-то подобного, поэтому вместо того, чтобы просто брать все кнопки, укажите кнопки, которые вы хотели бы включить в этот тот же класс.
Вот способ, которым вы можете это сделать.
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<button id='b1' class="btnWithID">Click</button>
<button id='b2' class="btnWithID">Click</button>
<button id='b3' class="btnWithID">Click</button>
<button id='b4' class="btnWithID">Click</button>
<script type="text/javascript">
function show_id(){
alert(this.id)
}
let btns = document.querySelectorAll('.btnWithID');
for(i=0; i < btns.length ;i ){
btns[i].onclick = show_id;
}
</script>
</body>
</html>
Комментарии:
1. когда я запускаю ее, она предупреждает все классы, но ничего не отображается, когда я нажимаю на них
2. Извините за аргументацию, которая будет применена ко всем 4 кнопкам, которые я немного пропустил. Теперь я обновил свой ответ
3. кто-то уже написал тот же ответ, но в любом случае спасибо.
4. и нет необходимости в классе, я думаю, вы можете просто
querySelectorAll('button')
илиgetElementByTagName('button')
5. Вероятно, вы не хотите вызывать эту функцию для каждой кнопки на вашем сайте только для определенного количества кнопок. Вот почему я бы рекомендовал использовать классы.