Исходные данные: на странице есть 9 кнопок с id вида "btn1", "btn2", "btn3", …. "btn9". При клике на кнопку нужно выводить сообщение "Вы нажали кнопку N", где N – это текст кнопки.
<div class="btn" id="btn1">1</div> <div class="btn" id="btn2">2</div> <div class="btn" id="btn3">3</div> <div class="btn" id="btn4">4</div> <div class="btn" id="btn5">5</div> <div class="btn" id="btn6">6</div> <div class="btn" id="btn7">7</div> <div class="btn" id="btn8">8</div> <div class="btn" id="btn9">9</div>
Решение:
Решить задачу с помощью jQuery довольно просто с помощью такого кода:
$(document).ready(function () { for (i = 1; i < 10; i++) { $("#btn" + i).click(btnHandler( i)); } function btnHandler(i) { return function () { alert('Вы нажали кнопку ' + $("#btn" + i).text()) } }; });
Функция-обработчик "btnHandler" должна быть вынесена за цикл! В противном случае вы потратите не мало времени, чтоб понять, почему работает не так как надо.
Распространенная ошибка:
Используя код, который как бы очевиден, получаем при клике на любую кнопку только надпись "Вы нажали на кнопку ", ибо кнопки с id "btn10" на странице нету. В данном случае "i" принимает максимальное значение.
$(document).ready(function () { for (i = 1; i < 10; i++) { $("#btn" + i).click(function () { alert('Вы нажали кнопку ' + $("#btn" + i).text()); }); } });
Вопреки здравому смыслу, значение "i" в данном случае равно 10 при нажатии любой кнопки. Можно добавить строчку alert(i), чтоб убедиться в этом.
$(document).ready(function () { for (i = 1; i < 10; i++) { $("#btn" + i).click(function () { //alert($("#btn" + i).text()); alert(i); }); } });