2011-07-13 12 views

Odpowiedz

40

można wykorzystywać dodatkowy parametr jak stwierdzono w jQuery trigger manual:

$("#foo").click(function(e, from){ 
    if (from == null) 
     from = 'User'; 
    // rest of your code 
}); 

$('#foo').trigger('click', ['Trigger']); 
+3

Jedyny problem, jaki widzę z tym, to że nie można odróżnić zwykłego kliknięcia od '$ x.click()', wywołujący '.click()' musi jednoznacznie powiedzieć, że fałszuje. To może lub nie być problemem w zależności od tego, co knuje Kevin Owocki. –

+1

@mu: Nie rozumiem twojej różnicy między "normalnym" kliknięciem (użytkownik?) I '$ x.click()', który jest eventHandler (dla kliknięcia użytkownika, które może być "normalne") – Shikiryu

+1

Różnica polega na tym, że jeden pochodzi od użytkownika, a drugi od oprogramowania. Fałszywe kliknięcie może pochodzić z wtyczki lub innego kodu, którego nie można zmodyfikować, aby dodać dodatkowe argumenty. Nie krytykuję twojego rozwiązania, tylko zauważam kilka możliwych dziur. –

103

Można spojrzeć obiektu zdarzenia e. Jeśli zdarzenie zostało wywołane przez prawdziwe kliknięcie, będziesz miał takie rzeczy jak clientX, clientY, pageX, pageY itp. Wewnątrz e i będą to liczby; Liczby te są związane z pozycją myszy po uruchomieniu kliknięcia, ale prawdopodobnie będą obecne, nawet jeśli kliknięcie zostało zainicjowane za pomocą klawiatury. Jeśli zdarzenie zostało wywołane przez $x.click(), nie będziesz miał normalnych wartości pozycji w e. Możesz również spojrzeć na numer originalEvent property, którego nie powinno tam być, jeśli wydarzenie pochodzi z $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 trochę piaskownica do zabawy: http://jsfiddle.net/UtzND/

+2

To niesamowite ... Pomyślałem, że "może zdarzenia wywołane przez jQuery nie mają informacji o pozycji myszy"! w00t! – Kasapo

+2

Można to pokonać w przeglądarkach obsługujących createEvent. http://jsfiddle.net/UtzND/26 –

+1

@JoeEnzminger tak, ale dlaczego miałbyś pokonać swój własny scenariusz, by tak rzec ...? – OZZIE

4

DOM Level 3 określa event.isTrusted. Jest to obecnie obsługiwane tylko w IE9 + i Firefox (w oparciu o moje testy.) Czytałem również (choć nie do końca zbadane), że można je przesłonić w niektórych przeglądarkach i prawdopodobnie nie jest jeszcze w 100% gotowe, by można było zaufać (niestety).

This to zmodyfikowana wersja skrzypce @ MU, który działa na IE i Firefox.

+0

Dobra uwaga. Nie sądzę jednak, żeby cokolwiek miało być w 100% solidne. Musiałbyś mieszać niektóre testy, aby sprawdzić, czy 'isTrusted' jest obsługiwany i nie można go zapisać. Myślę, że prawdziwa odpowiedź zależy od * dlaczego * kryjącej się za tym pytaniem i nigdy nie dowiedzieliśmy się, dlaczego. –

+0

@mu, doszedłem do tego pytania po zadaniu podobnego, ale bardziej ogólnego. W moim przypadku "dlaczego" chcę mieć pewność, że wykonuję tylko działanie (transakcja finansowa, chociaż niewielka), jeśli użytkownik podjął bezpośrednie działanie afirmatywne na stronie. –

9

jest jeszcze inna kwestia już odpowiedział.

How to detect if a click() is a mouse click or triggered by some code?

użyć właściwości obiektu zdarzenia which. to powinien być undefined Dla kodu wyzwalany wydarzeń

$("#someElem").click(function(e) { 
    if (e.which) { 
     // Actually clicked 
    } else { 
     // Triggered by code 
    } 
}); 

JsFiddle przykład - http://jsfiddle.net/interdream/frw8j/

Nadzieję, że to pomaga!

+2

Nie zawsze działa. Na przykład. 'select' dałoby' e.which == undefined' nawet dla prawdziwego zdarzenia. – JNF

-1

nie zamierza uczestniczyć w dyskusji intelektualnej, kod, który pracował dla mnie, aby filtrować .click() i .trigger('click') IS-

$(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 
    } 
}); 
Powiązane problemy