Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重写Jquery';s函数_Javascript_Jquery_Overriding - Fatal编程技术网

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
对象从函数中传递出去很可能会导致优化器完全放弃优化。对于某些代码,这当然不是问题。