JQuery:扩展.val()以包含.trigger()

时间:2013-10-17 03:34:48

标签: javascript jquery

我只是快速谷歌如何在JQuery中扩展功能,而且,我不知道我在做什么。我想要理解一般,但在这个特定的实例中,我想扩展.val()函数,为所有东西添加一个触发器'change'事件,因为默认情况下隐藏输入等某些元素不会这样做。换句话说,这就是:

$('#element').val('newval');

会自动变成这样:

$('#element').val('newval').trigger('change');

这是我的尝试......它打破了我的页面,但希望我很接近:

        (function($, input){

            var oldValFn = $.fn.val;

            $.fn.val = function() {
                var ret = oldValFn.apply(this, arguments);
                try {
                                            $(this).val(input);
                    $(this).trigger('change');
                }
                catch(e) 
                {
                    console.log(e);
                }
                return ret;
            }

            $(this).val('newval');

            })(jQuery);

非常感谢任何帮助,因为这显然是我需要从概念上理解的。谢谢!

1 个答案:

答案 0 :(得分:1)

也许这不是最好的解决方案,并且它有一些缺点(因为$.fn.val已经在内部调用this.val,所以有很多开销)但是这个实现似乎工作正常并且通过不触发来避免无限循环如果值未更改,则更改事件。

请注意,它尚未经过全面测试,但如果您对此插件非常认真,可以编写一些测试用例。

!function ($, oldValFn) {
    $.fn.val = function () {
        var args = arguments;

        if (!args.length) return oldValFn.call(this);

        this.each(function () {
            var $this = $(this),
                oldVal = oldValFn.call($this),
                result = oldValFn.apply($this, args),
                newVal = oldValFn.call($this);

            if (args.length && oldVal !== newVal) {
                $this.trigger('change');
            }
        });

        return this;
    };
}(jQuery, jQuery.fn.val);

DEMO