Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: скрипт, <label>, cheсkbox и Интернет Эксплорер
Форумы портала PHP.SU » Клиентская разработка » JavaScript & VBScript » скрипт, <label>, cheсkbox и Интернет Эксплорер

Страниц (1): [1]
 

1. LShark - 05 Марта, 2013 - 14:09:58 - перейти к сообщению
Есть форма, в которой множество чекбоксов.

Для облегчения отмечания чекбоксов каждый из них помещен в <label>, что позволяет отмечать чекбокс, тыкая не только в саму коробочку, но и на любую часть текста в лэйбле.

Это работает везде, кроме, конечно, осла. В Эксплорере чекбокс плюет на лэйбл и отмечается ТОЛЬКО при кликании на коробочку чекбокса.

Из-за этого пришлось на лэйбл повесить событие "onclick", которое запускает скрипт, инвертирующий значение чекбокса (был отмечен - снимает, был не отмечен - ставит "cheсked")

Но тут всплыла неприятность - если лэйбл захватывает чекбокс, то в результате получаем некий баг:
1. Если кликать по лэйблу - все срабатывает и отмечается как надо.
2. если кликать по самому чекбоксу - он сначала ОТМЕЧАЕТ его, далее срабатывает событие на онклик-лэйбла и метка СНИМАЕТСЯ.

К сожалению, вынести лэйбл ЗА границы чекбокса нельзя (точнее - нежелательно), так как кликнуть могут как ДО чекбокса, так и после него (на тексте).

Как заблокировать повторную обработку, если чекбокс лежит внутри лэйбла, на котором висит онклик?
2. EuGen - 05 Марта, 2013 - 14:28:34 - перейти к сообщению
3. LShark - 05 Марта, 2013 - 14:36:21 - перейти к сообщению
Значит, придется на сам чекбокс вешать тоже онклик с СcancelBubble ? Чтобы дальше не распространялось срабатывание?
4. DelphinPRO - 05 Марта, 2013 - 14:43:52 - перейти к сообщению
LShark пишет:
Из-за этого пришлось на лэйбл повесить событие "onclick", которое запускает скрипт, инвертирующий значение чекбокса (был отмечен - снимает, был не отмечен - ставит "cheсked")


рука-лицо.jpg

настоятельно рекомендую ознакомится со HTML спецификацией, уж коль скоро вы занимаетесь web-разработкой.

Для связи label и input (любого типа, включая textarea) должны быть использованы атрибуты "for" и "id" :

CODE (html):
скопировать код в буфер обмена
  1. <label for="mylink">text</label>
  2. <input id="mylink" type="checkbox"/>


Более того, вложение инпута в лейбл является семантически неверным ходом.

Кроме того, не нужно вешать событие на клик, следует прослушивать onchange у инпута.
5. Мелкий - 05 Марта, 2013 - 14:55:24 - перейти к сообщению
DelphinPRO пишет:
настоятельно рекомендую ознакомится со HTML спецификацией

http://www[dot]w3[dot]org/TR/html-markup/label[dot]html
Цитата:
The label element may contain at most one descendant input element, button element, select element, or textarea element.

http://www[dot]w3[dot]org/TR/REC-html40-[dot][dot][dot]orms[dot]html#h-17[dot]9
Я не умею читать?
Оборачивание элемента в label вместо указания for - нормальное, стандартное поведение.
6. esterio - 05 Марта, 2013 - 15:31:17 - перейти к сообщению
IE только недавно начал смотреть в w3c, так что думаю тут е дело в спецификации. ІЕ как раз таки не коректно обрабативает input в label, он понимает только for
7. DelphinPRO - 05 Марта, 2013 - 15:58:59 - перейти к сообщению
Мелкий, я может не совсем точно выразился. в спеке говорится о том, что в ситуации с вложенным контролом поведение может отличатся на разных платформах.
Цитата:
On other platforms, the behavior might be just to focus the control, or do nothing.


Тогда как для варианта с атрибутами однозначно прописано, что должна быть связь.
8. LShark - 05 Марта, 2013 - 17:59:49 - перейти к сообщению
DelphinPRO пишет:
Кроме того, не нужно вешать событие на клик, следует прослушивать onchange у инпута.

Именно из за этого весь гемор - если в эксплорере я кликаю НА лэйбле - он НЕ МЕНЯЕТ вложенный в него чекбокс, он его меняет толкьо при прямом клике на чекбоксе. Так что никакого ончейнджа не срабатывает, пока я не кликану напрямую по чеку.
Опера и Гуглобот - меняют.

Мелкий пишет:
The label element may contain at most one descendant input element, button element, select element, or textarea element.

Вот-вот...
(Добавление)
Йо, Эксплорер проглотил for и заработал. Гигантское спасибо!
Чегой то я был не в курсе Недовольство, огорчение

 

Powered by ExBB FM 1.0 RC1