覆盖jQuery .val()函数?

7wp*_*7wp 28 jquery jquery-plugins

有没有办法轻松覆盖jQuery的val()功能?

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

CMS*_*CMS 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);
Run Code Online (Sandbox Code Playgroud)

请注意,您可以通过检查参数是否存在来区分getter调用$(selector).val();和setter调用.$(selector).val('new value');valueundefined

  • 这不起作用(至少在jQuery 1.7中不行).原始的jQuery函数依赖于参数count,因此它会认为原始的val()方法调用始终是一个setter.要解决此问题,请替换"return originalVal.call(this,value);" 用"return originalVal.apply(this,arguments);" (4认同)
  • @dkl的原始版本和提议的更改都不适用于Chrome.使用if..else来测试您是否正在使用或设置是否有效.以下是透明覆盖,根据需要进行更改.(function($){var originalVal = $ .fn.val; $ .fn.val = function(value){if(typeof value =='undefined'){return originalVal.call(this);} else {return originalVal .call(this,value);}};})(jQuery); (4认同)

小智 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);
Run Code Online (Sandbox Code Playgroud)

如果你想传递所有参数,你也可以使用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);
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助!