No exemplo a seguir, quando você clica no rótulo, a entrada muda de estado.
document.querySelector("label").addEventListener("click", function() {
console.log("clicked label");
});
label {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
<input type="checkbox" id="1">
<label for="1">Label</label>
No Chrome, quando você move o cursor entre os eventos mousedown
e mouseup
, a entrada ainda é acionada, enquanto no Firefox a caixa de seleção não muda de estado.
Existe uma maneira de corrigir isso? (sem usar ouvintes de evento JavaScript)
Versão do Firefox: 69.0.3 (64-bit)
Conjunto completo de ações ao usar o chrome.
- Pressione o botão sobre a etiqueta
- Mova o cursor (mesmo fora do rótulo) enquanto mantém pressionado o botão
- Retorne o cursor de volta ao rótulo
- Solte o botão
javascript
html
css
label
nick zoum
fonte
fonte
1px
interromperá a interação.Respostas:
Introdução
Embora eu tenha declarado especificamente na pergunta que a resposta não deve envolver JavaScript, todas as respostas funcionaram com JavaScript.
Como isso parece ser um bug do Firefox e a maioria das respostas enviadas neste momento exigiria que eu também alterasse o restante do meu código, decidi criar um script que possa ser executado uma vez, que lidará com todos os rótulos, independentemente de quando eles são adicionados ao domínio e terão o menor impacto nos meus outros scripts.
Solução - Exemplo
Explicação
onLabelClick
A função
onLabelClick
precisa ser chamada sempre que um rótulo é clicado e verificará se o rótulo possui um elemento de entrada correspondente. Caso issofor
aconteça , ele será acionado, remova o atributo do rótulo para que os navegadores não possuam o bug e não o ative novamente. Em seguida, use umsetTimeout
dos0ms
para adicionar ofor
atributo novamente assim que o evento ocorrer. Isso significaevent.preventDefault
que não precisa ser chamado e, portanto, nenhuma outra ação / evento será cancelada. Além disso, se eu precisar substituir essa função, basta adicionar um ouvinte de evento que chameEvent#preventDefault
ou remova ofor
atributo.manageLabel
A função
manageLabel
aceita um rótulo verifica se já foi adicionado um ouvinte de evento para evitar adicioná-lo novamente, adiciona o ouvinte se ainda não tiver sido adicionado e adiciona-o à lista de rótulos que foram gerenciados.onLoad
A função
onLoad
precisa ser chamada quando a página é carregada, para que a funçãomanageLabel
possa ser chamada para todos os rótulos no DOM naquele momento. A função também usa um MutationObserver para capturar todos os rótulos adicionados depois que a carga foi acionada (e o script foi executado).O código exibido acima foi otimizado por Martin Barker .
fonte
HTMLLabelElement
cheque em vez de tanto um HTMLElement e um cheque que o tagName era uma etiquetaEu sei que você não queria ouvintes do JS Event, mas estou pensando que você pretende identificar o movimento que isso não acontece, mas que está usando a redução de mousedown em vez de clique (mousedown seguido de mouseup).
Embora este seja um bug conhecido no Firefox, você pode contorná-lo usando o evento mousedown
Eu tive que mudar seu ID para ser um ID válido deve começar com um personagem
fonte
querySelectorAll
) no carregamento da página e, toda vez que um rótulo for adicionado ao dom. Isso também pode atrapalhar qualquer ouvinte de evento do mouse adicionado aos marcadores ou ao dom em geral, conforme você usaEvent#preventDefault
para evitar um clique duplo em navegadores que não possuem esse bug. Por fim, usar oclick
evento seria melhor, pois teria a mesma interação que a ação pretendida. Fora isso, esta é a melhor resposta até agora.preventDefault()
problema, para que ele funcione, verificando se o navegador o alterou, se não o for, após 150 ms, rápido o suficiente para o usuário não perceber, e lento o suficiente para que o navegador atue intime se vai fazer o que deveria. isto é melhor?Não. Isso parece um bug do Firefox e não um problema com o seu código. Não acredito que haja uma solução alternativa de CSS para esse comportamento.
Você pode denunciá-lo à Mozilla e corrigir o problema, mas eu não confiaria nisso. https://bugzilla.mozilla.org/home
Para uma solução potencial, sugiro acionar o evento durante a ativação.
fonte
Sem javascript, quando você clica no rótulo com o valor "for" igual ao valor "id" das entradas, a entrada é clicada, mas isso não é consistente entre os navegadores.
Se um navegador seguir o exemplo acima, o evento click em javascript cancelará o efeito, o que acaba sem fazer nada.
Uma solução
Para ter consistência entre os navegadores, você pode adotar uma estratégia diferente: Onload altere dinamicamente todo o atributo 'for' para 'data-for', para anular o efeito do navegador original. Em seguida, você pode aplicar seu evento de clique a cada marcador.
fonte
document.attachEvent("onreadystatechange",
Estou apenas integrado como é que você foi com isso e nãodocument.addEventListener("DOMContentLoaded",
?Anexar o evento ao documento e direcionar o elemento necessário para lá deve classificar esse problema.
$ (Document) .on ('clique', '.item', function (evento) {});
Ao ler este tópico no passado, cabe ao Firefox entender sua ação como uma tentativa de arrastar o elemento, no entanto, como a seleção do usuário não é nenhuma, apenas impede o comportamento padrão.
Isso se baseia em um conhecimento bastante limitado, mas parece ser um bug / peculiaridade conhecido e existem alguns artigos por aí apoiando isso.
fonte
without using JavaScript event listeners
.