Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.09.2013, 17:24
ERB ERB вне форума
Новичок на форуме
Отправить личное сообщение для ERB Посмотреть профиль Найти все сообщения от ERB
 
Регистрация: 08.09.2013
Сообщений: 3

Передача параметров в обработчик события
element = document.getElementById("some_id");

for (var i = 0; i < 10; i++) {
var childElement = document.createElement("span");
childElement.innerHTML = "элемент: №" + i + "<br>";
childElement.addEventListener(
"click",
function() {
alert("элемент: №" + i); // здесь хочу передать параметр к какому то функцию, например "i"
},
false
);
element.appendChild(childElement);
}

Но, при клике к "span" элементам, появляется сообщение: "элемент: №10". Я ожидал номера будут разные и соответствовать номеру каждого элемента. Можете объяснить, почему так происходит?
Ответить с цитированием
  #2 (permalink)  
Старый 08.09.2013, 20:56
Аватар для BETEPAH
Профессор
Отправить личное сообщение для BETEPAH Посмотреть профиль Найти все сообщения от BETEPAH
 
Регистрация: 23.06.2011
Сообщений: 1,165

Сообщение от ERB
Можете объяснить, почему так происходит?
Объяснение: потому что в тот момент, когда Вы кликаете по элементам, i=10.
Вот здесь рассматривается практически Ваш случай - http://javascript.ru/basic/closure
Ответить с цитированием
  #3 (permalink)  
Старый 10.09.2013, 11:09
ERB ERB вне форума
Новичок на форуме
Отправить личное сообщение для ERB Посмотреть профиль Найти все сообщения от ERB
 
Регистрация: 08.09.2013
Сообщений: 3

То что, в момент когда я кликаю по элементам переменная i=10 было понятно, но небыло понятно, как получить необходимый результат (т.е. как сделать чтобы alert выдал разные значения). Теперь понятно, спасибо за полезную ссылку.

Решение:

element = document.getElementById("some_id");

for (var i = 0; i < 10; i++) {
var childElement = document.createElement("span");
childElement.innerHTML = "элемент: №" + i + "<br>";
childElement.addEventListener(
"click",
function(i) {
return function() { alert("элемент: №" + i);}
},
false
);
element.appendChild(childElement);
}
Ответить с цитированием
  #4 (permalink)  
Старый 10.09.2013, 11:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,125

ERB,
вы уверены что ваш код полностью функциональный?
Ответить с цитированием
  #5 (permalink)  
Старый 10.09.2013, 11:37
Аватар для BETEPAH
Профессор
Отправить личное сообщение для BETEPAH Посмотреть профиль Найти все сообщения от BETEPAH
 
Регистрация: 23.06.2011
Сообщений: 1,165

Сообщение от ERB
childElement.addEventListener(
"click",
function(i) {
return function() { alert("элемент: №" + i);}
},
false
);
Забыли вызов функции поставить.
<div id="some_id"></div>
<script>
element = document.getElementById("some_id");
for (var i = 0; i < 10; i++) {
    var childElement = document.createElement("span");
    childElement.innerHTML = "элемент: №" + i + "<br>";
    childElement.onclick = function(i) {
        return function() { alert("элемент: №" + i);}
    }(i);
element.appendChild(childElement);
}
</script>
Ответить с цитированием
  #6 (permalink)  
Старый 10.09.2013, 20:09
ERB ERB вне форума
Новичок на форуме
Отправить личное сообщение для ERB Посмотреть профиль Найти все сообщения от ERB
 
Регистрация: 08.09.2013
Сообщений: 3

А да, точно, спасибо большое
Ответить с цитированием
  #7 (permalink)  
Старый 10.09.2013, 21:05
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

<div id="some_id"></div>
<script>
element = document.getElementById("some_id");
for (var i = 0; i < 10; i++) {
    var childElement = document.createElement("span");
    childElement.innerHTML = "элемент: №" + i + "<br>";
    childElement.onclick = (function(i){ alert("элемент: №" + i);}).bind(null, i)
element.appendChild(childElement);
}
</script>

Есть еще такой вариант. Работает в ES5-совместимых js-движках.
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дебаг js, или как найти обработчик события для тега jimm88 Events/DOM/Window 1 18.04.2012 15:11
Передача параметров в колбэки и дальнейшее их вешанье на события. Gremlin Общие вопросы Javascript 17 13.08.2011 08:54
Как "обмануть" обработчик события? itPiligrim Events/DOM/Window 0 13.05.2010 22:55
как узнать имеется ли обработчик события HelpeR Events/DOM/Window 9 17.02.2010 18:20
Обработчик события: как делает jquery? Shasoft jQuery 35 22.04.2009 09:41