Есть форма, а в конце формы - красивая кнопка, сверстанная тегом <a>, вместо стандартного <input type="submit" />. Таких форм много. Чтоб по клику на кнопке форма субмитилась, есть такой код:
$(document.body).on('click', 'a.form-submit', function(e) {
$(this).closest('form').submit();
return false;
});
То есть он слушает любой клик по ссылке с классом form-submit, и отправляет ближайшую вверх по дереву форму.
И вот эти несчастные 4 строчки, служившие верой и правдой, перестают работать. Казалось бы, что тут может не работать? Но узнать это не так просто. В консоль падает ошибка из недр jQuery, который, само собой, тщательно заминифаен и обфусцирован.
Заменяем jQuery на исходник (+5 минут на поиски исходника и передергивание), смотрим еще раз на ошибку, смотрим, что там за код и что он делает (еще +5 минут - плюнуть в консоль то-да-се). Наконец вкурив, удивляемся и чешем репу, потому что код этот по идее всего лишь дергает метод submit() у DOM-узла формы (т.е. старый добрый form.submit(), первый класс вторая четверть).
Грешим на магию внутри jQuery, пробуем сделать то же самое напрямую (+3 минуты), не работает.
Выводим в консоль содержимое метода form.submit() (в надежде увидеть там [native code]):
$(document.body).on('click', 'a.form-submit', function(e) {
console.log($(this).closest('form').get(0).submit);
}
И вот оно - спелое сочное яблоко! Консоль сообщает, что отныне и навеки form.submit - это не встроенный метод, а DOM-узел <input type="submit" name="submit" /> (+2 минуты на то, чтоб удивиться как следует).
Смотрим html-код, и правда - рядом с кнопкой сидит невидимый INPUT, добавленный туда, чтоб форма отправлялась по Enter (если внутри формы нет <input type="submit" />, она отправляться не будет). А, поскольку "для удобства программиста" инпуты из формы добавляются в свойства формы с именами в качестве ключей (чтоб можно было писать alert(form.login) для значения <input name="login" />), мы нашим инпутом затираем свойство, ссылающееся на нужный нам [native code]. (+2 минуты на поиск места, где генерится html и переименование инпута).
И еще +3 минуты на обратную замену jQuery, выпиливание вывода в консоль и убийство прочего отладочного кода.
20 минут жизни на такую хрень. А что делать, что делать? Можно делать выгодные вклады в какой-нибудь надежный банк, где, согласно рекламе, время будет работать на нас... но лучше бы я эти 20 минут на роликах побегал :)
Да. Еще это - философский пост о вреде синтаксического сахара. Очень похоже на register_globals в PHP (который, напомню, тоже создавал переменные "для удобства", и, по счастью, будет окончательно ликвидирован в PHP 5.4).