2012-01-20 6 views
3

Не знаете, почему следующий код не работает. Если я изменю .on() на .live(), он будет работать, но события в реальном времени будут висели, и так как это будет что-то появляться и удаляться от страницы, чем один раз, live будет продолжать добавлять в строку события каждый раз, когда ее щелкают. Наверное, короткий и худой, почему это не огонь?.on() событие не срабатывает

$("#" + old_n).on('mousedown', function(evt) { 
    console.log(old_n); 

    if($(el).data('clickphase')) { 
     return true; 
    } 

    $("#" + $.contextmenu).remove(); 
    $(el).data('served', true); 

    if(typeof array_of_a[a_index][1] == 'function') { 
     array_of_a[a_index][1](evt, el); 
    } 

    // console.log(array_of_a[a_index]);    
    // array_of_a[a_index][1](evt, el); 
    $(el).removeData('served'); 
}); 

old_n является идентификатором текущего <li>, который кликнул, который также имеет hover событие, но это не должно испортить MouseDown события правильно?

+0

проверить, если $ ("#" + old_n) .length is> 0 –

ответ

1

Ваш код является неправильным переводом от live до on. Попробуйте вместо этого:

$(document).on("mousedown", "#" + old_n, function (evt) { 
    /*...*/ 
}); 
+0

, который все еще делает его пузырьком к корню документа, поэтому, когда я его использую, затем используйте его снова, он запускает его дважды, и продолжает наращивать, как в реальном времени event – Rob

+0

Означает ли это, что у вас есть несколько элементов на одной странице с тем же 'id'? Если это так, это недопустимый HTML, и вам нужно решить эту проблему. –

3
$("#" + old_n).on('mousedown', function(evt) { 

будет работать только тогда, когда old_n присутствует, когда страница отображается. Это непосредственно связано событие, идентично

$("#" + old_n).bind('mousedown', function(evt) { 

Вы хотите делегированы событие:

$(document).on("mousedown", "#" + old_n, function(evt) { 

Это заставит все MouseDown события в любом месте документа, чтобы быть «прослушал» по JQuery, и если они исходят от элемента, соответствующего вашему идентификатору выбора old_n, - тогда загорается обработчик событий.


Конечно, прослушивание каждого события mousedown в любом месте вашего документа немного расточительно. Если вы знаете, что этот элемент будет только когда-либо существовать, скажем, в DIV с идентификатором foo (и Foo существует, когда страница отображается), то почему бы не только слушать события подходя к foo

$("#foo").on("mousedown", "#" + old_n, function(evt) { 
+0

Итак, я изменил его на ... $ ("# contextmenu li"). On ('mousedown', "#" + old_n, function (evt), но это все равно не срабатывает. Единственный способ получить его для стрельбы - либо прикрепляться к корню документа, либо с помощью живого вызова – Rob

+0

Все, что вы помещаете в $(), должно присутствовать при отображении страницы. Поэтому, если #contextmenu отсутствует, когда страница отображается, это не будет работа –

+0

Это не его контекстное меню, которое создается по правому клику объекта. Таким образом, единственный способ привязать событие к элементу, который не находится на странице при его рендеринге, - это жить или привязываться к документу? – Rob

1

on не является заменой для live. Попробуйте выполнить мониторинг на уровне элемента списка ul. Это более эффективно и полезно от on.

$('ul').on('click', 'li', function() { 
    //get clicked list item's id 
    var id = $('this').prop('id'); 
}); 

Поскольку вы контролируете на ul уровне вам нужно будет получить информацию, которую вы хотите от элемента списка.

+0

+1 для «не падение в замене» –

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