Оно работает! Но, блин, как..

На днях исправлял чудесный, феерический баг в коде, уже успевшем стать древним (просто потому, что мой склероз прогрессирует заметно быстрее, чем я пишу код). Вкратце, берётся инпут, обвешивается несколькими способами обработчиками, после чего в инпут вводится значение и.. и обработчики не работают!

Через минут двадцать я обнаруживаю, что $(искомый инпут).data() - девственно пуст. Ещё получаса мне хватило на то, чтобы додуматься почесать скрипт grep-ом. И опаньки! В тот момент, когда инпут получает фокус я делаю (барабанная дробь) .unbind без параметров. (Старательно выношу матершинные слюни за скобки).

Никогда так не делайте - focus.js
1
2
3
4
5
6
$("input.dummy_data").focus(function() {
  $(this).
    val("").
    removeClass("dummy_data").
    unbind(); // Вот в этом месте все обработчики дружно собираются и уходят курить
});

Мораль сей басни - учите, господа, матчасть. В своё время я использовал .unbind чтобы второй раз не вызывать обработчик по событию .focus. И хотя самостоятельно отрубать себе же руки (хэндлы) я в виду не имел, но очень даже это сделал.

P.S.

Правильный вариант обработчика - focus.js
1
2
3
4
5
6
7
8
9
10
11
12
$("input.dummy_data").bind("focus.placeholder", {
  var $this = $(this);

  // Очищаем значение, как и планировалось
  $this.val("");

  // Убираем стиль, чтобы снять оформление
  $this.removeClass("dummy_data");

  // Аккуратно убираем обработчик события, не трогая остальные
  $this.unbind("focus.placeholder");
});

Comments