2016-04-05 11 views
0

Ist es möglich, ein jQuery-Plugin zu erstellen, das this.each für mehrere Übereinstimmungen zurückgibt und es mir erlaubt, jedem Objekt in jeder Schleife eine Funktionseigenschaft hinzuzufügen? Ich möchte diese Funktion später direkt vom Objekt aufrufen.jQuery Plugin Geben Sie dieses Objekt zurück und fügen Sie jedem Objekt eine Funktionseigenschaft hinzu?

Zum Beispiel, hier ist eine vereinfachte Version von dem, was ich versuche zu tun: diese in einem document.ready Funktionsaufruf

(function ($) { 
    $.fn.roflcopter = function(options) { 

    return this.each(function() { 
     $(this).addClass('lol'); 
     $(this).getMyValue = function(e){ 
      return returnMyFilteredValue($(this)); 
     } 
    }); 

    function returnMyFilteredValue(elem){ 
     return $(elem).val().replace("cat", "dog"); 
    } 

    }; 
}(jQuery)); 

Ich möchte dann:

$("input.coolStuff").roflcopter(); 
var value = $("input.coolStuff").first().getMyValue(); 

Ist das möglich ? Ich bekomme eine Fehlermeldung, dass getMyValue keine Funktion ist.

+0

'.each()' gibt nur das Objekt zurück, das es erhalten hat. Verwenden Sie '.map()', wenn Sie Elemente überlappen und zurückgeben möchten, was die Funktion zurückgibt. – Barmar

Antwort

0

Geringfügige Änderung gesetzt: nur Platz getMyValue auf 'this' und nicht auf $ (dies) und Zugang von

$("input.coolStuff").first()[0].getMyValue() 
+0

Das hat perfekt funktioniert. Wie kommt es, dass es bei $ (this) nicht funktioniert? Und warum muss ich ihm einen Array-Index übergeben, damit er funktioniert? – OwN

+0

Sie können getMyValue auf 'object = $ (this)' speichern, aber dann müssen Sie dieses Objekt speichern, um es später zu verwenden. Da hast du nicht so verloren gegangen. Wenn Sie später versuchen, auf $ ("input.coolStuff") zuzugreifen, wird es zuerst() nicht gefunden. Da ich es in "this" gespeichert habe, was tatsächlich ein HTML-Knotenobjekt ist, wird es in dom und $ ("input.coolStuff") gespeichert. First() [0] gibt das Knotenobjekt, wo ich –

+0

Ja, aber ich musste das alles nicht machen. Das funktioniert einfach: 'this.getMyValue = function() { \t \t \t \t Rückgabe returnMyValue ($ this); \t \t \t} 'funktioniert auch gut, wenn wie dieser Zugriff.' $ ("Input.coolStuff"), die jeweils (function (e) { \t \t \t \t \t \t str + = $ (this) [0] .getMyValue() + "\ n"; \t \t \t \t \t}); ' – OwN

0

Sie können .data() verwenden, um eine Funktion an einem Element zu speichern und aufzurufen; Function.prototype.bind()this zu $(this) innerhalb .each() bei getMyValue

$(function() { 
 
    (function($) { 
 
    $.fn.roflcopter = function(options) { 
 
     return this.each(function() { 
 
     $(this).addClass("lol"); 
 
     function getMyValue(e) { 
 
      return returnMyFilteredValue(this); 
 
     }; 
 
     $(this).data().getMyValue = getMyValue.bind($(this)); 
 
     }); 
 

 
     function returnMyFilteredValue(elem) { 
 
     return elem.val(function(index, val) { 
 
      return val.replace("cat", "dog"); 
 
     }) 
 
     } 
 

 
    }; 
 
    }(jQuery)); 
 

 
    $("input.coolStuff").roflcopter(); 
 
    var value = $("input.coolStuff").first().data().getMyValue(); 
 
    console.log(value, value.val()) 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> 
 
</script> 
 
<input class="coolStuff" value="cat" /> 
 
<input class="coolStuff" value="cat" />

Verwandte Themen