<?xml version="1.0" encoding="UTF-8" ?><oembed><version>1.0</version><provider_name>Чудо{вищные} заметки</provider_name><provider_url>https://miracle.rpz.name</provider_url><author_name>MiRacLe</author_name><author_url>https://miracle.rpz.name/author/miracle/</author_url><title>Всплытие покажет</title><html>&lt;p&gt;
Предположим у нас есть html-таблица 100x100 ячеек,в каждой ячейке - ссылка. При нажатии на каждую, должно происходить что-либо невероятное. 
Мы можем сделать 10 тыс обработчиков onclick и медленно, но верно добиться своей цели.
А можем глупостей не делать. Ведь хватит только одного!
&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://miracle.rpz.name/shared/event_bubbling.gif&quot; align=&quot;right&quot;&gt;
 Дело в том, что события в DOM умею &quot;всплывать&quot; - т.е. если представить документ в виде слоёной структуры, где сам document находиться сверху, радуя глаз хрустящей корочкой, а все дочерние элементы под ним, то событие возбуждённое на нижних уровнях, не найдя свой законный обработчик у потревоженного объекта начинает потихоньку лезть наверх, шевеля всё на своём пути, и искать свой обработчик последовательно у всех предков.
Что это собственно даёт? Это может существенно сократить количество обработчиков событий на странице. На идеальной сферической странице вакуумного веб-приложения всего один обработчик!
&lt;/p&gt;

Перейду к примерам:&lt;!--more--&gt;
&lt;pre class=&quot;js:nocontrols&quot;&gt;
  window.onload = function(){
  var tbl = document.getElementById(&#039;tbl&#039;), links = tbl.getElementsByTagName(&#039;a&#039;), linkcount = links.length;
     for (var i = 0; i &lt; linkcount; i++){
                  (function(){
                    var num = i;
                     x[i].onclick  = function(){  
                     alert(&#039;Это обработчик номер &#039; + num + &#039; из &#039; + linkcount + &#039;, ужас правда?&#039;);
                     return false;
                  };
        })();
     }
  } 
&lt;/pre&gt;

Готово. 10000 обработчиков. Легко. Просто. И долго…

А теперь Горбатый! (Я сказал &quot;Горбатый?!?&quot;)
&lt;pre class=&quot;js:nocontrols&quot;&gt;
      window.onload = function(){
         var tbl = document.getElementById(&quot;tbl&quot;);
         tbl.onclick = function(e) {
                e = e || window.event;
                var elem = e.target || e.srcElement;
                    if (&#039;a&#039; === elem.nodeName.toLowerCase()) {
                            alert(&#039;Это обработчик. Один. ЕДИНСТВЕННЫЙ!&#039;);
                    }
             }
      }
&lt;/pre&gt;

А если не видно разницы, то зачем платить &lt;strike&gt;больше&lt;/strike&gt; ?

С jQuery эта техника будет выглядеть следующим образом:
&lt;pre class=&quot;js:nocontrols&quot;&gt;
    $(&#039;#tbl&#039;).bind(&#039;click&#039;,function(e) {
            if ($(e.target).is(&#039;a&#039;)) {
                    alert(&#039;Это обработчик. Один. ЕДИНСТВЕННЫЙ!&#039;);
                    return false;
            }
    });
&lt;/pre&gt;

В заключение пару плагинов для &lt;a href=&quot;http://jquery.com&quot;&gt;jQuery&lt;/a&gt;, берущие &quot;пыльную&quot; работу в свои руки: 

&lt;a href=&quot;http://flesler.blogspot.com/2007/10/jquerylisten.html&quot;&gt;jQuery.listen&lt;/a&gt; 

&lt;pre class=&quot;js:nocontrols&quot;&gt;
$(&#039;#tbl&#039;).listen(&#039;click&#039;, &#039;a&#039;, function (e) {
    alert(&#039;Это обработчик. Один. ЕДИНСТВЕННЫЙ!&#039;);
    e.preventDefault();
});
&lt;/pre&gt;

и &lt;a href=&quot;http://dev.distilldesign.com/log/2008/jan/27/event-delegation-jquery/&quot;&gt;jquery.eventdelegation&lt;/a&gt;
&lt;pre class=&quot;js:nocontrols&quot;&gt;
$(&#039;#tbl&#039;).delegate(&#039;click&#039;, &#039;a&#039;, function () {
    alert(&#039;Это обработчик. Один. ЕДИНСТВЕННЫЙ!&#039;);
    return false;
});
&lt;/pre&gt;

Удачного всплытия!</html><type>rich</type></oembed>