覆盖jQuery .val()函数?

时间:2010-01-13 20:15:33

标签: jquery jquery-plugins

有没有办法轻松覆盖jQuery的val()函数?

我想要覆盖它的原因是我想在每次为元素设置值时添加一些处理。而且我不想制作另一个自定义值设置器,例如myVal()

6 个答案:

答案 0 :(得分:48)

您可以存储对原始val函数的引用,然后覆盖它并进行处理,稍后使用call调用它,以使用正确的上下文:

(function ($) {
  var originalVal = $.fn.val;
  $.fn.val = function(value) {
    if (typeof value != 'undefined') {
      // setter invoked, do processing
    }
    return originalVal.call(this, value);
  };
})(jQuery);

请注意,只需检查$(selector).val();参数是否为$(selector).val('new value');,就可以区分getter call value和setter call undefined

答案 1 :(得分:18)

我知道这是一个古老的主题,但它是谷歌搜索中的第一个,答案并不完全正确......

例如,如果你在控制台$('#myinput').val()中尝试,你应该得到#myinput的值。

但如果你做$('#myinput').val(undefined),你应该设置#myinput的值!( 使用当前答案及其注释,您将不会设置#myinput的值

以下是使用arguments的升级答案。

(function ($) {
  var originalVal = $.fn.val;
  $.fn.val = function(value) {
    if (arguments.length >= 1) {
      // setter invoked, do processing
      return originalVal.call(this, value); 
    }
    //getter invoked do processing
    return originalVal.call(this);
  };
})(jQuery);

如果你想传递所有参数,你也可以使用apply

(function ($) {
  var originalVal = $.fn.val;
  $.fn.val = function(value) {
    if (arguments.length >= 1) {
      // setter invoked, do processing
    } else {
      //getter invoked do processing
    }
    return originalVal.apply(this, arguments);
  };
})(jQuery);

我希望它有所帮助!

答案 2 :(得分:2)

我知道这个问题很老但只是为了给出一个完整的解决方案。为了使jQuery.val()和jQuery.val(value)在覆盖后都能正常工作,你需要正确地单独覆盖它。 因为在调用jQuery.val()然后调用originalVal.call(this,value);将无法正常工作。

要以正确的方式执行此操作,您需要在获取值时执行类似的操作: originalVal.call(本);

这是一个解释所有内容的网站:http://extremedev.blogspot.com/2012/01/override-jqueryval-and-jqueryvalvalue.html

此致 罗马

答案 3 :(得分:1)

如果我理解你是正确的,那么这样的事情就可以了。

jQuery.fn.val = function (new_val) {
    alert("You set a val! How wonderful!");
    this.value = new_val;
};

只需确保包含常规功能:获取选择的值等等。只需在常规jQuery库之后将代码放在之后。

答案 4 :(得分:1)

使用此代码,您可以覆盖特定元素的.val()的“ get”和“ set”:

(function () {

    var __val = $.fn.val;
    $.fn.val = function (value) {
        if (this[0] && (this[0].$val_get || this[0].$val_set)) {
            if (arguments.length === 0) return this[0].$val_get();
            else return this[0].$val_set(value) || this;
        }
        return __val.apply(this, arguments);
    };

})();

现在,您必须在DOM元素上创建两个函数属性-$val_get$val_set

<input type="text" id="myInput" />
<input type="text" id="someOtherInput" />

<script>

    $('#myInput')[0].$val_get = function () {
        console.log('Got value from myInput!');
        return this.value;
    };

    $('#myInput')[0].$val_set = function (value) {
        console.log('Set value of myInput!');
         this.value = value;
    }

    //----

    $('#myInput').val('Hello!'); //Console: "Got value from myInput!"
    $('#myInput').val(); //Hello! | Console: "Set value to myInput!"

    $('#someOtherInput').val('Hello!'); //Console: ""
    $('#someOtherInput').val(); //Hello! | Console: ""

</script>

这对于创建协调多个控件的组件很有用。

JsFiddle:https://jsfiddle.net/oj4gt2ye/6/

答案 5 :(得分:0)

我有一些要添加到CMS的答案,我的实现会有所不同,如下所示:

(function ($) { var fnVal = $.fn.val;
    $.fn.val = function(value) {
        if (typeof value == 'undefined') {
            return fnVal.call(this);
        }
        var result = fnVal.call(this, value);
        $.fn.change.call(this);
        // here you can add some more implementation
        return result;
    };
})(jQuery);

观察 $ .fn.change.call(this); 将在退出val(&#39;&#39;)函数之前调用,这也将触发.change()在每个val(&#39;&#39;)分配。

相关问题