2010-02-27 4 views
3

Когда пользователь нажимает на элемент <li> или на дочерний элемент, я хочу добавить класс к этому элементу <li>.event.target указывает на дочерний элемент

Это прекрасно работает, но для повышения производительности я решил связать это событие с элементом <ul>, поэтому отключение и привязка этого события происходит намного быстрее в списке, состоящем из 1000 <li> -элементов. Единственное изменение, которое я думал, что мне пришлось сделать, это заменить на event.target. НО event.target может также ссылаться на дочерний элемент элемента списка или даже на внука.

Есть ли простой способ проверить этот целевой элемент является частью элемента списка или мне нужно пройти путь от event.target до достижения элемента <li>?

Это то, что я имел, прежде чем я решил связать событие с <ul> тег, который работает, но не достаточно быстро:

$('#list li').mousedown(function(){ 
    $(this).addClass('green'); 
}); 

И это то, что у меня сейчас, не работает должным образом, MouseDown на дочерний элемент не дает <li> другой: имя класса

$('#list').mousedown(function(event){ 
    if(event.target.nodeName == 'LI'){ 
     $(event.target).addClass('green'); 
    } 
}); 

Интересно, если мой второй путь для достижения этой цели быстрее, если есть не простое решение, чтобы проверить, что целевой элемент является частью списка элемент ...

ответ

2

Ну, вы могли бы сделать все это с помощью JQuery на инструмент:

$('#list li').on('mousedown', function() { 
    $(this).addClass('green'); 
}); 

Вы можете прочитать о том, что на делает здесь: http://api.jquery.com/on/

+0

Это то же самое, что и '.mousedown()', за исключением того, что он принимает вновь созданные элементы, верно? Если это так, это не поможет мне, но мне нужно развязать 1000 событий вместо 1. – Harmen

+0

Нет, это не то же самое, что «.mousedown()». Проверьте документацию - новый «live»() API выполняет именно то, что вам нужно. – Pointy

+0

О, и обратите внимание, что встроенный в jQuery «live»() API не такой же, как старый плагин с похожим именем. один из них действительно привязывает обработчики событий непосредственно к элементам. Новый использует преимущества пузырьков, что и есть (я думаю), о котором вы просите. – Pointy

2

Вам нужно проверить, есть ли тег LI в родителях целевого элемента.

Все общие рамки есть способ определения того, является up() в прототипе, ancestor() в YUI3, и, глядя на документы JQuery, кажется, что он имеет parent() и parents() функция, которую вы можете использовать для этого ,

См: http://docs.jquery.com/Traversing

Не использовали JQuery, но я предполагаю, что проверка на $(event.target).parent('li') ответ.

+1

На самом деле вы, вероятно, хотите». ближайший ('li') ", но снова с jQuery вся проблема уже решена каркасом. – Pointy

+0

Хм, ты прав. Имена ошибочных функций imo. –

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