Briconsejo: <option> desactivados en IE

20 de agosto de 2007

Internet Explorer no soporta el atributo DISABLED en los elementos OPTION de una etiqueta SELECT. Cosas de la política que tiene Microsoft acerca de los estándares. Firefox y Safari, en cambio, sí lo soportan.

Se puede hacer un apaño para simular el comportamiento del atributo DISABLED en IE. Para ello utilizamos código CSS própio de IE (behavior) , y un comentario condicional para ocultarlo al resto:

  1. <!–[if IE]>
  2.  
  3. <style>    optgroup  { behavior: url("optgroup-with-disabled-options.htc"); }    option { behavior: url("disabled-option.htc"); } </style>< ![endif]>

Esto llama a dos ficheros .htc, que contienen código javascript a ejecutar sobre cada elemento OPTGROUP y OPTION de nuestro html.

disabled-option.htc:

  1. <public> <script> if (element.disabled && element.parentNode.nodeName!="OPTGROUP") {    var label = element.innerHTML;  var optgroup = document.createElement("<optgroup label=\’"      + label         + "\’ style=\’color:graytext; font-style:normal;\’/>");         element.parentNode.replaceChild(optgroup,element); } </script> </public>

Se ejecuta sobre cada elemento OPTION, y lo sustituye por un OPTGROUP vacío, que en IE tiene un comportamiento similar al de un elemento desactivado.

optgroup-with-disabled-options.htc:

  1. <public> <script> // check whether it contains a disabled option: for (var i=0; i<element .childNodes.length; ++i) {    if (element.childNodes[i].nodeName=="OPTION" && element.childNodes[i].disabled) {               // move all options one level up, adding non-breakable          // spaces to indent and converting disabled options:            var parent = element.parentNode;                var insertionPoint = element.nextSibling;               for (var i=element.childNodes.length-1; i>=0; –i) {                    var option = element.childNodes[i];                     if (option.nodeName=="OPTION") {                                var label = option.innerHTML;                           if (option.disabled) {                                  element.removeChild(option);                                    option = document.createElement("<optgroup label=\’    "                                        +label                                  +"\’ style=\’color:graytext; font-style:normal;\’/>");                          } else {                                        option.firstChild.data = "      "+label;                                }                               insertionPoint = parent.insertBefore(option,insertionPoint);                    }               }               break;  } } </element></script> </public>

Se ejecuta sobre cada elemento OPTGROUP buscando elementos OPTION desactivados dentro, y hace lo mismo que la función anterior.

Y hasta aquí el briconsejo de hoy.

Fuente (inglés): http://archie.blogr.com/stories/57864/

Deja Una Respuesta

  • qrcode link