2010-03-16 17 views
9

mam ten przykładowy kod:jquery spust na ostrości lub kliknąć ale nie oba

$myTrigger 
    .click(function(e){ 
     alert('click'); 
    }) 
    .focus(function(e){ 
     alert('focus'); 
     $(this).click() 
    }) 

Chodzi o to, że chcę coś się wydarzy po kliknięciu na $ myTrigger. Jeśli, z drugiej strony, zakładasz na nią za pomocą klawiatury (tzn. Ostrość) Chcę, aby dokładnie to samo się wydarzyło, więc proszę, aby kliknął.

Połów jest po kliknięciu, ustawia ostrość. Tak więc oba ostrzeżenia się wyłączają.

Czy istnieje sposób, aby zapobiec wypadnięciu fokusu po kliknięciu?

UPDATE:

komentarz AJM jest mi do myślenia, że ​​jestem może prosząc źle.

Pytanie: Czy zdarzenie kliknięcia zawsze uruchamia fokus w javascript (i/lub w jQuery?). Czy mogę założyć, że za każdym razem, gdy chcę obsłużyć zarówno kliknięcie myszką, jak i wejście klawiszem na klawiaturze, zdarzenie focus() poradzi sobie z obydwoma?

Czy to zależy od konkretnego elementu, do którego przypisuję zdarzenia? (W tym przypadku $ myObject bywa tag kotwicy (link).

+2

Dlaczego nie po prostu pozbyć się funkcji kliknięcia i zachować ostrość? Jeśli każde kliknięcie jest również skupieniem i chcesz, aby działało zarówno na kliknięcie, jak i na fokusie, używaj tylko fokusa. – Adam

+2

Czy bardziej sensowne byłoby uczynienie z akcji zewnętrznej funkcji, która wywołuje kliknięcie i ostrość? To całkowicie pomijałoby ten problem. >> Zignoruj ​​to na komentarz poniżej. – ajm

+0

@ajm To będzie nadal uruchamiać tę funkcję dwa razy, ponieważ po kliknięciu fokus również się stanie –

Odpowiedz

11

jQuery posiada wbudowany functon na to, że nie jest używany tak często nazywany .one()

$mytrigger.one('click focus', function() { alert("event"); }); 

To spowoduje tylko raz, czy można ponownie wiążą jeśli chcesz później.

+0

Czy to nazywa się "jedno z tych dwóch wydarzeń raz" lub czy nazywa się "każde z tych zdarzeń raz"? Dokumentacja nie mówi. (Oczywiście, mogę wypróbować testament tak szybko, jak tylko mogę ...) –

+0

@DA - Kiedyś w sumie jest prawdopodobnie najdobitniejszym opisem –

+0

Yup. To działa! DZIĘKI! –

0

wpadłem na podobny problem jakiś czas temu. I solved it odpowiadając na pierwszym przypadku, a ignorowanie wydarzeń na najbliższe 20ms .

spróbować czegoś takiego:

$(document).ready(OnReady); 

var okToClick = true; 

function OnReady() { 
    //Attach to both click and focus events 
    $("#item").click(PerformAction).focus(PerformAction); 
} 

function PerformAction() { 
    if (okToClick) { 
     okToClick = false; 

     // Do something interesting here... 

     setTimeout(function() { okToClick = true; }, 20); 
    } 
} 
+2

Nie powiedziałbym, że to takie rozwiązanie, ponieważ jest to brzydkie hakowanie wokół problemu. –

+0

Tak. To włamanie. Nie mogę się kłócić. Ale w moim przypadku było to jedyne rozwiązanie. –

0

można używać tylko ostrość() metody i przeczytać ten artykuł o wydarzeniach (e) typów na javascript: http://www.quirksmode.org/js/events_properties.html

Aby wykryć jakie wydarzenie masz z was myszy lub klawiatury (aby go przetestować), u można użyć:

if (!e) var e = window.event; 
alert(e.type); 
+0

Przypuszczam, że moje pytanie brzmi naprawdę "czy focus ZAWSZE zostaje wywołany w KLIKNIĘCIE?" –

+0

@DA - Tak, ponieważ po kliknięciu na aktywowany element, który się w nim znajduje, również skupia się na tym elemencie. :) –

+0

cóż, zrobiłem test i nie wydaje się, żeby tak było. Nie możesz na przykład dać DIV fokusem skupienia, a następnie go kliknąć i wywołać to zdarzenie. Wygląda na to, że odnosi się to tylko do elementów "możliwych do ustawienia". –

0

Aby zapobiec ostrość od miano dwukrotnie ustawić zmienną stwierdzić, czy element ma ostrości.

var hasFocus = false; 
$('#myTrigger').focusIn(
    function(){ 
     hasFocus = true; 
     //do stuff 
    } 
); 

$('#myTrigger').focusOut(
    function(){ 
     hasFocus = false; 
    } 
); 

umieścić wszystkie funkcje na ostrości i powiedzieć jQuery ustawić foucus na element, gdy zostanie kliknięty jeżeli napotkasz przeglądarki, która nie robi.

$(#myTrigger).click(function(){ if(!hasFocus){$(#myTrigger).focus()}}); 
+0

, który nie zadziała, ponieważ fokus zostanie wywołany dwa razy. –

+0

Dobra uwaga. Musisz ustawić zmienną, aby sprawdzić, czy jest jeszcze skupiona. – Adam

6

Aby wywołać kliknięcie() dla TAB ostrości (i zapobiec click() przed wyzwalane dwukrotnie po ustawieniu ostrości pochodzi z kliknięciem myszy), zrobiłem co następuje:

$('#item').mousedown(function(){ 
    $(this).data("mouseDown", true); 
}); 

$('#item').mouseup(function(){ 
    $(this).removeData("mouseDown"); 
}); 

$('#item').focus(function(){ 
    if (!$(this).data("mouseDown")) 
     $(this).click(); 
}); 

Czy to dobra praca dla Ciebie?

0

Inną opcją jest:

$myTrigger 
    .mousedown(function(e) { 
     e.preventDefault(); // don't grab focus 
    }) 
    .click(function(e) { 
     alert('click'); 
    }) 
    .focus(function(e) { 
     alert('focus'); 
     $(this).click() 
    }); 

Pozostawi ostrość klawiatury gdziekolwiek to było wcześniej po kliknięciu przycisku, umożliwiając jednocześnie przycisk, aby stać koncentruje się poprzez zakładkę (lub programowo wywołanie .focus() na nim).

Powiązane problemy