Jump to content
  • 0

Как правильно навешивать события


Колос
 Share

Question

Пытаюсь динамически навешивать события на элементы. Делаю это так:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Счётчик</title>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
<script type="text/javascript">
function napolnenie()
{
for ( var i = 0; i < 2; i++)
{
var spisok = document.getElementById('spisok');
var novspan = document.createElement('span');
novspan.innerHTML = 'Кнопка' + i;
novspan.onclick =
function()
{
alert(i);
}

spisok.appendChild(novspan);
}
}
</script>
</head>
<body onLoad="napolnenie();">
<div id="spisok">
</div>
</body>
</html>

Желаемое поведение: при щелчке на "Кнопка0" вижу "0", при щелчке на "Кнопка1" вижу "1".

Имеющееся поведение: при нажатии на любой спан высвечивается "2".

Объясните пожалуйста, почему так происходит? Если бы всегда высвечивалось "1" я бы ещё понял, но почему "2"?

Второй вопрос, что делать?

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Что-то у вас с логикой... вы повесили событие, которое выводит переменную i по клику. А когда событие наступает???!!!

Событие наступает когда человек кликает по спану, а в каком состоянии в этот момент переменная i ???

Link to comment
Share on other sites

  • 0
Что-то у вас с логикой... вы повесили событие, которое выводит переменную i по клику. А когда событие наступает???!!!

Событие наступает когда человек кликает по спану, а в каком состоянии в этот момент переменная i ???

А как правильно написать, чтобы при навешивании события i понималась не как переменная, а как её значение?

Link to comment
Share on other sites

  • 0

Сдается мне что тут проблема в замыканиях. Прочитайте про реализацию замыканий в яваскрипте.

Во че на хабре нашел:

for (var i = 0; i < links.length; i++) {
(function(i) {
links[i].onclick = function() {
alert(i);
}
})(i);
}

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy