自定义对象上的 jQuery val() 方法

发布于 2024-07-30 07:09:14 字数 614 浏览 10 评论 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() 方法?

I have an object called ValueBox that I created like this:

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

I have a change event on a particular ValueBox instance which fires whenever the $inputBox changes, but the change callback function is unable to use the val() method in my class. I assume that by using $(this).val() that I'm calling the jQuery val() method, which of course wouldn't work. Is it possible to access the val() method that I defined?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

め七分饶幸 2024-08-06 07:09:15
$.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 方法的正确方法

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

Proper way to extends "native" jQuery method

好菇凉咱不稀罕他 2024-08-06 07:09:15

当您调用 $inputBox.change() 时,向其传递 ValueBox 对象。 然后调用 val 。 这样,您就不必担心 jQuery 控件内的范围问题。

When you call $inputBox.change(), pass it the ValueBox object. Then call val on that. That way, you won't have to worry about scoping problems within jQuery controls.

把人绕傻吧 2024-08-06 07:09:15

如果您确实有兴趣为您的插件扩展 val() ,您可以尝试如下操作:

让我们假设您已在插件的最外层元素中设置并属性“value”。

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

如果我的插件实例的 id 是 myValueBox 那么我可以通过以下方式使用 val:

$("#myValueBox").val()

它对我有用,但我不确定它是否满足您的要求。

If you are really interested in extending val() for your plugin, you can try something like the following:

Let us assume that you have set and attribute "value" in the outermost element of your plugin.

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

If the id of my plugin instance is myValueBox then I would be able to use val in the following manner:

$("#myValueBox").val()

It worked for me but I am not sure if it meets your requirements.

七度光 2024-08-06 07:09:15

我认为你应该尝试类似的方法,

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 函数中的所有内容都是私有的;

I think you should try something like that

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 prototype you define public methods, all that is in ValueBox function is private;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文