А дело было так. Заказчик захотел чтобы на сайте были «красивые» поля ввода в формах. Верстальщик применил для этого скрипт custom-form-elements.js. Однако, когда вёрстку установили на CMS, выяснилось, что в некоторых браузерах, к примеру в FireFox, для изменения состояния чек-боксов требуется двойной клик, а не одинарный, как обычно. Программист, занимавшийся сайтом, первым делом заподозрил custom-form-elements.js. Другой скрипт аналогичного назначения проблему с чек-боксами решил, но не подошёл по другим соображениям. Программист занялся отладкой первого скрипта. Когда это ничего не дало, он обратился ко мне. Я тоже начал с отладки скрипта и обнаружил, что обработчик «onclick» мистическим образом вызывается дважды. Тогда я решил взглянуть на разметку, и вот что увидел:
<tr>
<td><label>Машина в кредит:</label></td>
<td><label><input type="checkbox" class="styled" name="credit" value="yes"></label></td>
</tr>
Обратите внимание на выделенный label. Скрипт custom-form-elements.js скрывает input с классом «styled» и ставит перед ним span «изображающий» из себя чек-бокс. При клике по span custom-form-elements.js изменяет состояние скрытого input. Но помимо span событие, порождённое этим же кликом, передаётся и обрамляющему span элементу label. Который транслирует это событие первому вложенному в него input-у. Таким образом состояние чек-бокса меняется дважды — один раз JS, второй — браузером, что и приводит к описанной проблеме. При всём при этом, label здесь совершенно не нужен, т. к. собственно метки (подписи) он и не содержит. Подпись размещается совсем в другом теге label.
Если бы верстальщик следовал логике, он бы не обернул этот input в label, скрипт custom-form-elements.js отработал бы правильно и ни программист, ни сам верстальщик не тратили бы лишнее время на устранение проблемы с чек-боксами.
Комментарии (16)
dapmoed
31.01.2011 09:32Я даже больше скажу. Верстка должна быть сначала логичной, а потом уже валидной.
Все таки соответствие стандартам и т.д. — это хорошо, он главное это работоспособность кода, масштабируемость и возможность разобраться в нем через пол года — год.
VitaZheltyakov
31.01.2011 09:32Очередной топик жалоба. Ничего личного — просто надоело.
— Почему разметка должна быть не только валидной, но и логичной,
— Почему программный код должен быть не только правильным, но и комментированным,
— Почему работодатели должны быть не только при деньгах, но и быть адекватными,
— Почему клиенты должны быть не только заинтересованы в проекте, но и пользоваться нормальными браузерами,
— Почему правительство должно быть не только исполнительным, но и не быть коррумпированным,
— Почему Солнце должно не только светить, но и греть…Mekras Автор
31.01.2011 09:32Я бы сказал, что это не жалоба, а аргументация. Может Вам везёт и Вы не сталкиваетесь с людьми, считающими, что если внешне вёрстка выглядит как надо, то пофиг, как она выглядит внутри. И написан этот топик в надежде переубедить хотя бы некоторых из таких людей.
KonstRuctor
31.01.2011 09:32На мой взгляд, тема не раскрыта. Приведен лишь один пример, который вполне мог оказаться просто ошибкой по невнимательности. Интересно было бы почитать развернутую статью с несколькими примерами, с теми же деревьями, о которых говорит webdew в первом комментарии. Интересует вариант, когда верстальщик осознанно делает что-то, что ему кажется верным, а на самом деле может привести к ошибкам и проблемам.
В данном изложении статья и правда весьма похожа на топик-жалобу.
CAJAX
31.01.2011 09:32Вобще-то претензии к input, вложенному в label необоснованны. Такое поведение описано в www.w3.org/TR/html401/interact/forms.html#h-17.9.1.
Mekras Автор
31.01.2011 09:32Не очень понял, о каких претензиях к input речь?
В HTML 4.01 явно не прописано, что событие должно транслироваться вложенному input-у. Там сказано только про ассоциацию с этим input-ом. Поэтому я дал ссылку на HTML5, где это уже прописано явно.
EzS
31.01.2011 09:32Если бы верстальщик следовал логике, он бы не обернул этот input в label, скрипт custom-form-elements.js отработал бы правильно и ни программист, ни сам верстальщик не тратили бы лишнее время на устранение проблемы с чек-боксами.
А если форму из таблицы вытащить, совсем красота будет
Veterinar
31.01.2011 09:32Логика разметки называется семантикой. Грамотная семантика — признак хорошего, состоявшегося верстальщика. Подогнать под валидатор не сложно, а сверстать так, чтобы глаз радовался, читая исходник, может далеко не каждый.
webdew
Это уже явная ошибка и непонимание принципа работы label
Алогичность, это когда деревья строятся на div а не на UL>LI