Chosen: html5 requer suporte a atributos?

Criado em 4 mar. 2012  ·  80Comentários  ·  Fonte: harvesthq/chosen

Quando escolhido é inicializado em uma entrada de seleção, ele adiciona [style = " display: none "] à tag de seleção e cria as várias tags div de que precisa, como segue.

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

Tudo bem, mas teremos um problema se eu adicionar o atributo html5 'obrigatório' à minha tag de seleção, que produz a seguinte marcação após a inicialização escolhida:

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

O problema ocorre quando o usuário envia o formulário sem selecionar um valor. Para o usuário, o navegador parece não fazer nada. Na verdade, ele está exibindo uma mensagem de erro para o usuário selecionar um valor, mas como o CSS instrui o navegador a não mostrar o elemento selecionado, a mensagem de erro também não aparece.

Isso está acontecendo no Chrome, não tenho certeza sobre o comportamento de outros navegadores.

Não cavei fundo o suficiente para sugerir uma solução, mas isso é um problema, pois começamos a incluir atributos html5 em nossos formulários.

Feature Request

Comentários muito úteis

+1

Alguém pode consertar isso? É um problema muito antigo e uma funcionalidade muito importante hoje em dia. Obrigada.

Todos 80 comentários

Também percebi recentemente esse problema.
Obrigatório não é compatível com todos os navegadores, então criei um fallback para percorrer os elementos de um formulário no envio e verificar se há algum valor lá quando "obrigatório" está presente.
O problema ainda existe no cromo porque a seleção oculta não tem valor e não está alertando o usuário de acordo com os documentos do webkit:
http://trac.webkit.org/wiki/Styling%20Form%20Controls

"Uma mensagem de validação consiste em quatro elementos div com pseudo classes e alguns nós para o texto da mensagem. Você pode personalizar a aparência alterando o estilo dessas pseudo classes."

Estou pensando que a melhor maneira de lidar com isso é ter escolhido gerar a marcação adicional para sua seleção renderizada com classes semelhantes para que eles sejam estilizados por padrão no navegador, ou potencialmente anexar pseudoelementos a elementos que falharam na validação por usando as condições de falha apropriadas em CSS como: inválido.

Por enquanto, parece que sua única opção é ter um substituto no nível do DOM, como minha solução javascript. Posso fornecê-lo aqui se isso for útil, mas é realmente um substituto para o escolhido, não uma maneira de corrigir a estrutura escolhida.

Qual é o status deste problema? Tenho exatamente o mesmo problema com a última versão do Firefox (14.0.1)

Como os atributos HTML5 são cada vez mais usados ​​em sites, isso deve ser abordado de uma forma ou de outra.

Eu também tenho o mesmo problema. Gostaria de saber sua solução alternativa.

Obrigado

Parece que há apenas um problema principal e um problema secundário que seria ótimo corrigir.

  • Se o elemento do formulário for inválido (nada é selecionado), os navegadores exibirão uma pequena sinalização que mostra a posição do erro, com uma mensagem dizendo para preencher este campo. Com escolhido, no Firefox, esse sinalizador de mensagem está no canto inferior esquerdo da janela do navegador.
  • Não há estilo definido para campos de formulário inválidos. Por padrão, no Firefox (varia entre os navegadores, mas todos eles fazem algo semelhante), você obtém um efeito de brilho vermelho ao redor de cada campo de formulário inválido. As caixas de seleção escolhidas não recebem nada.

O primeiro item é o mais problemático. Isso poderia ser corrigido utilizando um método diferente de ocultação de elemento selecionado? Substituindo " display: none " no elemento de seleção oculto por "position: absolute; visibility: hidden;" chega bem perto - embora isso dependa mais do CSS circundante ...

Porém, não funciona para o Webkit. Parece que o sinalizador de erro herda os estilos da caixa de seleção no webkit (Chrome), portanto, se você definir opacidade: .5, o sinalizador também será opacidade .5 (como um exemplo). desapontamento.

Mais um - o Opera funciona corretamente como está, mas se eu mudar para o CSS baseado na posição acima, ele não funcionará direito. Que dor.

Desculpe por enviar spam. Mas acho que entendi! Se você envolver o elemento selecionado em uma extensão e usar este CSS no wrapper (e remover display: none no elemento selecionado):

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

Você receberá a mensagem de erro e não interromperá o fluxo da página ao mesmo tempo. O único problema é que você tem que deixar a caixa visível para ver a mensagem de erro porque o Firefox e o WebKit irão esconder a mensagem se você não fizer isso. Isso faz com que a caixa de seleção receba guias por meio do formulário.

A maneira de contornar isso pode ser alternar a exibição de nenhum para bloco embutido no envio (ou o evento 'inválido') e, em seguida, alterná-lo de volta em determinados eventos de entrada (como o mouse pressionado ou pressionamento de tecla).

Há também um pequeno problema de posicionamento, resolvido forçando a posição a ficar diretamente sob a caixa escolhida.

Seria bom ver algum tipo de suporte integrado para isso, se possível.

Eu escrevi um patch aqui: https://github.com/adcSTUDIO/chosen

Pode não ser robusto o suficiente para inclusão, mas sinta-se à vontade para testá-lo.

Obrigado @CaptainN! Vou dar uma olhada!

@CaptainN , comecei a trabalhar - obrigado por fazer essas alterações. No entanto, você sabe como permitir que a largura dos pop-ups de erro exceda a largura das próprias caixas de seleção? Em alguns dos meus elementos selecionados menores, a mensagem de erro é muito fina, o que não parece muito bom e pode até ser difícil de ler em alguns.

Se não, tudo bem, você já ajudou muito com isso. Obrigado novamente!

@caderade Não tenho certeza de como consertar esse problema. Eu tentei overflow: visible e algumas outras coisas, e ainda aparece curto Vou tentar mais algumas coisas, mas isso parece ser um problema com o Firefox que pode não ter uma solução alternativa (essas sinalizações são geralmente muito difíceis de resolver com, junto com aquele brilho, que eu ainda não encontrei uma maneira de estilizar completamente).

@CaptainN : Muito bom.

Funciona muito bem para mim no Firefox 17 e Chrome 23.

No IE 8 + 9 (que não oferece suporte a validação de formulário HTML5 de forma alguma), ao alterar o valor do campo, recebo um erro de JavaScript por causa do seletor :valid desconhecido sendo usado. Assim, o script é abortado e o formulário não fica feio de forma alguma, o que eu esperava no IE. : smirk: Não apontar um erro seria melhor, no entanto. Qualquer ideia?

Oh, que chatice. Na verdade, acho que o jQuery me protegeria mais! Vou ter que adicionar uma verificação do IE ou algo assim ...

Kevin N.

@CaptainN Tem o problema para mim também no Chrome. Não tinha certeza se você pensava que era apenas um problema do Firefox ou não. Mas cara, muito obrigado de novo, cara. Otimo trabalho! Deixe-nos saber se você alguma vez conseguir resolver o problema da largura.

Parece que o jQuery tem algum suporte embutido para pseudo-seletor e um sistema de ganchos para que os plug-ins possam adicionar os seus próprios e, se não encontrar nenhum, ele o passa para a implementação subjacente - então: obrigatório e: válido lança um erro no IE (e provavelmente em algumas versões do Safari) se eles não foram polyfilled. Vou ver se consigo lançar um tipo alternativo de verificação lá, em vez de usar os pseudo seletores. Parece que posso apenas verificar attr ("obrigatório") para substituir: obrigatório - provavelmente terei que fazer algum tipo de detecção de recurso para: válido - talvez uma verificação para uma propriedade .oninvalid?

Ok, recebi um novo patch que corrige o erro do IE (e deve corrigi-lo em qualquer outro navegador também). Este patch muda algumas coisas (nada que você deva notar). Aqui estão minhas notas:

  • correspondeu ao estilo de codificação dos manipuladores de eventos presentes na versão jquery (bind em vez de on, etc.)
  • Não consigo fazer com que a versão do protótipo oculte o elemento select quando validado - parece que o evento de mudança do elemento do formulário está sendo suprimido de alguma forma (funciona de outra forma) - acho que é um bug, mas não um que eu apresentei. Precisa investigar mais.
  • Existem algumas pequenas peculiaridades sobre o posicionamento do elemento inválido que às vezes pode precisar de intervenção manual do usuário por meio de CSS (apenas um problema se o recurso necessário for usado).
  • caixas de seleção de largura curta acabam com sinalizadores necessários simplificados no navegador (também um problema com elementos de seleção vanilla se você definir a largura por meio de css). Não consigo encontrar uma solução alternativa (deixe-me saber se você encontrar!). Talvez comece com o Mozilla, já que isso vai acontecer com as caixas vanilla também. Além disso, talvez verifique suas extensões de css? https://developer.mozilla.org/en-US/docs/CSS/CSS_Reference/Mozilla_Extensions?redirectlocale=en-US&redirectslug=CSS_Reference%2FMozilla_Extensions (não consegui encontrar nada rapidamente)
  • Não consigo fazer o uglifyjs funcionar no Windows (portanto, as compilações .min.js não são atualizadas em meu repo) - tentarei uma compilação do OSX amanhã.

@CaptainN Para seu problema com o UglifyJS, certifique-se de instalar a versão 1, pois a versão 2 não é BC. # 915 está atualizando o packages.json

Como eu mudo a versão usando npm?

@CaptainN npm install uglify-js@1 para forçar o IIRC versão 1 (mas não sou um especialista em nó). A outra solução é verificar meu branch e executar npm install com o arquivo packages.json atualizado.

Consegui construir as versões do uglified no meu mac de trabalho (talvez tenha uma versão mais antiga do uglify-js?). Eles agora estão atualizados em meu repo.

Estou usando apenas o sabor jQuery atualmente. Nenhum erro de script no IE8 / 9 mais. : +1: por ver esse recurso no upstream em breve.

Também estamos enfrentando esse problema. Existe uma solução alternativa, exceto desativar a validação de HTML5?
@CaptainN corrigiu pelo que li. Então eu tentei seu arquivo escolhido.jquery.js no branch master. Mas dá erro js de msie indefinido.

Eu pensei que tinha consertado isso. Essa bifurcação foi há um tempo atrás e pode precisar ser atualizada. Vou ver se consigo fazer isso esta semana e ver o bug do IE.

Eu sincronizei este upstream e não vi nenhum aviso de erro indefinido no IE. Tente meu repositório novamente e entre em contato se o problema persistir. (Lamentamos que demorou tanto tempo)

Obrigado!

: +1:

Alguém poderia resumir isso para mim? Existe um fork ou patch ao redor que está pronto para produção?

Há uma solicitação de pull que vem junto com isso - # 900 que puxaria meu garfo adcSTUDIO / Chosen.

Em vez de ocultar a caixa de seleção original - quando a seleção é necessária e há um erro, o patch posiciona a caixa de seleção abaixo da caixa de seleção Escolhida, de modo que a mensagem de erro HTML5 embutida apareça no local correto. Editar: provavelmente devo observar que, se a caixa não estiver marcada como "obrigatória" e nunca for invalidada, o comportamento existente será preservado.

Essa solicitação de pull não adiciona nenhuma funcionalidade adicional além de fazer com que os avisos de erro embutidos no HTML5 sejam exibidos.

Obrigado Kevin!

29/07/2013 Kevin Newman [email protected]

Há uma solicitação de pull que vem junto com isso - # 900 https://github.com/harvesthq/chosen/issues/900 que puxaria meu garfo adcSTUDIO / Chosen.

Em vez de ocultar a caixa de seleção original - quando a seleção for necessária,
e quando há um erro, o patch posiciona a caixa de seleção abaixo
a caixa de seleção escolhida, de modo que a mensagem de erro HTML5 embutida apareça em
o local correto.

Esta solicitação pull não adiciona nenhuma funcionalidade adicional fora do
fazendo com que os avisos de erro embutidos no HTML5 sejam exibidos.

-
Responda a este e-mail diretamente ou visualize-o em Gi tHubhttps: //github.com/harvesthq/chosen/issues/515#issuecomment -21750086
.

Urs Bräm
sites macht

lic. phil. eu

Theaterplatz 2
3011 Bern
Tel. Büro: +41 31 311 73 61
Tel. Mobil e Combox: +41 76 327 01 51
http://www.ursbraem.ch

Privat:
Beundenfeldstr. 50
3013 Bern
P +41 31 301 41 90

Oi,
Acabei de obter a versão mais recente (1.0) e ainda estou tendo esse problema. Quando escolhido é adicionado a uma caixa de seleção com o atributo necessário, no Firefox, a dica de ferramenta "selecione um item da lista" aparece no canto superior esquerdo da tela. No Chrome, nada acontece. A solicitação de pull não está integrada com a versão 1.0? Como posso baixar esse patch? Desculpe, não estou mais familiarizado com o Github e agradeço antecipadamente!

Não acho que minhas alterações foram mescladas. Meu garfo provavelmente precisa ser atualizado também - já faz um tempo.

Ah, isso é muito ruim. Alguma ideia se está no pipeline do branch master? Alguma sugestão para fazer isso funcionar nesse meio tempo?

Não tenho ideia se eles planejam integrar isso ao master, mas o que você pode fazer é usar meu fork e sincronizá-lo com o master, e isso vai te dar uma atualização do pull de seu repositório, com minhas alterações aplicadas (assumindo sem conflitos) - ou apenas use meu fork um tanto desatualizado. Infelizmente, não terei tempo para atualizar meu fork no curto prazo.

Aqui está meu garfo btw: https://github.com/adcSTUDIO/chosen

Obrigado, Kevin.


Yaron Guez
Arquiteto Chefe de Software
MedAdaptics - http://medadaptics.com
(781) 767-7434

Na quarta-feira, 27 de novembro de 2013 às 12h35, Kevin Newman [email protected] :

Aqui está meu garfo btw: https://github.com/adcSTUDIO/chosen

-
Responda a este e-mail diretamente ou visualize-o em Gi tHubhttps: //github.com/harvesthq/chosen/issues/515#issuecomment -29403732
.

@CaptainN Você abriu um PR com suas mudanças? Não vejo nenhum link para um PR nesta discussão. E se não houver PR para revisá-lo, é improvável que seu fork seja revisado (os mantenedores revisam as contribuições enviadas, o que já requer tempo, então eles não tentarão encontrar contribuições não enviadas)

Há um PR # 900 - é uma bagunça - provavelmente poderia rebase-o em algum ponto e limpá-lo se ajudasse.

<selecione necessário> suporte de atributo para o plugin escolhido

Olá!
Tudo é muito, muito simples, e você não precisa de 2 anos para discutir isso :)
@CaptainN @yaronguez @stof @kenearley

Para adicionar a exibição correta de uma mensagem de erro do navegador com escolhido para <selecionar necessário> quando o usuário não escolhe nenhuma opção,

  1. Remover display: nenhuma configuração para selecionar a tag do código JS do plugin.
  2. Envolva a tag <select> na embalagem <div> e , em seguida, adicione a posição CSS para este <div> em seu CSS.
  3. Adicionar posição: absoluto; clipe: rect (0,0,0,0); para ocultar a tag <select> no código JS do plugin.

Se você não quiser perder tempo editando o código do plugin, basta adicionar algo como setAttribute ('style', 'display: visible; position: absolute; clip: rect (0,0,0,0)'); após inicializar o plugin escolhido.

Exemplo:

 function InitChosen () {
  $ ('select.chzn'). each (função (índice) {
  $ (this) .chosen ({
  disable_search_threshold: 5,
  no_results_text: "Ничего не найдено!"
  });
  this.setAttribute ('style', 'display: visible; position: absolute; clip: rect (0,0,0,0)');
  });
 }

Isso é tudo. Aaaaaand agora ... DISCO! :)
** Para navegadores que suportam o atributo "obrigatório".

cromada

--2

Raposa de fogo

--1

@Aharito Não vamos resolver o problema de ordem de tabulação ao fazer isso?

Obrigado @Aharito , está funcionando muito bem com a v1.1.0 escolhida, basta substituir $('select.chzn') por $('.chosen-select') .

Pensei ter tentado aquele truque do clipe: rect, e encontrei algum problema com ele. Talvez com um navegador mais antigo? Acho que está funcionando agora, ótimo.

Acho que também pode haver problemas de tabulação com a minha solução (não me lembro, já faz um tempo) - reduzi o impacto aplicando apenas o patch aos campos que apresentam o atributo obrigatório.

Padronizamos isso em todas as chamadas para $().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 Isso não resolve o problema de tabulação ou shift-tab no select, resolve?

@DASPRiD não .

que tal isso como uma possível solução de encobrimento.

não é perfeito, mas, na verdade, impede que a seleção original apareça passando o foco para a próxima caixa de diálogo escolhida, mas talvez seja um passo mais perto

"escolhido-selecionar" é apenas um seletor para as seleções que tenho com uma classe em particular, não tenho certeza se "clique em foco" cobre todos os respectivos eventos que devo conectar, mas talvez alguém possa dizer o que mais está faltando?

também é possível que eu não tenha entendido algo sobre a estrutura html escolhida e find ("a") seja muito liberal, alguém tem mais experiência?

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

oh, e certamente " display: visible " deveria ser " display: block " ou algo assim? causa visibilidade: visível é válido, mas exibição: visível Tenho certeza que não

o que descobri é que se você tiver vários selects próximos um do outro no mesmo contêiner, isso os desloca todos para o local errado, então a posição: absoluto faz com que a mensagem de validação apareça na posição errada.

Resolvi isso desanexando e recolocando no recipiente escolhido, assim

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

a solução acima, após mais investigação, mostra que desativa a tabulação pelos campos completamente e não consigo resolver o problema, no entanto, elimina o problema do select aparecer quando você está tabulando, então é mais problema importante na minha mente, posso viver sem tabulação se puder para não quebrar a tela, visto que mais pessoas estão usando dispositivos móveis e não estão tabulando de qualquer maneira, isso afeta apenas usuários de desktop, ainda importante, mas relativamente falando, gerenciável.

no entanto, se alguém resolver isso de alguma forma, estou muito interessado em descobrir.

ok, então, além do que estava tentando antes, descobri que os eventos escolhidos estavam usando e decidi que quando fizesse qualquer evento no select agora oculto, poderia sequestrá-lo e acionar um evento escolhido para abri-lo.

eu acho que funciona bem.

$(".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");
    });
});

Acho que esta é a melhor versão que tenho até agora. Felizmente, isso resolve o problema da tabulação para frente, ainda há a tabulação reversa, você não pode alternar para trás em uma seleção escolhida porque, no segundo que você tabular no elemento de seleção, você imediatamente refocaliza no contêiner escolhido novamente, o que significa que você ' está preso em apenas ser capaz de avançar com tabulação.

Pode ser uma ideia manter o controle do elemento anterior e se o elemento que anteriormente tinha o foco da guia estava na frente do elemento em foco atual, você está retrocedendo e, em seguida, pule o redirecionamento para o escolhido e selecione a guia anterior, mas não tenho certeza de como fazer isso.

Depois de uma longa leitura, pensei ter experimentado as sugestões apresentadas ao longo dos anos.

Infelizmente, não consegui fazer o código do @christhomas funcionar. Eu o invoco em uma função de envio sem resultados visíveis (sem erros também).

A boa notícia é que a nova função de @ghiculescu funciona como uma delícia, pois ainda posso usar o arquivo CDN escolhido e apenas usar a função no meu arquivo js.

@DASPRiD @charettes o que você quer dizer com guia não funciona com a função modificada? Parece estar funcionando para mim

Fácil de adicionar tabindex: -1 para selecionar o snippet de @ghiculescu , resolvendo o problema de tabulação.

Exemplo: http://jsfiddle.net/hq7b426j/

Eu pude ver o problema agora! Sua adição funciona muito bem @andreialecu

Havia uma outra adição necessária a propósito. No iPhone ou em outros dispositivos sem suporte, o violino não funcionava corretamente. Chosen se desativa no iPhone e deixa <select> inalterado, e o código no violino acima iria ocultá-lo, não deixando nenhuma maneira de interagir com o select.

Este violino corrige isso (adicionando um display: none check):
http://jsfiddle.net/hq7b426j/1/

Ah isso é ainda melhor !! Obrigado! Ainda estou testando também, mas postarei se algo mais surgir

@CaptainN informe que tenho o mesmo problema. wr eu preciso colocar esse código. Estou usando o tema inspina do wrapbootstrap.

@ vidhyaprakash85 Não tenho certeza do que você quer dizer. Eu tinha feito o fork há muito tempo e escrevi uma solicitação pull (# 900), mas os repositórios estão fora de sincronia agora e meu fork está muito desatualizado. Você pode encontrá-lo aqui se ajudar: https://github.com/adcSTUDIO/chosen

já estou usando https://github.com/harvesthq/chosen como fazer isso :(

@andreialecu seu código funciona bem! obrigado!!!

Obrigado @christhomas, seu código funcionou muito bem: dancer:

Nem @christhomas ou @ghiculescu funcionaram para mim usando uma seleção multi-agrupada. deixando para a validação do servidor por enquanto.

Quando experimentei o patch @ghiculescu , funcionou, exceto que um pergaminho era exibido o tempo todo, abaixo da caixa de seleção.
Quando tentei o patch @christhomas, o pop-up apareceu sem a caixa de pesquisa abrir.

Tive que modificar o script de @ghiculescu para poder chamar escolhido duas vezes:

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

Caso contrário, a 2ª viagem removeu o estilo que foi adicionado na primeira:

$.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
}

Acabei de adicionar esta condição extra ao primeiro se: && select.attr('style') != style

@doganmeh Funciona muito bem no Chrome e em dispositivos móveis (com Chrome), mas testado no Firefox 53.0 onde não funciona

Mesmo este http://jsfiddle.net/hq7b426j/1/ não funciona no Firefox 53.0

Hmmm, mas isso parece mais um problema do Firefox porque se você clicar no botão mais vezes, verá que o Firefox tenta exibir a mensagem (mas isso nunca é processado completamente)

Eu usei essa solução. É muito simples e funciona perfeitamente:

<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 isso não funciona se você tiver escolhido com várias seleções:
http://jsfiddle.net/jeromax/o5a8aogh/

Eu consertei isso.

`
$ .fn.oldChosen = $ .fn.chosen
$ .fn.chosen = função (opções) {
var select = $ (this),
is_creating_chosen = !! options;

if (is_creating_chosen && select.css ('position') === 'absoluto') {
// se estivermos criando um escolhido e o select já tiver os estilos apropriados adicionados
// nós os removemos (para que o select não tenha uma largura absurda), então criamos o escolhido
// então nós os adicionamos novamente mais tarde
select.removeAttr ('estilo');
}

var ret = select.oldChosen (opções)

// age apenas se o select tiver display: none, caso contrário, o escolhido não é compatível (iPhone, etc)
if (is_creating_chosen && select.css ('display') === 'none') {
// https://github.com/harvesthq/chosen/issues/515#issuecomment -33214050
// só faça isso se estiver inicializando escolhido (sem parâmetros ou parâmetros de objeto) e não chamando um 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);

}
retornar ret
}
`

+1

Alguém pode consertar isso? É um problema muito antigo e uma funcionalidade muito importante hoje em dia. Obrigada.

Não funciona na versão mais recente.

Isso parece estar quebrando a validação de formulário do angular.js ao usar o angular escolhido também.

É 2018 e ainda estamos tendo o mesmo problema. É um inferno como os padrões HTML não podem funcionar corretamente e integrados com plug-ins externos. Tempos loucos :)

Isso também está quebrando o plugin escolhido do Drupal. Veja https://www.drupal.org/project/chosen/issues/2705891

Não foi possível encontrar uma solução adequada para isso além de uma solução 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;
}

Se estiver usando Escolhido para todos os elementos select , você pode usar este CSS para torná-lo visível (para DOM), mas sem opacidade, sem altura, posição absoluta.

Esses seletores CSS são direcionados a elementos de seleção inválidos, com um deles direcionado a multiple adicionando 15px margin-top para centralizá-lo nos elementos multisseleção.

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

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

Demonstração: http://jsfiddle.net/tripflex/2zdeu9oc/

MAS REALMENTE ... isso já deve ser tratado pela lib Chosen.JS

Esta é minha solução alternativa, se for útil:

// 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 você pode mostrar dentro do contexto? Tentei sua solução e não funcionou.

@AndrewSouthpaw Este é o meu código, as correções funcionam bem para mim :)

$("#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();

Estou usando um código ligeiramente diferente (com base no código aqui):

$('.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;
}

Ele não controla a ação 'destruir', mas posiciona bem a mensagem de erro e parece funcionar no Firefox e no Chromiun. Como o seletor original não está oculto, a borda de destaque do erro fica visível. Atualização : com max-height também funciona no IE. Outra atualização : adicione tabindex -1 para garantir que não receba o foco. (embora ainda seja focalizável e receba mensagens de erro).

Houve um PR aberto que resolve isso, mas acho que ele se perdeu desde que o outro tópico que visava foi fechado. Veja # 2594

@jhedstrom adoraria ver essa fusão. Você sabe se esta biblioteca ainda é mantida?

Usei algo semelhante à solução de

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

Obrigado @jhedstrom por me apontar na direção certa!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

scottdoc picture scottdoc  ·  7Comentários

SFPink picture SFPink  ·  4Comentários

engintekin picture engintekin  ·  8Comentários

mcclurem picture mcclurem  ·  4Comentários

Scalamoosh picture Scalamoosh  ·  8Comentários
bleepcoder.com usa informações licenciadas publicamente pela GitHub para fornecer aos desenvolvedores em todo o mundo soluções para seus problemas. Não somos afiliados à GitHub, Inc. nem a nenhum desenvolvedor que utilize GitHub para seus projetos. Nós não hospedamos nenhum dos vídeos ou imagens em nossos servidores. Todos os direitos pertencem a seus respectivos proprietários.
Fonte para esta página: Fonte

Linguagens de programação populares
Projetos populares do GitHub
Mais projetos 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.