2009-07-25 9 views
12

Ich versuche, eine externe Funktion beim Klicken auf ein DOM-Element auszuführen, ohne es in eine andere Funktion zu integrieren.Wie kann ich eine externe Funktion ausführen, wenn auf ein Element geklickt wird?

Sagen wir, ich habe eine Funktion sayHello() genannt, wie folgt:

function sayHello(){ 
    alert("hello"); 
}; 

es auf Klick ausführen zu können, muss ich dies derzeit tun:

$("#myelement").click(function(){ 
    sayHello(); 
}); 

Hinweis ich die einzige einzuwickeln bin gezwungen Funktionsaufruf in noch einer anderen Funktion. Was ich versuche zu tun, so etwas wie diese

$("#myelement").click(sayHello()); 

Abgesehen davon, dass einfach nicht funktioniert. Kann ich vermeiden, den einzelnen Funktionsaufruf in irgendeiner anderen Funktion zu verpacken? Danke!

.

Zusätzliche Informationen: Wie würde ich dasselbe erreichen, wenn ich Parameter an die Funktion übergeben muss?

..

Zusätzliche Informationen: Wie Chris Brandsma und Jani Hartikainen wies darauf hin, sollte man in der Lage sein, die bind-Funktion verwenden Parameter an die Funktion übergeben, ohne sie in eine andere anonyme Funktion als solche Verpackung:

$("#myelement").bind("click", "john", sayHello); 

mit sayHello() nun einen neuen Parameter, die als solche zu akzeptieren:

function sayHello(name){ 
    alert("Hello, "+name); 
} 

Das scheint leider nicht zu funktionieren ... Irgendwelche Ideen? Die Dokumentation zu Events/bind befindet sich here Vielen Dank!

+0

Was ist Ihr Rindfleisch mit Verpackungsfunktionen? Es ist kein Performance-Hit (naja, Nanosekunden vielleicht). Es ist ein wenig wortreich, aber ich finde es nützlich, dies zu tun und alles konsistent zu halten. Die zweite, die Sie einen Parameter hinzufügen oder mehr als eine Funktion aufrufen müssen Sie die Wrapper zurück in hinzufügen ... – DisgruntledGoat

+1

Ich denke, ich will es nur schön in einer Zeile haben, und ich bin OCD so ... :) –

Antwort

19

Um von einer Frage aufzuheben, die Sie dort hatten.

Natürlich müssen Sie es auf diese Weise rufen arbeiten:

$("#myelement").click(sayHello); 

es die Art und Weise aufrufen Sie es das Verfahren tatsächlich hatte ausführt, anstatt die Methode, um die Click-Handler sendet.

Wenn Sie Daten benötigen Sie auch die Methode so nennen kann passieren:

$("#myelement").click(function(){ sayHello("tom");}); 

Oder Sie können Daten gelangen über die bind() Funktion aus dem Elementdaten abrufen

function sayHello(event){ alert("Hello, "+event.data); } 

$("#myelement").bind("click", "tom", sayHello); 

Oder Sie können das wurde geklickt

$("#myelement").click(function(){sayHello($(this).attr("hasData");});. 

Hoffnung, die hilft.

+0

Es folgt aus der "Events/bind" -Dokumentation auf der jQuery-Website, dass dieses $ ("# myelement") bind ("click", "tom", sayHello); sollte eigentlich tun, was ich suche ... nach dem Versuch es, aber es scheint nicht zu funktionieren. Ich werde einige zusätzliche Informationen in der ursprünglichen Frage in einer zweiten –

+0

eingereichten zusätzlichen Informationen posten! –

+1

@yuval: Lesen Sie die Dokumente sorgfältiger!Der im Parameter 'data' an' bind() 'übergebene Wert wird über' event.data' an Ihren Handler übergeben. Sie müssen den ersten Parameter Ihrer Funktion als 'event'-Objekt interpretieren und die 'data betrachten 'Eigentum! – Shog9

8

Sie rufen die sayHello-Funktion, können Sie es als Verweis übergeben, indem Sie die Klammer zu entfernen:

$("#myelement").click(sayHello); 

Edit: Wenn Sie Parameter an die sayHello-Funktion übergeben müssen, müssen Sie wickle es in eine andere Funktion. Dies definiert eine parameterlose neue Funktion, die Ihre Funktion mit den Parametern bei der Erstellung Zeit zur Verfügung gestellt nennt.

$("#myelement").click(function() { 
    sayHello('name'); 
    // Creates an anonymous function that is called when #myelement is clicked. 
    // The anonymous function invokes the sayHello-function 
}); 
+0

das funktioniert tatsächlich, aber was mache ich in einer Situation, wo ich Parameter an die Funktion übergeben? also $ ("# myelement"). click (sayHello ("john")); ? danke! –

+1

In diesem Fall sind Sie gezwungen, es zu wickeln. Alternativ bieten einige Bibliotheken wie Prototype eine bind() -Methode, die etwas wie sayHello.bind (this, param1, param2) funktioniert. Es tut genau dasselbe wie es aber wickelt. –

+0

hey jani, es scheint so, als sollte dies auch mit der jQuery-Bind-Funktion funktionieren, tut es aber nicht. Bitte beachten Sie die zusätzlichen Informationen zu der Frage. Vielen Dank! –

4

$ („# myElement“) klicken (sayHello());

Das ruft eigentlich sayHello() bevor Sie den click Handler festlegen. Es versucht den Rückgabewert sayHello() als Callback-Funktion zu setzen!

Stattdessen versuchen:

$("#myelement").click(sayHello); 

Und deine Bearbeitung in Bezug auf, wenn Sie Parameter übergeben müssen Sie nur noch die Verschlusstechnik Sie bereits verwenden können, aber wenn Sie nach etwas sauberer dann Scheck suchen aus How can I pass a reference to a function, with parameters?

0

Ja, übergeben Sie sayHello() einfach den Funktionsnamen.

$("#myelement").click(sayHello); 
1

Welche Parameter würden Sie zum Zeitpunkt des Klicks weitergeben? Wenn Sie im Voraus wissen, was sie sind, können Sie sie festlegen, bevor der Benutzer klickt.

Sie können keine Parameter übergeben, aber Sie können durch einfaches Hinzufügen von Mitgliedern zu dem Objekt der Parameter Sache fälschen, die das Ereignis feuert, so ..

myObject.onClick = sayHello; 
myObject.param1 = "foo"; 

dann, wenn Sie dieses

Aufruf sind
function sayHello(){ 
    alert(this.param1); 
} 
+0

Keine direkte Antwort auf die Frage (da er jQuery verwendet), aber upvoted, weil es trotzdem ein großartiger Javascript-Tipp ist. – DisgruntledGoat

+0

interessante Idee, aber nicht ganz das, was ich suche ... –

+0

IMHO, das ist viel weniger sauber als eine einfache Schließung ... im besten Fall haben Sie die zusätzliche Arbeit der Expando Eigenschaften auf dem DOM-Objekt und im schlimmsten Fall Sie könnten möglicherweise dazu neigen, Kollisionen mit eingebauten Eigenschaften zu benennen! – Shog9

Verwandte Themen