Quando vinculo uma função a um elemento de caixa de seleção como:
$("#myCheckbox").click( function() {
alert($(this).is(":checked"));
});
A caixa de seleção muda seu atributo marcado antes que o evento seja disparado, este é o comportamento normal e fornece um resultado inverso.
No entanto, quando eu faço:
$("#myCheckbox").click();
A caixa de seleção altera o atributo marcado após o evento ser acionado.
Minha pergunta é: há uma maneira de acionar o evento de clique do jQuery como um clique normal faria (primeiro cenário)?
PS: Já tentei com trigger('click')
;
Respostas:
Nota: Em versões mais antigas do jquery, era normal usar
attr
. Agora é sugerido usarprop
para ler o estado.fonte
Existe uma solução alternativa que funciona no jQuery 1.3.2 e 1.4.2 :
Mas eu concordo, esse comportamento parece bugado em comparação com o evento nativo.
fonte
Em junho de 2016 (usando jquery 2.1.4) nenhuma das outras soluções sugeridas funcionou. Verificar
attr('checked')
sempre retornaundefined
eis('checked)
sempre retornafalse
.Basta usar o método prop:
fonte
is('checked)
retornará falso porque "verificado" não é um pseudo seletor CSS. O correto deve ser deis(':checked')
forma que procure ": verificado".Ainda estou tendo esse comportamento com o jQuery 1.7.2. Uma solução alternativa simples é adiar a execução do manipulador de cliques com setTimeout e deixar o navegador fazer sua mágica enquanto isso:
fonte
.click()
, definir.attr('value', 'true')
, então.change()
,.blur()
antes de definir programaticamente a caixa quando cliquei no botão "Atualizar" programaticamente ...Se você antecipar esse comportamento bastante indesejado, uma alternativa seria passar um parâmetro extra de jQuery.trigger () para o manipulador de cliques da caixa de seleção. Este parâmetro extra é para notificar o manipulador de cliques que o clique foi disparado programaticamente, em vez de o usuário clicar diretamente na própria caixa de seleção. O manipulador de cliques da caixa de seleção pode então inverter o status de verificação relatado.
Então, aqui está como eu acionaria o evento de clique em uma caixa de seleção com o ID "myCheckBox". Observe que também estou passando um parâmetro de objeto com um único membro, nonUI, que está definido como verdadeiro:
E é assim que eu lido com isso no manipulador de eventos de clique da caixa de seleção. A função de manipulador verifica a presença do objeto não-UI como seu segundo parâmetro. (O primeiro parâmetro é sempre o próprio evento.) Se o parâmetro estiver presente e definido como verdadeiro, eu inverto o status .checked relatado. Se esse parâmetro não for passado - o que não acontecerá se o usuário simplesmente clicar na caixa de seleção na IU - eu relato o status real .checked:
Versão JSFiddle em http://jsfiddle.net/BrownieBoy/h5mDZ/
Eu testei com Chrome, Firefox e IE 8.
fonte
fonte
fonte
JSFIDDLE
fonte
Bem, para combinar com o primeiro cenário, isso é algo que eu inventei.
http://jsbin.com/uwupa/edit
Essencialmente, em vez de vincular o evento "click", você vincula o evento "change" ao alerta.
Então, quando você dispara o evento, primeiro você dispara o clique e, a seguir, a mudança.
fonte
Além da resposta de Nick Craver, para que isso funcione corretamente,
IE 8
você precisa adicionar um manipulador de cliques adicional à caixa de seleção:Caso contrário, o callback só será acionado quando a caixa de seleção perder o foco, pois
IE 8
mantém o foco nas caixas de seleção e rádios quando clicados.Ainda não testei
IE 9
.fonte
fonte
change
vez dos OPsclick
, e apenas usa umaif
instrução como uma forma diferente de teste:checked
.Maneira mais rápida e fácil :
$ el - é o elemento jquery de seleção.
Aproveitar!
fonte
fonte