2010-12-01 9 views
3

Ich habe ein Problem, das mich verrückt macht und als letzten Ausweg stelle ich hier eine Frage.Move Event Handler mit jQuery

Ich möchte das Onclick-Ereignis von einem Element zum onfocus-Ereignis des gleichen Elements bewegen, und ich bin mit dem folgenden Code:

$("#theElement").bind("focus", {}, $("#theElement").data("events").click); 
$("#theElement").unbind("click"); 

Vielleicht liegt es Sie erraten haben. ES FUNKTIONIERT NICHT.

Wie mache ich das? Ich erhalte eine „fn.apply ist keine Funktion“ Nachricht in dem folgenden Stück Code von jquery 1.3.2:

proxy: function(fn, proxy){ 
     proxy = proxy || function(){ return fn.apply(this, arguments); }; 
     // Set the guid of unique handler to the same of original handler, so it can be removed 
     proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++; 
     // So proxy can be declared as an argument 
     return proxy; 
    } 

EDIT: Es tut mir leid, sollte ich erwähnt habe. Dies kommt von einem Plugin, das beim Klicken auf ein Element einige Dinge tut. Ich möchte das gleiche machen, wenn das Element nicht fokussiert wird, wenn es geklickt wird, also war die einfachste Lösung, an die ich dachte, die, weil ich den Code für das Plugin nicht ändern kann.

EDIT: Das Problem gefunden. Es ist ähnlich zu dem, was @ sje397 in seiner Antwort geschrieben, nicht

$('#theElement').data('events').click[0] 

aber

$('#theElement').data('events').click[3] 

Aus irgendeinem Grund, wenn auch nur ein Ereignis, das Ding endet als 3 registriert ist (die GUID, dass Stück Code von jquery).

+0

Es funktioniert nicht, weil '.click()' ist eine Funktion, wird * bind * ein Ereignis zu einem Element. Es ist nicht der Event-Handler selbst. Jetzt überprüfe ich, was Sie tun können, um den Event-Handler aufzurufen;) – Harmen

+0

mögliches Duplikat von [jQuery: Event-Handler entbinden, um sie später wieder zu binden] (http://stackoverflow.com/questions/516265/jquery-unbind- Event-Handler-zu-binden-sie-wieder-später) – sje397

Antwort

4

Ich würde vorschlagen, den Event-Handler in erster Linie, wie

$('#theElement').click(function myHandler() { 
    //... 
}); 

Dann Benennen Sie

$("#theElement").bind("focus", {}, myHandler); 
$("#theElement").unbind("click"); 

tun können Dies sollte es auch besser lesbar machen, als den Fehler beheben.

Wenn Sie nicht können, dann können Sie tun:

// assuming yours is the first handler 
var myHandler = $('#theElement').data('events').click[0]; 

$("#theElement").bind("focus", {}, myHandler); 
$("#theElement").unbind("click"); 

auch nicht, dass in jQuery 1.4.3+, wurde der Schlüssel zum __events__ geändert. Siehe this answer.

+0

Ich kann das nicht tun. Dies kommt von einem Plugin, das beim Klicken auf ein Element einige Dinge tut. Ich möchte dasselbe machen, wenn das Element nicht fokussiert wird, wenn es angeklickt wird, also war die einfachste Lösung, die ich mir ausgedacht habe, diese. Ich bin bereit, jeden anderen Weg zu akzeptieren. Danke für deine Antwort. – user9238833

+0

@ user9238833: Ich habe eine doppelte Frage gefunden. Siehe Link in Kommentaren. – sje397

+0

ist es möglich, einen spezifischen Handler zu lösen(), falls es mehr als einen gibt? – Matt

1

Ich fand heraus, dass jQuery das Ereignis zu einem Element hinzufügt .data() durch die Verwendung so könnte man so etwas wie dies tun, um die Event-Handler abzurufen:

$(el).data().events.click[0].handler 

Dies ist keine elegante Lösung, aber wenn Sie nicht können Ändern Sie alles in den Click-Handler selbst, dies wäre die einzige Lösung.

+0

Ich wusste das nicht - gut zu wissen – calumbrodie

1

Ich bin nicht 100% klar, was es genau ist, dass Sie tun möchten. Möchten Sie einen Fokus und ein Klickereignis an dasselbe Element binden?

$("#theElement").bind("focus click", function(){ 
    //do stuff 
    $(this).unbind('focus click'); 
}); 

bearbeiten: Ihre Klarstellung gegeben - Sie wollen das ‚Klick‘ Ereignis auf Fokus zu fälschen ...

$("#theElement").bind("focus", function(){ 
    $(this).trigger('click'); 
}); 

http://api.jquery.com/trigger/

+0

Das ist nicht was er will. Das OP möchte das Klickereignis durch ein Fokusereignis ersetzen. By the way, brauchen Sie nicht das Komma, um die Ereignisse zu trennen – Harmen

+0

@calumbrodie: Bitte beachten Sie die Bearbeitung meiner Frage – user9238833

+0

@Harmen, behoben Syntaxfehler – calumbrodie