Javascript 重写Jquery';s函数
我有一个巨大的应用程序,Javascript 重写Jquery';s函数,javascript,jquery,overriding,Javascript,Jquery,Overriding,我有一个巨大的应用程序,jquery的addClass和removeClass在代码中的许多地方都被使用。我想在添加/删除类的基础上,对被修改类的元素执行一些工作。更长的路径是在addClass和removeClass之后,在应用程序中的任何地方添加我的代码,但我想如果我能以某种方式覆盖这些jquery函数,那么我的生活就会轻松得多。我试过下面的代码 var oAddClass = jQuery.fn.addClass; jQuery.fn.addClass = function (arg) {
jquery的addClass
和removeClass
在代码中的许多地方都被使用。我想在添加/删除类的基础上,对被修改类的元素执行一些工作。更长的路径是在addClass
和removeClass
之后,在应用程序中的任何地方添加我的代码,但我想如果我能以某种方式覆盖这些jquery函数,那么我的生活就会轻松得多。我试过下面的代码
var oAddClass = jQuery.fn.addClass;
jQuery.fn.addClass = function (arg) {
alert(this);
alert(arg);
// Now go back to jQuery's original size()
return oAddClass.apply(this, arg);
};
但是在返回oAddClass.apply(这个,arg)时,获取错误“Function.prototype.apply:参数不是对象”代码>
有人能帮我一下吗 您正试图仅将包装函数的第一个参数传递给.apply()
,但是.apply()
的第二个参数应该是数组。您可以从参数
对象创建数组:
var args = [];
for (var i = 0; i < arguments.length; ++i) args[i] = arguments[i];
oAddClass.apply(this, args);
var args=[];
对于(var i=0;i
arguments
对象是运行时在每个函数中初始化的特殊对象。这是一个棘手的问题,可能会导致代码优化问题,但上面的简单用法是安全的。的第二个参数.apply
必须是类似数组的对象
return oAddClass.apply(this, arguments);
出于可维护性原因,我建议不要这样做:如果另一个开发人员查看代码并看到jQuery.addClass
,那么如果它除了删除类之外还做了其他事情,这将非常令人困惑
我只想用自己的规则编写一个helper函数,调用addClass
和/或removeClass
,因为它被记录为接收单个参数,我认为应该使用它而不是
不过值得一提的是:jQuery没有记录其内部的自用模式,因此您永远不知道何时将调用替换的addClass
方法(下面的toggle类示例)
(函数(){
var oAddClass=jQuery.fn.addClass;
jQuery.fn.addClass=函数(arg){
返回oAddClass.call(this,arg);
};
}());
$('foo').addClass('foobar');
$('span').addClass(函数(索引){
如果(索引==0){
返回“bar”;
}
返回“foo”;
});
$('button')。在('click',函数(){
$('foo').toggleClass('foo');
});代码>
.foo{
背景颜色:绿色;
}
.酒吧{
颜色:蓝色;
}
你好,世界
跨度1
跨度2
切换div上的Toggle.foo
我喜欢这样的问题,你自己也可以尝试一下+1.检查此项:要将arguments对象转换为数组,也可以执行var args=[].slice.call(arguments)
@Karl AndréGagnon是的,可以,但是将arguments
对象从函数中传递出去很可能会导致优化器完全放弃优化。对于某些代码,这当然不是问题。