0

次のように作成したValueBoxというオブジェクトがあります。

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());
      }
   }
}

特定のValueBoxインスタンスに変更イベントがあり、変更が発生するたびに発生します$inputBoxが、変更コールバック関数はクラスでval()メソッドを使用できません。それを使用$(this).val()して、jQuery val()メソッドを呼び出していると思いますが、これはもちろん機能しません。私が定義したval()メソッドにアクセスすることは可能ですか?

4

4 に答える 4

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);
    }
});

「ネイティブ」jQuery メソッドを拡張する適切な方法

于 2010-07-22T02:43:54.847 に答える
1

を呼び出すときは$inputBox.change()、オブジェクトを渡しValueBoxます。次に、それを呼び出しますval。そうすれば、jQuery コントロール内のスコープの問題について心配する必要がなくなります。

于 2009-07-28T15:56:54.933 に答える
0

プラグインの val() を拡張することに本当に興味がある場合は、次のようなことを試すことができます。

プラグインの最も外側の要素に「値」を設定して属性を設定したと仮定しましょう。

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

プラグイン インスタンスの ID が myValueBox の場合、次の方法で val を使用できます。

$("#myValueBox").val()

それは私にとってはうまくいきましたが、それがあなたの要件を満たしているかどうかはわかりません.

于 2009-11-27T13:56:37.763 に答える
-1

そんなことをやってみるべきだと思います

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);

プロトタイプでは、パブリックメソッドを定義しますが、ValueBox機能しているのはすべてプライベートです。

于 2009-07-28T17:07:41.007 に答える