Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   createElement("a")&onclick (https://javascript.ru/forum/dom-window/26645-createelement-onclick.html)

Andruha 16.03.2012 11:56

createElement("a")&onclick
 
Есть код по динамическому созданию 10 элементов <a>... Вопрос с событием onclick: все созданные ссылки по клику дают alert 9 ???? Почему собственно? Как ремонтировать?

for(var i=0; i<10; i++)
{
var new_a = document.createElement("a");
new_a.onclick='alert(i)';
new_a.href='javascript:';
var textNode = document.createTextNode(i);
new_a.appendChild(textNode);
}

спасибо...

T-sh 16.03.2012 12:01

var new_a...
var textNode...


вы каждый раз перезаписываете значение переменной. по прошествии цикла остаётся только последнее значение.

devote 16.03.2012 12:01

new_a.onclick=function(i) {
    return function() { alert(i); }
}(i)

Andruha 16.03.2012 12:23

а, ну да!!! пару строк не дописал...

var list = document.getElementById('div'); // Блок
for(var i=0; i<10; i++)
{
var new_a = document.createElement("a");
new_a.onclick='alert(i)';
new_a.href='javascript:';
var textNode = document.createTextNode(i);
new_a.appendChild(textNode);
list.appendChild(new_a);
}
ничего не перетираю, появляются 10 ссылок но все они дают alert 9 ?!

devote 16.03.2012 12:41

<div id="div"></div>
<script type="text/javascript">
    var list = document.getElementById('div'); // Блок
    for( var i = 0; i < 10; i++ ) { 
       var new_a = document.createElement("a");
       new_a.onclick = function(i) {
           return function() { alert(i); }
       }(i);
       new_a.href = 'javascript:';
       var textNode = document.createTextNode(i);
       new_a.appendChild(textNode);
       list.appendChild(new_a);
   }
</script>

T-sh 16.03.2012 12:51

Цитата:

Сообщение от Andruha (Сообщение 163470)
а, ну да!!! пару строк не дописал...

var list = document.getElementById('div'); // Блок
for(var i=0; i<10; i++)
{
var new_a = document.createElement("a");
new_a.onclick='alert(i)';
new_a.href='javascript:';
var textNode = document.createTextNode(i);
new_a.appendChild(textNode);
list.appendChild(new_a);
}
ничего не перетираю, появляются 10 ссылок но все они дают alert 9 ?!

причем тут 10 ссылок? :) у вас по онклику у всех ссылок "alert(i)". а после завершения цикла i равно 9.

либо делайте функцией, как написал devote, либо:
new_a.onclick="alert("+i+")";

хотя сомневаюсь, что так будет работать.

Andruha 16.03.2012 12:55

ух ты!!!!! работает!!!! devote Рулит!!! спасибо + всем спасибо...

function(i) {return function() { alert(i); } }(i);
что за скобки такие? (i) {...}(i); не встречал ещё...

T-sh 16.03.2012 12:58

Цитата:

Сообщение от Andruha (Сообщение 163481)
ух ты!!!!! работает!!!! devote Рулит!!! спасибо + всем спасибо...

function(i) {return function() { alert(i); } }(i);
что за скобки такие? (i) {...}(i); не встречал ещё...

в первых — параматре функции, вторые — вызов с параметром.

Andruha 16.03.2012 13:04

тю, блин!!!! первый класс вторая четверть... sorry за вопрос... всем спасибо!!!

tadjik1 16.03.2012 14:36

это классическая ошибка начинающих в javascript, сам над ней недавно сидел часа полтора, пока не догадался справочник открыть :)


Часовой пояс GMT +3, время: 09:30.