Digamos que eu tenha um gerenciador de cliques definido:
$("#foo").click(function(e){
});
Como posso, no manipulador de função, saber se o evento foi disparado programaticamente ou pelo usuário?
$x.click()
ou $x.trigger('click')
.
Digamos que eu tenha um gerenciador de cliques definido:
$("#foo").click(function(e){
});
Como posso, no manipulador de função, saber se o evento foi disparado programaticamente ou pelo usuário?
$x.click()
ou $x.trigger('click')
.
Respostas:
Você pode dar uma olhada no objeto de evento e
. Se o evento foi disparado por um clique real, você vai ter coisas como clientX
, clientY
, pageX
, pageY
, etc. dentro e
e eles vão ser números; esses números estão relacionados à posição do mouse quando o clique é acionado, mas provavelmente estarão presentes mesmo que o clique tenha sido iniciado pelo teclado. Se o evento foi disparado por $x.click()
, você não terá os valores de posição usuais em e
. Você também pode olhar para a originalEvent
propriedade , que não deveria estar lá se o evento viesse $x.click()
.
Talvez algo assim:
$("#foo").click(function(e){
if(e.hasOwnProperty('originalEvent'))
// Probably a real click.
else
// Probably a fake click.
});
E aqui está um pequeno sandbox para brincar: http://jsfiddle.net/UtzND/
originalEvent
? É o tipo de coisa certo? Existem coordenadas em algum lugar? As coordenadas são consistentes? As coordenadas estão dentro #foo
? ...
Você pode usar um parâmetro extra conforme declarado no manual do gatilho jQuery :
$("#foo").click(function(e, from){
if (from == null)
from = 'User';
// rest of your code
});
$('#foo').trigger('click', ['Trigger']);
$x.click()
, o .click()
chamador tem que dizer explicitamente que ele está fingindo. Isso pode ou não ser um problema, dependendo do que Kevin Owocki está fazendo.
$x.click()
que é o eventHandler (para clique do usuário, que pode ser "normal")
Já há outra pergunta respondida.
Como detectar se um click () é um clique do mouse ou disparado por algum código?
Use a which
propriedade do objeto de evento. Deve ser undefined
para eventos acionados por código
$("#someElem").click(function(e) {
if (e.which) {
// Actually clicked
} else {
// Triggered by code
}
});
Exemplo de JsFiddle - http://jsfiddle.net/interdream/frw8j/
Espero que ajude!
select
, daria um e.which==undefined
par para um evento genuíno.
Tentei todas as soluções acima. Nada funcionou no meu caso. A solução abaixo funcionou para mim. Espero que ajude você também.
$(document).ready(function(){
//calling click event programmatically
$("#chk1").trigger("click");
});
$(document).on('click','input[type=checkbox]',function(e) {
if(e.originalEvent.isTrusted==true){
alert("human click");
}
else{
alert("programmatically click");
}
});
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js">
</script>
<input type="checkbox" id="chk1" name="chk1" >Chk1</input>
<input type="checkbox" id="chk2" name="chk2" >Chk2</input>
<input type="checkbox" id="chk3" name="chk3" >Chk3</input>
DOM Nível 3 especifica event.isTrusted. No momento, isso só é compatível com o IE9 + e o Firefox (com base em meus testes. Também li (embora não tenha pesquisado exaustivamente) que pode ser substituído em alguns navegadores e provavelmente ainda não está 100% pronto para ser realmente confiável (infelizmente).
Esta é uma versão modificada do violino de @ mu que funciona no IE e no Firefox.
isTrusted
é compatível e não gravável. Acho que a verdadeira resposta depende do porquê dessa pergunta e nunca descobrimos o porquê.
Não vai participar na discussão intelectual, o código que funcionou para mim para filtrar .click()
e .trigger('click')
é-
$(document).on('click touchstart', '#my_target', function(e) {
if (e.pageX && e.pageY) { // To check if it is not triggered by .click() or .trigger('click')
//Then code goes here
}
});