【问题标题】:JQuery - How to modify jquery method of a specific elementJQuery - 如何修改特定元素的 jquery 方法
【发布时间】:2013-08-02 15:22:42
【问题描述】:

我要做的是更改特定元素的默认jquery方法。

例如,我想更改一些(不是全部)select 列表的方法val()。然后在必要时恢复。

我的第一次尝试是以下但不工作。

$('#list').val = function(){ alert('toto'); };
//and then
$('#list').val()  //not work

解决方案

var old_val = $.fn.val;
$.fn.val = function(value){
    //some condition to trigger
    if (this.hasClass('someclass')){
        //getter
        if (value===undefined){
            //do something to get the values
            return val;
        }
        //setter
        else {
            //do something with the value
            return this;
        }
    }

    return old_val.apply(this, arguments);
};

【问题讨论】:

  • 这是个坏主意,不会奏效。
  • @MightyPork 什么意思,改变方法val()?
  • 你的最终目的是什么?
  • 如在列出的副本中一样,如果您只想为该元素更改它,则需要缓存该元素。最好编写一个小插件来执行您想要执行的任何功能并改为执行此操作。

标签: jquery


【解决方案1】:

每次调用 $('#list') 时,您都在创建一个新的 jQuery 对象。因此,当您执行$('#list').val = function(){ alert('toto'); }; 时,您已经为仅该实例 覆盖了val() 方法。如果你缓存了那个对象,你可以继续使用被覆盖的 val() 方法:

var list = $('#list');
list.val = function(){ alert('toto'); };
list.val(); //alerts 'toto'

但是,这是一种不好的做法,因为您不知道还有什么取决于 val() 正常工作。更好的方法是创建自己的插件:

$.fn.totoVal = function() {
    alert('toto');
    return this;
};

然后您可以将其称为$('#list').totoVal()

编辑

如果您真的非常想这样做(这也是一个坏主意),您可以通过这种方式覆盖本机 val() 实现:

var originalValueFunct = $.fn.val;

//update value function
$.fn.val = function () {
    return "custom value";
}

//do something with val()

//restore value function
$.fn.val = originalValueFunct;

有关覆盖和恢复本机 val() 函数的示例,请参阅此 working demo

我强烈建议不要这样做,因为您将在您的代码或您使用的任何依赖 val() 方法的库中创建副作用。这些副作用将很难调试,因为它们只会出现在您的环境中,而且您更改了部分核心 jQuery 功能并不总是很明显。

【讨论】:

  • 正如我所说,这是实现这一目标的最佳方式! ;)
  • 这回答了我的第一部分。但我真的很想修改一些 jquery 元素的val() 的默认行为,全局而不仅仅是缓存的 jquery 对象。
  • 插件是最好的方法。如果您更改标准 jQuery 函数的行为,您可能会在代码的其他位置或您使用的任何库中产生意想不到的副作用。这些副作用将显示为非常难以调试的错误。
  • 我添加了一个例子来展示如果你真的想要的话,你可以如何覆盖 val()。明智地使用它。
  • 要过滤掉自定义元素,我可以在$.fn.val:return $(this).hasClass('someclass') ? 'custom' : $.fn.val里面做吗?
【解决方案2】:

jquery 提供了 valHooks 对象,您可以将任何想要附加到 .val() 函数的函数附加到该对象。 你的例子看起来像这样,放在一行中。

$.valHooks.select = {get: function(elem) { if($(elem).attr('id') == 'list') alert('toto') }}

有关 valHooks 的更多详细信息,您可以查看 jquery api 文档http://api.jquery.com/val/

【讨论】:

  • 我喜欢这个主意。所以我需要做的就是做一个测试if ($(elem).hasClass('someclass') || $(elem).is('#list')) 来实现我想要过滤掉的东西。但是如何为其他元素返回原始函数的值呢?
  • 当我测试上面的代码时,除了抛出警报之外,它仍然返回原始函数的值。您也可以通过 elem 参数访问该元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多