Ещё раз про .live, jQuery
Ещё на заре, когда я только-только учился js, я применял обработку событий централизованно, то есть, вешал обработчик на document и по всплытию и последующей проверке на тег-класс и т.п.
Потому что раньше не было библиотек.
Это считается довольно быстрой постановкой событий, хотя в обработке довольно медленнее, потому что нужно проверять КАЖДЫЙ DOM-элемент по ветке всплытия!
Посмотрел исходники jquery, там это делается путём первоначального парсинга селектора при поставовке события.
То есть, в последующей централизованной обработке события через всплытие (а не как обычно, на единичный элемент) будет производиться проверка всех DOM-элементов от точки события до корня. Вот так:
А это довольно затратная операция на процессорное время.
Конечно, можно ограничить путь до корня путём указания контекста, но всё равно это будет выполняться на каждый вызов события.
Намного быстрее и проще предусмотерть это в архитектуре своего приложения, это во-первых, и быстрее, и ничего лишнего. А по скорости разработки я уже писал - это зависит от архитектуры, если она правильно создана, то и проблем нет =)
Вуаля.
Потому что раньше не было библиотек.
Это считается довольно быстрой постановкой событий, хотя в обработке довольно медленнее, потому что нужно проверять КАЖДЫЙ DOM-элемент по ветке всплытия!
Посмотрел исходники jquery, там это делается путём первоначального парсинга селектора при поставовке события.
if ( selector ) { handleObj.quick = quickParse( selector ); if ( !handleObj.quick && jQuery.expr.match.POS.test( selector ) ) { handleObj.isPositional = true; } } quickParse = function( selector ) { var quick = rquickIs.exec( selector ); if ( quick ) { // 0 1 2 3 // [ _, tag, id, class ] quick[1] = ( quick[1] || "" ).toLowerCase(); quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); } return quick; },
То есть, в последующей централизованной обработке события через всплытие (а не как обычно, на единичный элемент) будет производиться проверка всех DOM-элементов от точки события до корня. Вот так:
for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { selMatch = {}; matches = []; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; sel = handleObj.selector; hit = selMatch[ sel ]; if ( handleObj.isPositional ) { // Since .is() does not work for positionals; see http://jsfiddle.net/eJ4yd/3/ hit = ( hit || (selMatch[ sel ] = jQuery( sel )) ).index( cur ) >= 0; } else if ( hit === undefined ) { hit = selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jQuery( cur ).is( sel ) ); } if ( hit ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, matches: matches }); } }
А это довольно затратная операция на процессорное время.
Конечно, можно ограничить путь до корня путём указания контекста, но всё равно это будет выполняться на каждый вызов события.
Намного быстрее и проще предусмотерть это в архитектуре своего приложения, это во-первых, и быстрее, и ничего лишнего. А по скорости разработки я уже писал - это зависит от архитектуры, если она правильно создана, то и проблем нет =)
Вуаля.