<?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>Оборачиваем событие jQuery собственным обработчиком</title><html>Современный фронтенд несётся скоростным поездом, в окнах мелькают es6, &lt;del&gt;es7&lt;/del&gt; es2015, react, redux и куча других пассажиров. И не везде этот поезд останавливается. Но на станциях по-прежнему полно ...jQuery.

И сегодня понадобилось дополнить &quot;чужой&quot; обработчик события (для простоты пусть будет onClick) дополнительными проверками, которые &quot;чужим&quot; не предусмотрен:
&lt;pre class=&quot;javascript&quot;&gt;
jQuery(&#039;element&#039;).bind(&#039;click&#039;, function() {
   if (checkIt()) {
      doIt();
   }
});
&lt;/pre&gt;
В дополнение к checkIt() необходимо &lt;em&gt;позвать&lt;/em&gt; ещё и testIt().

В простейшем случае обработчик события может быть именованной функцией и задача становится тривиальной:
&lt;pre class=&quot;javascript&quot;&gt;
// editable &quot;original&quot;
function clickHandler(event) {
   if (checkIt()) {
      doIt();
   }
}
jQuery(&#039;element&#039;).bind(&#039;click&#039;, clickHandler);

// custom code

jQuery(&#039;element&#039;).unbind(&#039;click&#039;).bind(function(e) {
  if (testIt()) {
     clickHandler(e);
  }
});
&lt;/pre&gt;
Но &quot;чужой&quot; код изменить нельзя, а значит обработчик события останется анонимной функцией. Как до неё добраться ?

Беглый поиск по исходникам jQuery помог найти недокументированный метод &lt;strong&gt;jQuery._data&lt;/strong&gt;, который поможет добраться до скрытых в его недрах обработчиков события. Несмотря на наличие комментария:
&lt;blockquote&gt;_Never_ expose &quot;private&quot; data to user code (TODO: Drop _data, _removeData)&lt;/blockquote&gt;
в интересующей меня ветке 1.xx, методы (вместе с комментарием) перекочевали в последнюю на данный момент версию 3.1, а значит я без риска и страха использую их и даже порекомендую вам сделать тоже самое, но всё же на ваш страх и риск, в похожей небезвыходной ситуации.

И так к делу:
&lt;pre class=&quot;javascript&quot;&gt;
// original HARDcode
jQuery(&#039;element&#039;).bind(&#039;click&#039;, function() {
   if (checkIt()) {
      doIt();
   }
});

// custom code
var originalClickHandler = jQuery._data( element ).events.click[0].handler; // save handler

jQuery(&#039;element&#039;)
  .unbind(&#039;click&#039;) // remove handler
  .bind(&#039;click&#039;, function(e) {
    if (testIt()) { // wrap old handler with custom logic
      originalClickHandler(e)
    }
  });

&lt;/pre&gt;
Буду надеятся что таким чудо{вищным} методом никому больше воспользоваться не придётся.</html><type>rich</type></oembed>