Załóżmy, że zdefiniowałem moduł obsługi kliknięć:
$("#foo").click(function(e){
});
W jaki sposób w ramach procedury obsługi funkcji mogę stwierdzić, czy zdarzenie zostało uruchomione programowo, czy przez użytkownika?
Załóżmy, że zdefiniowałem moduł obsługi kliknięć:
$("#foo").click(function(e){
});
W jaki sposób w ramach procedury obsługi funkcji mogę stwierdzić, czy zdarzenie zostało uruchomione programowo, czy przez użytkownika?
$x.click()lub $x.trigger('click').
Odpowiedzi:
Możesz rzucić okiem na obiekt zdarzenia e. Jeśli zdarzenie zostało wywołane przez prawdziwego kliknięcia, trzeba takie rzeczy jak clientX, clientY, pageX, pageY, itd. Wewnątrz ei oni będą numery; liczby te są związane z pozycją myszy w momencie uruchomienia kliknięcia, ale prawdopodobnie będą obecne, nawet jeśli kliknięcie zostało zainicjowane z klawiatury. Jeśli zdarzenie zostało wywołane przez $x.click(), nie będziesz mieć zwykłych wartości pozycji w e. Możesz też spojrzeć na originalEventnieruchomość , której nie powinno tam być, gdyby wydarzenie pochodziło $x.click().
Może coś takiego:
$("#foo").click(function(e){
if(e.hasOwnProperty('originalEvent'))
// Probably a real click.
else
// Probably a fake click.
});
A oto mała piaskownica do zabawy: http://jsfiddle.net/UtzND/
originalEvent? Czy to właściwa rzecz? Czy są gdzieś współrzędne? Czy współrzędne są zgodne? Czy współrzędne są w środku #foo? ...
Możesz użyć dodatkowego parametru zgodnie z instrukcją wyzwalacza jQuery :
$("#foo").click(function(e, from){
if (from == null)
from = 'User';
// rest of your code
});
$('#foo').trigger('click', ['Trigger']);
$x.click(), a .click()dzwoniący musi wyraźnie powiedzieć, że udaje. Może to stanowić problem, ale nie musi, w zależności od tego, co robi Kevin Owocki.
$x.click()który jest eventHandler (dla kliknięcia użytkownika, które może być „normalne”)
Istnieje już odpowiedź na inne pytanie.
Jak wykryć, czy kliknięcie () jest kliknięciem myszy lub wywołane przez jakiś kod?
Użyj whichwłaściwości obiektu zdarzenia. Powinien dotyczyć undefinedzdarzeń wyzwalanych przez kod
$("#someElem").click(function(e) {
if (e.which) {
// Actually clicked
} else {
// Triggered by code
}
});
Przykład JsFiddle - http://jsfiddle.net/interdream/frw8j/
Mam nadzieję, że to pomoże!
selectDałoby nagrodę e.which==undefinedza prawdziwe wydarzenie.
Wypróbowałem wszystkie powyższe rozwiązania, w moim przypadku nic nie działa. Poniższe rozwiązanie zadziałało dla mnie. Mam nadzieję, że ci również pomoże.
$(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 Level 3 określa event.isTrusted. Jest to obecnie obsługiwane tylko w IE9 + i Firefoksie (na podstawie moich testów. Przeczytałem również (choć nie dogłębnie zbadane), że można to zmienić w niektórych przeglądarkach i prawdopodobnie nie jest jeszcze w 100% gotowy, aby faktycznie zaufać (niestety).
To jest zmodyfikowana wersja skrzypiec @ mu, która działa w przeglądarkach IE i Firefox.
isTrustedjest obsługiwany i nie można go zapisać. Myślę, że prawdziwa odpowiedź zależy od przyczyny tego pytania i nigdy nie dowiedzieliśmy się, dlaczego.
Nie zamierzam brać udziału w intelektualnej dyskusji, kod, który pracował dla mnie, filtrując .click()i .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
}
});