覆盖 jQuery 函数

Posted

技术标签:

【中文标题】覆盖 jQuery 函数【英文标题】:Override jQuery functions 【发布时间】:2011-05-31 00:33:47 【问题描述】:

有没有办法覆盖 jQuery 的核心功能? 假设我想添加一个警报(this.length)大小:function() 而不是在源代码中添加它

size: function() 
    alert(this.length)
    return this.length;
,

我想知道是否可以做这样的事情:

if (console)

    console.log("Size of div = " + $("div").size());
    var oSize = jQuery.fn.size;
    jQuery.fn.size = function()
    
        alert(this.length);

        // Now go back to jQuery's original size()
        return oSize(this);        
    
    console.log("Size of div = " + $("div").size());

【问题讨论】:

【参考方案1】:

几乎拥有它,您需要将旧 size 函数内的 this 引用设置为覆盖函数中的 this 引用,如下所示:

var oSize = jQuery.fn.size;
jQuery.fn.size = function() 
    alert(this.length);

    // Now go back to jQuery's original size()
    return oSize.apply(this, arguments);
;

其工作方式是Function 实例有一个名为apply 的方法,其目的是任意覆盖函数体内的内部this 引用。

所以,举个例子:

var f = function()  console.log(this); 
f.apply("Hello World", null); //prints "Hello World" to the console

【讨论】:

@Gabriel 感谢您的链接! :) 这对 init 不起作用有什么特别的原因吗? (function($) var _o_init = jQuery.fn.init; jQuery.fn.init = function(selector, context) if (console) console.log("Function Call : init"); return _o_init.apply(this , 参数); )(jQuery); 对数据函数做了同样的事情..拯救了我的一天【参考方案2】:

您可以通过在单独的文件中对其进行原型化来覆盖插件方法,而无需修改原始源文件,如下所示::

(function ($) 
    $.ui.draggable.prototype._mouseDrag = function(event, noPropagation) 

         // Your Code
    ,

    $.ui.resizable.prototype._mouseDrag = function(event) 
            // Your code
       
(jQuery));

现在将您的逻辑或带有项目所需的新想法的原始代码放在这里。

【讨论】:

以上是关于覆盖 jQuery 函数的主要内容,如果未能解决你的问题,请参考以下文章

覆盖/拦截所有jQuery函数

在元素级别覆盖核心 jQuery 函数

如何覆盖 jQuery 函数或阻止它执行

如何停止/覆盖 Jquery TimeOut 函数?

js入口函数跟jQuery入口函数的区别

内联 onclick 覆盖 JQuery click()