2009-07-28 11 views
0

Ich habe ein Objekt namens ValueBox, die ich so erstellt:jQuery val() Methode auf einem benutzerdefinierten Objekt

function ValueBox(params) { 
    ... 
    $.extend(true, this, $('/* some HTML elements */')); 
    ... 
    var $inputBox = $('input[type=text]', this); 
    ... 
    this.val = function(newValue) { 
     if(typeof newValue == "number") { 
     $inputBox.val(newValue); 
     $inputBox.change(); 
     } else { 
     return parseFloat($inputBox.val()); 
     } 
    } 
} 

Ich habe ein Änderungsereignis auf einem bestimmten ValueBox Instanz, die immer dann, wenn die $inputBox Änderungen feuert, aber die Callback-Funktion ändern kann die Methode val() in meiner Klasse nicht verwenden. Ich gehe davon aus, dass ich mit der $(this).val() die jQuery val() -Methode aufruft, was natürlich nicht funktionieren würde. Ist es möglich, auf die von mir definierte Methode val() zuzugreifen?

+0

"nicht in der Lage zu verwenden" bedeutet, was genau (zur Klarstellung). es kann nicht darauf zugreifen? hast du versucht, die Val-Methode von Firebug aufzurufen? es erscheint mir sicher öffentlich. – geowa4

+0

Mein Understading ist, dass das Schlüsselwort "this" sich im Change-Handler auf das Element selbst bezieht und nicht auf das Objekt, das ich erstellt habe. Wenn ich das wie $ (this) umschließe, verwendet es einfach das normale jQuery-Objekt statt meiner. – DLH

+0

Oh! ok, ich denke, ich kenne mich darin aus. – geowa4

Antwort

1

Wenn Sie $inputBox.change() anrufen, übergeben Sie das Objekt ValueBox. Rufen Sie dann val an. Auf diese Weise müssen Sie sich keine Gedanken über Scoping-Probleme innerhalb von jQuery-Steuerelementen machen.

+0

Ja, ich mag es nicht wirklich, aber ich nehme an, es ist der einzige Weg. Danke für Ihre Hilfe. – DLH

+0

yeah, jQuery wendet die Funktionen mit einem eigenen Bereich an, und Sie benötigen eine Möglichkeit, sie zu ändern, ohne den internen Code von jQuery zu unterbrechen. Daher müssen Sie das Objekt übergeben. – geowa4

-1

Ich glaube, du etwas wie das

function ValueBox(params) { 
    ... 
    $.extend(true, this, $('/* some HTML elements */')); 
    ... 
    this.inputBox = $('input[type=text]', this); 
    ... 
} 

ValueBox.prototype.val = function(newValue) { 
    if(typeof newValue == "number") { 
     this.inputBox.val(newValue); 
     this.inputBox.change(); 
    } else { 
     return parseFloat(this.inputBox.val()); 
    } 
}; 

// then this should work 
var test = new ValueBox(); 
test.val(123); 

In Prototyp versuchen sollten Sie öffentliche Methoden definieren, alles, was in ValueBox Funktion privat ist;

+1

'this.val = function ...' ist sicher nicht privat. – geowa4

+0

Wenn es 'Funktion val() {...}' wäre, dann wäre es eine private Funktion gewesen. – geowa4

0

Wenn Sie wirklich daran interessiert sind, erstreckt val() für Ihr Plugin, können Sie so etwas wie die folgende versuchen:

Nehmen wir an, Sie eingestellt haben und das Attribut „Wert“ in dem äußersten Element Ihres Plugins.

jQuery.fn.extend({ val: function(newValue) { 
    if (newValue == null) { 
     return $(this).attr("value"); 
    } else { 
     $(this).attr("value", newValue);   
    } 
} 
}); 

Wenn die ID meiner Plugin-Instanz ist myValueBox dann würde ich in der Lage sein, val auf folgende Weise zu verwenden:.

$ ("# myValueBox") val()

Es funktionierte für mich, aber ich bin mir nicht sicher, ob es Ihren Anforderungen entspricht.

3
$.fn.yourpluginscope.originalVal = $.fn.val; 
$.fn.extend({ 
    val: function (value) { 
     if (/* detect your plugin element */) 
     { 
      if (value == undefined) 
       return /* getter */; 
      return $.fn.yourpluginscope.originalVal.call(/* setter */, value); 
     } 
     return $.fn.yourpluginscope.originalVal.call(this, value); 
    } 
}); 

richtiger Weg, um sich "native" jQuery Methode