Chosen: html5 soporte de atributo requerido?

Creado en 4 mar. 2012  ·  80Comentarios  ·  Fuente: harvesthq/chosen

Cuando se inicializa elegido en una entrada de selección, agrega [style = " display: none "] a la etiqueta de selección y crea las diversas etiquetas div que necesita, de la siguiente manera.

<select name="country" id="country" style="display: none; " class="chzn-done">
    <option selected="selected" value=""></option>
    ...
</select>

Esto está bien, pero tenemos un problema si agrego el atributo html5 'required' a mi etiqueta de selección, que produce el siguiente marcado después de las inicializaciones elegidas:

<select name="country" id="country" required="required" style="display: none; " class="chzn-done">
<option selected="selected" value=""></option>
...
</select>

El problema ocurre cuando el usuario envía el formulario sin seleccionar un valor. Para el usuario, el navegador parece no hacer nada. De hecho, muestra un mensaje de error al usuario para que seleccione un valor, pero debido a que el CSS le indica al navegador que no muestre el elemento seleccionado, el mensaje de error tampoco aparece.

Esto está sucediendo en Chrome, no estoy seguro del comportamiento de otros navegadores.

No he profundizado lo suficiente para sugerir una solución, pero este es un problema a medida que comenzamos a incluir atributos html5 en nuestros formularios.

Feature Request

Comentario más útil

+1

¿Alguien puede arreglar esto? Es un problema bastante antiguo y una funcionalidad muy importante hoy en día. Gracias.

Todos 80 comentarios

También he notado recientemente este problema.
Requerido no es compatible con todos los navegadores, por lo que he creado un respaldo para recorrer los elementos de un formulario al enviarlo y verificar que haya algún valor allí cuando "requerido" esté presente.
El problema aún existe en Chrome porque la selección oculta no tiene valor y no alerta al usuario según los documentos de webkit:
http://trac.webkit.org/wiki/Styling%20Form%20Controls

"Un mensaje de validación consta de cuatro elementos div con pseudo clases y algunos nodos para el texto del mensaje. Puede personalizar la apariencia cambiando el estilo de estas pseudo clases".

Estoy pensando que la mejor manera de lidiar con esto es haber elegido generar el marcado adicional a su selección renderizada con clases similares para que tengan estilo de forma predeterminada en el navegador, o potencialmente agregar pseudo elementos a elementos que no han sido validados por utilizando las condiciones fallidas apropiadas en CSS como: inválido.

Por ahora, parece que su única opción es tener un respaldo de nivel DOM como mi solución javascript. Puedo proporcionarlo aquí si eso fuera útil, pero en realidad es una alternativa a la elegida, no una forma de arreglar el marco elegido.

¿Cuál es el estado de este problema? Tengo exactamente el mismo problema con la última versión de Firefox (14.0.1)

Dado que los atributos HTML5 se utilizan cada vez más en los sitios web, esto debería abordarse de una forma u otra.

Yo también tengo el mismo problema. Tendría curiosidad por conocer su solución alternativa.

Gracias

Parece que solo hay un problema importante y un problema secundario que sería genial solucionarlo.

  • Si el elemento del formulario no es válido (no se selecciona nada), los navegadores mostrarán una pequeña bandera que muestra la posición del error, con un mensaje que dice que complete este campo. Con elegido, en Firefox, esa bandera de mensaje está en la parte inferior izquierda de la ventana del navegador.
  • No hay un estilo definido para los campos de formulario no válidos. De forma predeterminada, en Firefox (varía entre los navegadores, pero todos hacen algo similar), aparece un efecto de brillo rojo alrededor de cada campo de formulario no válido. Las casillas de selección elegidas no obtienen nada.

El primer elemento es el más problemático. ¿Podría solucionarse esto utilizando un método de ocultación de elemento de selección diferente? Reemplazo de " display: none " en el elemento de selección oculto con "position: absoluta; visibilidad: oculta;" se acerca bastante, aunque eso dependerá más del CSS circundante ...

Sin embargo, no funciona para Webkit. Parece que la bandera de error hereda los estilos del cuadro de selección en webkit (Chrome), por lo que si establece opacidad: .5, la bandera también será opacidad .5 (como un ejemplo). gorrón.

Uno más: Opera funciona correctamente como está, pero si lo cambio al CSS basado en la posición anterior, entonces no funciona correctamente. Que dolor.

Perdón por enviar spam. ¡Creo que lo entendí! Si envuelve el elemento de selección en un intervalo y usa este CSS en el contenedor (y elimina la pantalla: ninguno en el elemento de selección):

width: 0px;
height: 0px;
overflow: hidden;
display: inline-block;
position: absolute;

Recibirá el mensaje de error y no interrumpirá el flujo de la página al mismo tiempo. El único problema es que debe dejar el cuadro visible para ver el mensaje de error porque Firefox y WebKit ocultarán el mensaje si no lo hace. Esto hace que el cuadro de selección reciba pestañas a través del formulario.

La forma de evitarlo podría ser alternar la visualización de ninguno a bloque en línea al enviar (o el evento 'inválido'), luego volver a alternarlo en ciertos eventos de entrada (como el mouse hacia abajo o la pulsación de una tecla).

También hay un pequeño problema de posicionamiento, que se puede resolver obligando a que la posición esté directamente debajo de la casilla elegida.

Sería bueno ver algún tipo de soporte integrado para esto, si es posible.

Escribí un parche aquí: https://github.com/adcSTUDIO/chosen

Puede que no sea lo suficientemente robusto para su inclusión, pero no dude en probarlo.

¡Gracias @CaptainN! ¡Lo comprobaré!

@CaptainN , lo hice funcionar, gracias por hacer esos cambios. Sin embargo, ¿sabe cómo permitir que el ancho de las ventanas emergentes de error exceda el ancho de los cuadros de selección? En algunos de mis elementos selectos más pequeños, el mensaje de error es muy delgado, lo que no se ve muy bien e incluso puede ser difícil de leer en algunos.

Si no, está bien, ya has ayudado mucho con esto. ¡Gracias de nuevo!

@caderade No estoy seguro de cómo solucionar ese problema. Probé el desbordamiento: visible y un par de cosas más, y todavía aparece corto. Intentaré algunas cosas más, pero esto parece un problema con Firefox que puede no tener una solución alternativa (estas banderas son generalmente bastante difíciles de tratar con, junto con ese brillo, que aún no he encontrado una manera de diseñar por completo).

@CaptainN : Muy bien.

Me funciona bastante bien en Firefox 17 y Chrome 23.

En IE 8 + 9 (que no admite la validación de formularios HTML5 en absoluto), al cambiar el valor del campo, aparece un error de JavaScript debido a que se está utilizando el selector :valid desconocido. Por lo tanto, el script se aborta y el formulario no se vuelve feo de ninguna manera, lo que esperaba en IE. : smirk: Sin embargo, no generar un error sería mejor. ¿Alguna idea?

Oh hermano. ¡De hecho, creo que jQuery me protegería más! Tendré que agregar un cheque de IE o algo ...

Kevin N.

@CaptainN También me tiene un problema en Chrome. No estaba seguro de si pensaba que era solo un problema de Firefox o no. Pero amigo, muchas gracias de nuevo hombre. ¡Impresionante trabajo! Háganos saber si alguna vez puede abordar el tema del ancho.

Parece que jQuery tiene un soporte de pseudo selector integrado y un sistema de ganchos para que los complementos puedan agregar los suyos, y si no encuentra ninguno, lo pasa a la implementación subyacente, por lo que: requerido y: válido arroja un error en IE (y probablemente en algunas versiones de Safari) si no se han rellenado con polietileno. Veré si puedo lanzar un tipo de verificación alternativo allí, en lugar de usar los pseudo selectores. Parece que puedo marcar attr ("required") para reemplazar: required - probablemente tendré que hacer algún tipo de detección de características para: aunque válido - ¿tal vez una comprobación de una propiedad .oninvalid?

Ok, obtuve un nuevo parche que corrige el error de IE (y también debería solucionarlo en cualquier otro navegador). Este parche cambia algunas cosas (nada que debas notar). Aquí están mis notas:

  • coincidió con el estilo de codificación de los controladores de eventos presentes en la versión jquery (enlazar en lugar de on, etc.)
  • No puedo obtener la versión prototipo para ocultar el elemento de selección cuando se valida; parece que el evento de cambio del elemento de formulario se está suprimiendo de alguna manera (funciona de otra manera); creo que esto es un error, pero no uno que presenté. Necesito investigar más.
  • Hay algunas peculiaridades menores sobre el posicionamiento del elemento no válido que a veces pueden necesitar la intervención manual del usuario a través de CSS (solo es un problema si se utiliza la función requerida).
  • los cuadros de selección de ancho corto terminan con las banderas requeridas suavizadas en el navegador (también es un problema con los elementos de selección de vainilla si establece el ancho a través de css). No puedo encontrar una solución alternativa (¡avíseme si la encuentra!) Tal vez lo utilice con Mozilla, ya que también sucederá con las cajas de vainilla. Además, ¿quizás eche un vistazo a sus extensiones css? https://developer.mozilla.org/en-US/docs/CSS/CSS_Reference/Mozilla_Extensions?redirectlocale=en-US&redirectslug=CSS_Reference%2FMozilla_Extensions (no pude encontrar nada de un vistazo)
  • No puedo hacer que uglifyjs funcione en Windows (por lo que las compilaciones de .min.js no se actualizan en mi repositorio); intentaré una compilación de OSX mañana.

@CaptainN Para su problema con UglifyJS, asegúrese de instalar la versión 1 ya que la versión 2 no es BC. # 915 está actualizando el package.json

¿Cómo cambio la versión usando npm?

@CaptainN npm install uglify-js@1 para forzar la versión 1 IIRC (pero no soy un experto en nodos). La otra solución es verificar mi rama y ejecutar npm install con el archivo packages.json actualizado.

Pude construir las versiones feas en mi mac de trabajo (¿tal vez tenga una versión anterior de uglify-js?). Ahora están actualizados en mi repositorio.

Solo estoy usando el sabor jQuery actualmente. Ya no hay errores de script en IE8 / 9. : +1: por ver esta función pronto en upstream.

También nos enfrentamos a este problema. ¿Existe alguna solución alternativa que no sea la de deshabilitar la validación de HTML5?
@CaptainN lo arregló por lo que leí. Así que probé su archivo elegido.jquery.js en la rama maestra. Pero da el error js de msie undefined.

Pensé que lo había arreglado. Esa bifurcación fue hace un tiempo y es posible que deba actualizarse. Veré si puedo llegar a eso esta semana e investigaré el error de IE.

Sincronicé esto en sentido ascendente y no vi ningún aviso de error indefinido en IE. Prueba mi repositorio de nuevo y avísame si sigues viendo este problema. (lo siento, tomó tanto tiempo)

¡Gracias!

: +1:

¿Alguien podría resumir esto por mí? ¿Hay una bifurcación o un parche que esté listo para la producción?

Hay una solicitud de extracción que acompaña a esto: # 900 que extraería mi bifurcación adcSTUDIO / Chosen.

En lugar de ocultar el cuadro de selección original, cuando se requiere la selección y cuando hay un error, el parche coloca el cuadro de selección debajo del cuadro de selección Elegido, de modo que el mensaje de error HTML5 integrado aparece en la ubicación correcta. Editar: probablemente debería tener en cuenta que si el cuadro no está marcado como "obligatorio" y nunca se invalida, se conserva el comportamiento existente.

Esta solicitud de extracción no agrega ninguna funcionalidad adicional fuera de hacer que se muestren los avisos de error HTML5 integrados.

¡Gracias Kevin!

2013/7/29 Kevin Newman [email protected]

Hay una solicitud de extracción que acompaña a esto: # 900 https://github.com/harvesthq/chosen/issues/900 que extraería mi bifurcación adcSTUDIO / Chosen.

En lugar de ocultar el cuadro de selección original, cuando se requiere la selección,
y cuando hay un error, el parche coloca el cuadro de selección debajo
el cuadro de selección Elegido, de modo que el mensaje de error HTML5 integrado aparezca en
la ubicación correcta.

Esta solicitud de extracción no agrega ninguna funcionalidad adicional fuera de
haciendo que se muestren los avisos de error HTML5 integrados.

-
Responda a este correo electrónico directamente o véalo en Gi
.

Urs Bräm
Sitios web macht

lic. phil. I

Theaterplatz 2
3011 Berna
Tel. Büro: +41 31 311 73 61
Tel. Mobil & Combox: +41 76327 01 51
http://www.ursbraem.ch

Privat:
Beundenfeldstr. 50
3013 Berna
P +41 31301 41 90

Hola,
Acabo de obtener la última versión (1.0) y todavía tengo este problema. Cuando se agrega elegido a un cuadro de selección con el atributo requerido, en Firefox la información sobre herramientas "por favor seleccione un elemento de la lista" aparece en la esquina superior izquierda de la pantalla. En Chrome no pasa nada en absoluto. ¿La solicitud de extracción no está integrada con la versión 1.0? ¿Cómo puedo descargar ese parche? Lo siento, no estoy más familiarizado con Github y gracias de antemano.

No creo que mis cambios se hayan fusionado. Probablemente mi bifurcación también deba actualizarse, ha pasado un tiempo.

Ah, eso es una lástima. ¿Alguna idea de si está en la tubería de la rama principal? ¿Alguna sugerencia para que esto funcione mientras tanto?

No tengo idea si planean integrar esto en master, pero lo que puede hacer es usar mi fork y sincronizarlo con master, y eso le dará una actualización hasta la fecha de extracción de su repositorio, con mis cambios aplicados (asumiendo sin conflictos), o simplemente use mi bifurcación algo desactualizada. Desafortunadamente, no tendré tiempo para actualizar mi bifurcación a corto plazo.

Aquí está mi tenedor por cierto: https://github.com/adcSTUDIO/chosen

Gracias, Kevin.


Yaron Guez
Arquitecto jefe de software
MedAdaptics - http://medadaptics.com
(781) 767-7434

El miércoles 27 de noviembre de 2013 a las 12:35 p.m., Kevin Newman [email protected] escribió:

Aquí está mi tenedor por cierto: https://github.com/adcSTUDIO/chosen

-
Responda a este correo electrónico directamente o véalo en Gi
.

@CaptainN ¿Ha abierto un PR con sus cambios? No veo ningún enlace a un PR en esta discusión. Y si no hay un RP para revisarlo, es poco probable que se revise su bifurcación (los mantenedores revisan las contribuciones enviadas, lo que ya requiere tiempo, por lo que no intentarán encontrar contribuciones no enviadas)

Hay un PR # 900, es un poco desordenado, probablemente podría volver a colocarlo en algún momento y limpiarlo si pudiera ayudar.

<seleccione requerido> soporte de atributo para el complemento elegido

¡Hola!
Todo es muy, muy simple, y no necesitas tener 2 años para discutirlo :)
@ CapitánN @yaronguez @stof @kenearley

Para agregar la visualización correcta de un mensaje de error del navegador con elegido para <seleccionar requerido> cuando el usuario no elige ninguna opción,

  1. Eliminar pantalla: ninguna configuración para la etiqueta de selección del código JS del complemento.
  2. Envuelva la etiqueta <select> en la envoltura <div> , luego agregue la posición CSS para este <div> en su CSS.
  3. Agregar posición: absoluta; clip: rect (0,0,0,0); para ocultar la etiqueta <select> en el código JS del complemento.

Si no desea perder tiempo editando el código del complemento, simplemente agregue algo como después de inicializar el complemento elegido.

Ejemplo:

 función InitChosen () {
  $ ('select.chzn'). each (function (index) {
  $ (esto) .chosen ({
  disable_search_threshold: 5,
  no_results_text: "Ничего не найдено!"
  });
  this.setAttribute ('estilo', 'pantalla: visible; posición: absoluta; clip: rect (0,0,0,0)');
  });
 }

Eso es todo. Aaaaa y ahora ... ¡DISCO! :)
** Para navegadores que admiten el atributo "obligatorio".

Cromo

--2

FireFox

--1

@Aharito ¿No solucionaremos el problema del orden de tabulación con esto?

Gracias @Aharito , está funcionando muy bien con la v1.1.0 elegida, solo reemplace $('select.chzn') con $('.chosen-select') .

Pensé que probé ese truco de clip: rect, y encontré algún problema con él. ¿Quizás con un navegador más antiguo? Supongo que si está funcionando ahora, eso es genial.

Creo que también puede haber problemas con las pestañas con mi solución (no puedo recordar, ha pasado un tiempo); reduje el impacto aplicando el parche solo a los campos que presentan el atributo requerido.

Hemos estandarizado esto en todas las llamadas a $().chosen()

$.fn.oldChosen = $.fn.chosen
$.fn.chosen = function(options) {
  var select = $(this)
    , is_creating_chosen = !options || _.isObject(options)

  if (is_creating_chosen && select.css('position') === 'absolute') {
    // if we are creating a chosen and the select already has the appropriate styles added
    // we remove those (so that the select hasn't got a crazy width), then create the chosen
    // then we re-add them later
    select.removeAttr('style')
  }

  var ret = select.oldChosen(options)

  if (is_creating_chosen) {
    // https://github.com/harvesthq/chosen/issues/515#issuecomment-33214050
    // only do this if we are initializing chosen (no params, or object params) not calling a method
    select.attr('style','display:visible; position:absolute; clip:rect(0,0,0,0)');
  }
  return ret
}

@ghiculescu Eso no resuelve el problema de tabular o desplazar-tabular en la selección, ¿verdad?

@DASPRiD nop .

¿Qué pasa con esto como una posible solución de encubrimiento?

no es perfecto, pero de hecho, evita que aparezca la selección original pasando el foco al siguiente cuadro de diálogo elegido, pero tal vez sea un paso más cerca

"elegido-seleccionar" es solo un selector para las selecciones que tengo con una clase en particular, no estoy seguro de si el "enfoque de clic" cubre todos los eventos respectivos a los que debería engancharme, pero tal vez alguien pueda decir qué más falta.

También es posible que haya entendido mal algo sobre la estructura html elegida y descubra que ("a") es demasiado liberal, ¿alguien tiene más experiencia?

$(".chosen-select").on("click focus",function(event){
    $(this).next(".chosen-container").find("a").trigger(event.type);
});

oh, y seguramente " display: visible " debería ser " display: block " o algo así? causa v isibilidad: visible es válido, pero display: visible Estoy seguro de que no

Lo que encontré es que si tiene varias selecciones una al lado de la otra en el mismo contenedor, esto las desplaza todas a la ubicación incorrecta, por lo que la posición: absoluta hace que el mensaje de validación aparezca en la posición incorrecta.

Resolví esto separando y volviendo a colocar en el contenedor elegido, así

$(".chosen-select").each(function(){
    $(this).next(".chosen-container").prepend($(this).detach());
});

la solución anterior, después de más investigación, muestra que deshabilita la tabulación a través de los campos por completo y no puedo resolver el problema, sin embargo, elimina el problema de la selección que aparece cuando estás tabulando, así que eso es más problema importante en mi mente, puedo vivir sin tabular si puedo tenerlo para que no rompa la pantalla, ya que más personas están usando dispositivos móviles y no están tabulando de todos modos, solo afecta a los usuarios de escritorio, sigue siendo importante, pero relativamente hablando, manejable.

sin embargo, si alguien resuelve eso de alguna manera, estoy muy interesado en averiguarlo.

ok, más allá de lo que estaba intentando antes, encontré que los eventos elegidos estaban usando y decidí que cuando hiciera cualquier evento en la selección ahora oculta, podría secuestrarlo y activar un evento elegido para abrirlo.

Creo que funciona muy bien.

$(".chosen-select").each(function(){
    //    take each select and put it as a child of the chosen container
    //    this mean it'll position any validation messages correctly
    $(this).next(".chosen-container").prepend($(this).detach());

    //    apply all the styles, personally, I've added this to my stylesheet
    $(this).attr("style","display:block!important; position:absolute; clip:rect(0,0,0,0)");

    //    to all of these events, trigger the chosen to open and receive focus
    $(this).on("click focus keyup",function(event){
        $(this).closest(".chosen-container").trigger("mousedown.chosen");
    });
});

Creo que esta es la mejor versión que tengo hasta ahora. Afortunadamente, esto resuelve el problema de tabulación hacia adelante, todavía existe la tabulación inversa, no puede tabular hacia atrás a través de una selección elegida porque en el momento en que tabula en el elemento de selección, inmediatamente vuelve a enfocarse en el contenedor elegido, lo que significa que ' estar atrapado en solo poder tabular hacia adelante.

Podría ser una idea realizar un seguimiento del elemento anterior y si el elemento que anteriormente tenía el foco de pestaña estaba delante del elemento enfocado actual, irá hacia atrás, luego salte apropiadamente el reenfoque al elegido y seleccione la pestaña anterior, pero No estoy seguro de cómo hacer eso.

Después de una lectura muy larga, pensé haber probado las sugerencias presentadas a lo largo de los años.

Desafortunadamente, no pude hacer funcionar el código de @christhomas . Lo invoco dentro de una función de envío sin resultados visibles (tampoco errores).

La buena noticia es que la nueva función de @ghiculescu funciona como un regalo, ya que todavía puedo usar el archivo CDN elegido y solo usar la función en mi archivo js.

@DASPRiD @charettes ¿qué quiere decir que la pestaña no funciona con la función modificada? Parece estar funcionando para mí

Bastante fácil agregar tabindex: -1 a la selección del fragmento de @ghiculescu , resolviendo el problema de tabulación.

Ejemplo: http://jsfiddle.net/hq7b426j/

¡Ahora podía ver el problema! Tu adición funciona muy bien @andreialecu

Por cierto, se necesitaba otra adición. En iPhone u otros dispositivos no compatibles, el violín no funcionaría correctamente. Chosen se deshabilita en iPhone y deja el <select> sin cambios, y el código en el violín de arriba lo escondería, sin dejar ninguna forma de interactuar con el seleccionado.

Este violín lo corrige (agregando una pantalla: ninguna verificación):
http://jsfiddle.net/hq7b426j/1/

¡¡Ah, eso es aún mejor !! ¡Gracias! Todavía estoy probando también, pero publicaré si surge algo más

@CaptainN, por favor, informe que tengo el mismo problema. wr necesito poner ese código. estoy usando el tema inspina de wrapbootstrap.

@ vidhyaprakash85 No estoy seguro de lo que quieres decir. Me había bifurcado hace mucho tiempo y escribí una solicitud de extracción (n. ° 900), pero los repositorios no están sincronizados ahora y mi bifurcación está muy desactualizada. Puede encontrarlo aquí si le ayuda: https://github.com/adcSTUDIO/chosen

ya estoy usando https://github.com/harvesthq/chosen cómo hacer eso :(

@andreialecu ¡ tu código funciona bien! ¡¡¡Gracias!!!

Gracias @christhomas, tu código funcionó muy bien: bailarina:

Ni @christhomas ni @ghiculescu funcionaron para mí usando una selección de varios

Cuando probé el parche @ghiculescu , funcionó, excepto que se mostraba un desplazamiento todo el tiempo, debajo del cuadro de selección.
Cuando probé el parche @christhomas , apareció la ventana emergente sin que se abriera el cuadro de búsqueda.

Tuve que modificar el script de

target.find('select')
        .chosen('destroy')
        .chosen({disable_search_threshold: 10})

De lo contrario, el segundo viaje eliminó el estilo que se agregó en el primero:

$.fn.oldChosen = $.fn.chosen
$.fn.chosen = function(options) {
  var select = $(this)
    , is_creating_chosen = !!options

    var style = 'display:visible; position:absolute; clip:rect(0,0,0,0);'

        if (is_creating_chosen && select.css('position') === 'absolute' && select.attr('style') != style) {
            // if we are creating a chosen and the select already has the appropriate styles added
            // we remove those (so that the select hasn't got a crazy width), then create the chosen
            // then we re-add them later
            select.removeAttr('style')
        }

        var ret = select.oldChosen(options)

        // only act if the select has display: none, otherwise chosen is unsupported (iPhone, etc)
        if (is_creating_chosen && select.css('display') === 'none') {
            // https://github.com/harvesthq/chosen/issues/515#issuecomment-33214050
            // only do this if we are initializing chosen (no params, or object params) not calling a method
            select.attr('style', style);
            select.attr('tabindex', -1);
        }
        return ret
}

Acabo de agregar esta condición adicional al primero si: && select.attr('style') != style

@doganmeh Funciona muy bien en Chrome y dispositivos móviles (con Chrome) pero probado en Firefox 53.0 donde no funciona

Incluso este http://jsfiddle.net/hq7b426j/1/ no funciona en Firefox 53.0

Hmmm, pero esto parece más un problema de Firefox porque si hace clic en el botón más veces, verá que Firefox intenta mostrar el mensaje (pero nunca se procesa por completo)

He usado esta solución. Es muy simple y funciona perfecto:

<style>
    select.submitted:invalid + .chosen-container{
        border-color: red !important;
    }
</style>
$('#yourSelector').chosen({
                no_results_text: "yourText",
                disable_search_threshold: 9,
                search_contains: true
                //your parameters
    }).on('invalid', function(){
        $(this).addClass('submitted');
    });

parece que esto no funciona si ha elegido con múltiples selecciones:
http://jsfiddle.net/jeromax/o5a8aogh/

Lo arreglé.

'
$ .fn.oldChosen = $ .fn.chosen
$ .fn.chosen = function (opciones) {
var select = $ (esto),
is_creating_chosen = !! opciones;

if (is_creating_chosen && select.css ('posición') === 'absoluta') {
// si estamos creando un elegido y el seleccionado ya tiene los estilos apropiados agregados
// los eliminamos (para que la selección no tenga un ancho loco), luego creamos el elegido
// luego los volvemos a agregar más tarde
select.removeAttr ('estilo');
}

var ret = select.oldChosen (opciones)

// solo actúa si la selección tiene pantalla: ninguna, de lo contrario, la opción elegida no es compatible (iPhone, etc.)
if (is_creating_chosen && select.css ('display') === 'none') {
// https://github.com/harvesthq/chosen/issues/515#issuecomment -33214050
// solo hacemos esto si estamos inicializando elegido (sin parámetros, o parámetros de objeto) sin llamar a un método

  $(this).each(function(index){
      if($(this)[0].multiple==true){
          $(this).attr('style','display:visible; width:0px; height:0px; margin-top:25px; position:absolute; clip:rect(0,0,0,0)');
      }else{
          $(this).attr("style","display:visible; position:absolute; clip:rect(0,0,0,0)");
      }
  })

select.attr ('tabindex', -2);

}
volver ret
}
'

+1

¿Alguien puede arreglar esto? Es un problema bastante antiguo y una funcionalidad muy importante hoy en día. Gracias.

No funciona en la última versión.

Esto parece estar rompiendo la validación del formulario angular.js cuando se usa también angular-elegido.

Es 2018 y seguimos teniendo el mismo problema. Es un infierno cómo los estándares HTML no pueden funcionar correctamente e integrarse con complementos externos. Tiempos locos :)

Esto también está rompiendo el complemento elegido por Drupal. Ver https://www.drupal.org/project/chosen/issues/2705891

No se pudo encontrar ninguna solución adecuada para esto que no sea una solución alternativa:

<div class="form__select">
  <select class="chosen">
    <!-- options -->
  </select>
</div>
.form__select {
    position: relative;
}

.form__select .chosen {
    display: block !important;
    height: 0;

    position: absolute;
    left: 35px;
    bottom: 0;

    outline: none;
    border-color: white;

    pointer-events: none;
}

Si está usando Elegido para todos los elementos select , puede usar este CSS para cambiarlo y hacerlo visible (para DOM), pero sin opacidad, altura, posición absoluta.

Estos selectores de CSS apuntan a elementos de selección no válidos, y uno de ellos apunta a multiple añadiendo un 15px margin-top para centrarlo en los elementos de selección múltiple.

select:invalid {
    height: 0px !important;
    opacity: 0 !important;
    position: absolute !important;
    display: flex !important;
}

select:invalid[multiple] {
   margin-top: 15px !important;
}

Demostración: http://jsfiddle.net/tripflex/2zdeu9oc/

PERO REALMENTE ... esto ya debería ser manejado por la lib Chosen.JS

Aquí está mi solución alternativa, si es de alguna utilidad:

// Initialise Chosen
$(function () {
    $('select').chosen();
});

// Place the original input behind the Chosen input, matching the height and width so that the warning appears in the correct position
$('select').on('chosen:ready', function () {
    const height = $(this).next('.chosen-container').height();
    const width = $(this).next('.chosen-container').width();

    $(this).css({
            'position': 'absolute',
            'height': height,
            'width': width,
            'opacity': 0
        })
        .show();
});

@jonathanbull ¿puedes mostrarlo dentro de contexto? Probé tu solución y no funcionó.

@AndrewSouthpaw Este es mi código, las correcciones funcionan bien para mí :)

$("#select").val([]); // disable default selection by browser
$('#select').on('chosen:ready', function(evt, params, chosen) {
    $(this).css({'position': 'absolute', 'height': 0, 'opacity': 0}).show();
});
$("#select").chosen();

Estoy usando un código ligeramente diferente (basado en el código aquí):

$('.chosen-select').on("chosen:ready", function (evt, data) {
  $(this)
    .addClass('chosen_hidden')
    .attr('tabindex', '-1')
    .prependTo(data.chosen.container)
    .show()
  })
  .chosen({width: '100%'})
.chosen_hidden {
  position: absolute;
  top: 0;
  bottom: 0;
  max-height: 100%; // required for IE 10
  // **not required** opacity: 0;
}

No maneja la acción 'destruir', pero coloca bien el mensaje de error y parece funcionar en Firefox y Chromiun. Como el selector original no está oculto, el borde resaltado de error es visible. Actualización : con max-height también funciona en IE. Otra actualización : agregue tabindex -1 para asegurarse de que no reciba el foco. (sin dejar de ser enfocable y recibir mensajes de error).

Ha habido un PR abierto que resuelve esto, pero creo que se perdió ya que el otro hilo al que apuntaba se cerró. Ver # 2594

A @jhedstrom le encantaría que se fusionara. ¿Sabes si esta biblioteca todavía se mantiene?

Usé algo similar a la solución de

https://github.com/harvesthq/chosen/pull/2594#issuecomment -714806139

¡Gracias @jhedstrom por señalarme en la dirección correcta!

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

alexfrancavilla picture alexfrancavilla  ·  9Comentarios

vpode picture vpode  ·  5Comentarios

scottdoc picture scottdoc  ·  7Comentarios

lordspace picture lordspace  ·  6Comentarios

raggzy picture raggzy  ·  5Comentarios
bleepcoder.com utiliza la información de GitHub con licencia pública para proporcionar a los desarrolladores de todo el mundo soluciones a sus problemas. No estamos afiliados a GitHub, Inc. o a ningún desarrollador que use GitHub para sus proyectos. No alojamos ninguno de los vídeos o imágenes en nuestros servidores. Todos los derechos pertenecen a sus respectivos propietarios.
Fuente de esta página: Fuente

Lenguajes de programación populares
Proyectos populares de GitHub
Más proyectos de GitHub

© 2024 bleepcoder.com - Contact
Made with in the Dominican Republic.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.