2013-03-13 2 views
-3

У меня есть циклJQuery привязки в цикле

for (i = 0; i < 10; i++) 
{ 
    outPut.innerHTML += "<div id='file" + i + "'>" + i + "</div>"; 
    $('#file' + i).on('click', function(event) { 
     alert('User clicked on ' + i); 
    }).css('cursor', 'pointer'); 
} 

и только последний элемент получает событие прилагается. В чем проблема?

Смотрите тест здесь http://jsfiddle.net/haF7Y/

+2

... или http://stackoverflow.com/questions/3531386/binding-click-event-handlers-in-a-loop-causing-problems-in-jquery или HTTP://stackoverflow.com/questions/7774636/jquery-event-handler-created-in-loop – Matt

+3

OMG, не делайте этого ... используйте атрибут class и/или data и свяжите один раз ... Зачем связывать 'n' разные функции что делают то же самое !? – prodigitalson

+2

Если вам интересно, почему вы были заблокированы, это, по-видимому, связано с отсутствием исследований. –

ответ

1

Вот что вам не хватает - слушатели событий асинхронны по своей природе! Поэтому при выполнении такой задачи всегда используйте функцию закрытия внутри цикла! Ниже -

for (i = 0; i <10; i++){ 
    (function(i){ 
    outPut.innerHTML +="<div id='file"+ i + "'>" + i+ "</div>"; 
    $('#file' + i).on('click', function(event) { 
     alert('User clicked on ' + i); 
    }).css('cursor', 'pointer'); 
    }(i)) 
} 
1

Удалить событие щелчка с for loop.

$(document).on('click', '[id^=file]', function(e){ 
    alert('user clicked on '+ this.id.split('file')[1]); 
}); 
1

работы с Jquery объектами, как это (и создать замыкание)

var jOutPut = $('div:first'); 

var create = function(i) { 
    var j = $('<div/>') 
     .attr('id', 'file' + i) 
     .css('cursor', 'pointer') 
     .html(i) 
     .click(function(event){ 
      alert('User clicked on ' + i); 
     }); 

    jOutPut.append(j); 
} 

for(i=0;i<10;i++) { 
    create(i); 
} 
+0

@Matt попробуйте еще раз ... извините – silly

+0

@Matt и @JanDvorak ... 'никогда не отправляйте непроверенный код' ... сейчас! – silly

+0

Если я опубликую непроверенный код, чтобы продемонстрировать алгоритм, я помечаю его как таковой: «Что-то вроде строк», «вот эскиз решения» ... Обратите внимание, что это не будет работать, когда _fixing_ чей-то код, и это всегда хорошая идея отлаживать позже :-) –

0

Это как ваш код должен быть написан:

for (i = 0; i < 10; i++) 
{ 
    var newEl = $("<div class='file' data-index='"+i+"'>" + i + "</div>").css('cursor', 'pointer'); 
    outPut.append(newEl); 
} 

$('.file').click(function(event) { 
     alert('User clicked on ' + $(this).attr('data-index')); 
}); 

А вот скрипку, чтобы показать работы: http://jsfiddle.net/qX8RQ/

+0

Пересмотренный, извините, я пропустил «i». Что происходит со всеми проклятыми downvotes? Вы должны оценить помощь. – zachzurn

+1

Не уверен, что 'index()' лучший подход. Индексирование внутри некоторой коллекции, вероятно, будет лучше. –

+0

. Сглаживание обычно означает, что ответ на самом деле является неправильным или иным образом вредным. Вы не решили проблему. Следовательно, фактически неверно. –

Смежные вопросы