Свяжите различные функции для только что созданных элементов li

Я создаю li элементы динамически:

<ul>
<li id="1">1</li>
<li id="2">2</li>
<li id="3">3</li>
[...]
</ul>

li_id это значение массива, которое возвращает li id ​​(=1,2,3...)

Как я могу связать различные функции для каждого li элемент в коде, как это:

for (li_id in lids)
{
console.log(li_id);                         
$(li_id).bind('mouseover', function() {
console.log(li_id);
});
}

Выше не работает. Как правильно это написать?

С live() вместо bind() он показывает идентификатор последнего элемента lids массив, а не 1,2,3...[...], как console.log() вне $ заявление...

2 ответа

Решение

http://www.mennovanslooten.nl/blog/post/62

или же

Закрытие JavaScript внутри циклов - простой практический пример

Учитывая ваш HTML, код может быть написан двумя способами.

Использование параметра jQuery 1.4 Event.data:

var lids = [1,2,3];
for (i in lids) {
    var li_id = lids[i];

    $('#' + li_id).bind('mouseover', { id: li_id }, function(ev) {
        console.log(ev.data.id);
    });
}

Или создание замыкания с анонимной функцией:

var lids = [1,2,3];
for (i in lids) {
    var li_id = lids[i];

    // an anonymous function 
    (function (id) {
        $('#' + id).bind('mouseover', function() {
            console.log(id);
        });        
    })(li_id); // ...called every time with different id

}

я предпочитаю jQuery Event.data Кстати в этом случае.

Таким образом, с закрытием правильный ответ будет:

$(li_id).bind('mouseover', function(val) { 
                             return function() { 
                                console.log(val); 
                             } 
                           }(li_id));

Но это требуется только в том случае, если вам нужно передать значение цикла в функцию.

Другие вопросы по тегам