2010-03-16 6 views
9

Ich habe diesen Code Beispiel:jquery Trigger-Aktion auf Fokus oder klicken, aber nicht beide

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

Die Absicht ist, dass ich etwas geschehen soll, wenn Sie auf $ MyTrigger klicken. Wenn Sie dagegen über die Tastatur darauf zugreifen (zB Fokus), möchte ich, dass genau das Gleiche passiert, also bitte ich um einen Klick.

Der Haken ist, wenn ich darauf klicke, es konzentriert sich auch. Also gehen beide Warnungen aus.

Gibt es eine Möglichkeit zu verhindern, dass das Fokusereignis beim Klicken aufhört?

UPDATE:

Ajm Kommentar bekam dachte mir, dass ich vielleicht bin die falsche Sache zu fragen.

Frage: Wird in javascript (und/oder in jQuery?) Immer auch ein Klick-Ereignis ausgelöst? Kann ich davon ausgehen, dass sowohl das Klicken mit der Maus als auch das Einfädeln mit der Tastatur das Ereignis focus() sowohl behandeln als auch verarbeiten kann?

Oder hängt es von dem bestimmten Element ab, an das ich die Ereignisse anschließe? (In diesem Fall $ myObject geschieht ein Anker-Tag (Link) sein.

+2

Warum nicht einfach die Klickfunktion loswerden und nur den Fokus behalten? Wenn jeder Klick ebenfalls fokussiert ist und Sie möchten, dass er sowohl mit Klicken als auch mit Fokus arbeitet, verwenden Sie nur den Fokus. – Adam

+2

Wäre es sinnvoller, die Aktion zu einer externen Funktion zu machen, die sowohl auf den Klick als auch auf den Fokus ruft? Das würde dieses Problem irgendwie überspringen. >> Ignoriere dies anhand des Kommentars unten. – ajm

+0

@ajm Es wird immer noch diese Funktion zweimal ausführen, denn wenn Sie auf den Fokus klicken passiert auch –

Antwort

11

jQuery verfügt über eine integrierte in functon dafür, dass alles, was oft .one()

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

Diese nur einmal aufgerufen nicht verwendet wird auslösen, oder Sie können neu binden, wenn Sie danach wollen.

+0

Ruft dies eines dieser beiden Ereignisse einmal auf oder ruft es jedes dieser Ereignisse einmal auf? Die Dokumentation sagt nicht. (Natürlich kann ich es ausprobieren, sobald ich kann ...) –

+0

@DA - Einmal insgesamt ist wahrscheinlich die klarste Beschreibung –

+0

Yup. Es klappt! VIELEN DANK! –

0

ich in ein ähnliches Problem lief. Eine Weile zurück, ich solved it durch mit dem ersten Ereignis reagieren, und ignoriert Ereignisse für die nächsten 20 ms . wie diese

versuchen, etwas:

$(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

Ich würde nicht sagen, dass es so eine Lösung ist, wie es ein hässlicher Hack um das Problem ist. –

+0

Ja. Es ist ein Hack. Kann da nicht streiten. Aber in meinem Fall war es die * einzige * Lösung. –

0

Sie können nur die focus() Methode verwenden und diesen Artikel über Ereignisse (e) Typen auf JavaScript lesen: http://www.quirksmode.org/js/events_properties.html

Um festzustellen, welches Ereignis Sie mit Ihnen Maus oder Tastatur bekam (um es zu testen), kann u verwenden:

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

Ich nehme an, meine Frage ist wirklich "wird Fokus immer auf KLICK aufgerufen?" –

+0

@DA - Ja, denn wenn du auf das Element klickst, das du aktivierst, ist es auch fokussiert, weil du dich auf dieses Element konzentrierst. :) –

+0

Nun, ich habe einen Test gemacht und das scheint nicht der Fall zu sein. Sie können einem DIV beispielsweise kein Fokusereignis geben und dann darauf klicken und das Ereignis auslösen lassen. Es scheint, dass dies nur für "fokussierbare" Elemente gilt. –

0

Um zu verhindern, den Fokus von einer Variable zweimal eingestellt aufgerufen wird zu sagen, ob das Element Fokus hat.

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

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

alle Funktionen auf Fokus Setzen und sagen jQuery die foucus auf dem Element zu setzen, wenn es angeklickt wird, wenn Sie in einem Browser ausgeführt werden, die das nicht tut.

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

das wird nicht funktionieren, da der Fokus dann zweimal aufgerufen würde. –

+0

Guter Punkt. Du musst eine Variable setzen, um zu sehen, ob sie schon fokussiert ist. – Adam

6

auszulösen click() für TAB Fokus (und verhindern, klicken() von zweimal ausgelöst wird, wenn der Fokus von einem Mausklick kommt), ich habe folgendes:

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

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

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

funktioniert das gut für Sie?

0

Eine weitere Option ist:

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

Dies wird die Tastaturfokus verlassen, wo es vorher war, wenn die Schaltfläche klicken, während immer noch die Taste ermöglicht via Tab fokussiert werden (oder programmatisch .focus() darauf Aufruf).