我只是在谷歌上快速搜索了一下如何在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);
任何帮助都非常感谢,因为这显然是我需要从概念上理解的东西。谢谢!
发布于 2013-10-17 04:52:59
也许这不是最好的解决方案,而且它有一些缺点(由于$.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);
https://stackoverflow.com/questions/19417802
复制