К настоящему времени большинство людей на этом сайте, вероятно, знают, что:
$("#someTable TD.foo").click(function(){
$(e.target).doSomething();
});
будет работать намного хуже, чем:
$("#someTable").click(function(){
if (!$(e.target).is("TD.foo")) return;
$(e.target).doSomething();
});
Теперь насколько хуже будет, конечно, зависеть от того, сколько TDs у вашей таблицы, но этот общий принцип должен применяться до тех пор, пока у вас есть хотя бы несколько TD. (ПРИМЕЧАНИЕ. Разумеется, умным было бы использовать делегат jQuery вместо вышеупомянутого, но я просто пытался сделать пример с очевидной дифференциацией).
Во всяком случае, я объяснил этот принцип сотруднику, и их ответ был "Ну, для компонентов сайта (например, INPUT для выбора даты), зачем останавливаться на этом? Почему бы просто не привязать один обработчик для каждого типа компонент для самого ТЕЛА?" У меня не было хорошего ответа.
Очевидно, использование стратегии делегирования означает переосмысление того, как вы блокируете события, так что один недостаток. Кроме того, у вас гипотетически может быть страница, где у вас есть "TD.foo", в котором не должно быть привязанного к нему события. Но, если вы понимаете и готовы обойти изменения пузырьков событий, и если вы применяете политику "если вы поместите .foo в TD, она ВСЕГДА собирается подключиться к событию", ни одна из них не кажется большое дело.
Я чувствую, что мне что-то не хватает, поэтому мой вопрос: есть ли другой недостаток, чтобы просто делегировать все события для всех компонентов сайта для BODY (в отличие от привязки их непосредственно к элементам HTML, или делегировать их родительскому элементу, отличному от BODY)?