63 Stimmen

jQuery-Funktion zu bestimmten Elementen hinzufügen

Ich weiß, dass Sie neue jQuery-Funktionen hinzufügen können, indem Sie $.fn.someFunction = function()

Ich möchte jedoch nur zu bestimmten Elementen Funktionen hinzufügen. Ich habe diese Syntax ausprobiert, aber sie funktioniert nicht $('.someElements').fn.someFunction = function()

Ich möchte dies tun, damit ich die Funktion irgendwo im Code wie folgt aufrufen kann $('someElements').someFunction();

0 Stimmen

Ich bin mir nicht sicher, ob dies überhaupt möglich ist, aber wenn es so wäre, warum sollten Sie Ihren Code verkrüppeln wollen? Wenn Sie es auf bestimmte Selektoren beschränken wollen, verwenden Sie diese Selektoren. Oder, cache das Ergebnis von $('.someElements') und rufen die Funktion als diese Variable plus .someFunction() später.

0 Stimmen

Das Problem ist, dass es $(...).fn nicht gibt, nur $.fn. Und das Setzen von $(...).someFunction hat nicht denselben Effekt, weil es nicht auf jedem Element in seinem eigenen Kontext ausgeführt wird.

0 Stimmen

@Robert Ich weiß nicht, warum der OP das wollte, aber ich möchte Funktionen an Elemente binden, so dass die aufrufende Funktion nicht zwischen den Elementen unterscheiden muss. Ich habe mehrere Feldtypen, von denen jeder seine eigene Validierungsmethode aufruft - da mein AJAX-Aufruf größtenteils repliziert, was das Formular ohne AJAX tut, ist es sinnvoll, eine einzelne Funktion zu schreiben, die die Validierungsfunktion aufrufen könnte, und dann nur das Attribut name und den Wert zu verwenden, um die POST-Daten aufzubauen, die gesendet würden, wenn ich die HTML-Schaltfläche "Submit" verwenden würde. Es scheint einfach mehr OOP auf diese Weise.

59voto

Reigel Punkte 62704

Pour jQuery 1.7 und später mit .on() et .trigger()

$('button').on('someFunction',function() {
    alert('go away!')
});

$('button').click(function(){
    $(this).trigger('someFunction');
});

Vor jQuery 1.7 haben wir .bind() Methode zum Anhängen von Ereignishandlern (anstelle von .on() ).

2 Stimmen

Und um die von der Funktion zurückgegebenen Daten anstelle der Jquery-Verkettung zu erhalten, verwenden Sie die Methode triggerHandler

9 Stimmen

Nur eine Aktualisierung hier, 'bind' ist veraltet und wurde durch 'on' ersetzt

4 Stimmen

Es ist nicht someFunction . Es ist someEvent . Sie binden einen Event-Handler für Ihr benutzerdefiniertes Ereignis und lösen ein Ereignis aus. Das Auslösen eines Ereignisses und das Aufrufen einer Plugin-Funktion sind zwei verschiedene Dinge.

21voto

DarkThrone Punkte 1944

Damit können Sie das oben Genannte tun:

$.fn.testFn = function(){
    this.each(function(){
        var className = $(this).attr('class');
        $(this).html(className);
    });    
};

$('li').testFn(); //or any element you want

Test: http://jsfiddle.net/DarkThrone/nUzJN/

3 Stimmen

Es sollte eine Rückgabe geben, um die Kette

0 Stimmen

@qwertymk: Ich weiß, es war, um einen Punkt zu machen, nicht um ein ganzes jQuery-Plugin zu definieren. @Reigil: ibidem, ich habe versucht, einen Punkt zu machen, dass dies bereits durch jQuery erreicht werden kann. Die ganze Antwort macht keinen Sinn. Man könnte die genaue Menge mit $(..) auswählen, anstatt das gesamte übereinstimmende DOM zu durchlaufen und über ein neues Kriterium zu eliminieren.

0 Stimmen

@DarkThrone was ist, wenn ich der Funktion einen Parameter hinzufügen möchte? Ich habe versucht, ihn in die Funktion() einzufügen, aber es funktioniert nicht.

11voto

Drizzel Punkte 297

Yo, brauchte, um die gleiche Sache zu tun, kam mit diesem. seine nette Ursache Sie zerstören das Element und Funktion geht poof! ich denke...

var snippet=jQuery(".myElement");
snippet.data('destructor', function(){
    //do something
});
snippet.data('destructor')();

0 Stimmen

Ihre Destruktorfunktion wird in anderen Funktionen und Ereignissen nicht verfügbar sein, wenn snippet nicht global ist, wie es in den meisten UI-Codes der Fall ist

10voto

Friederike Punkte 1202

Die Antwort von @Reigel ist großartig! Sie könnten aber auch die $.fn Syntax und lassen Sie Ihre Funktion nur bestimmte Elemente verarbeiten:

$.fn.someFunction = function(){
    this.each(function(){
        // only handle "someElement"
        if (false == $(this).hasClass("someElement")) {
            return; // do nothing
        }

        $(this).append(" some element has been modified");

        return $(this); // support chaining
    });    
};

// now you can call your function like this
$('.someElement').someFunction();            

Siehe funktionierendes jsfiddle: http://jsfiddle.net/AKnKj/3/

9voto

dan richardson Punkte 3761

Wenn Sie diese Funktion nur für bestimmte Selektoren benötigen, können Sie wie folgt vorgehen. Ich hatte gerade ein Szenario, in dem ich dies brauchte, und es funktioniert gut.

$('.my-selector').each(function(){

    $(this).init.prototype.getUrl = function(){
        // do things
    };
})

dann können Sie später

$('.my-selector').getUrl()

ohne es als Plugin definieren zu müssen, oder Daten oder bind/on/trigger-Ereignisse zu verwenden.

Natürlich können Sie die Funktion so ändern, dass sie das enthaltende Objekt zurückgibt, wenn Sie sie in der Verkettung verwenden wollen, indem Sie this

$('.my-selector').each(function(){

    $(this).init.prototype.getUrl = function(){
        // do things
        return this;
    };
})

3 Stimmen

Dies wird getUrl an jquery anhängen, nicht nur für dieses Element

0 Stimmen

Ich würde gerne wissen, warum nach 3 Jahren jemand dies herunterstimmt. Eine Erklärung wäre nett

1 Stimmen

Ich war nicht derjenige, der downvote, aber die downvote ist wahrscheinlich, weil dies NICHT diese Funktion nur für bestimmte Selektoren anhängen, es wird es auf ALLE Elemente (wie kommentiert von @JithinJose, dies wird getURL zu jQuery, nicht nur das Element anhängen). Es gibt ein jsfiddle hier: jsfiddle.net/xpvt214o/563274

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X