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 回答