Javascript 覆盖/截取所有jQuery函数

Javascript 覆盖/截取所有jQuery函数,javascript,jquery,overriding,interceptor,Javascript,Jquery,Overriding,Interceptor,我试图覆盖所有jQuery函数,以便在调用jQuery时执行操作(出于审计目的或其他原因)。但是,为了使以下代码正常工作,我可能需要获得函数接收的相同参数: function\uuuuwrapjquery(){ var包装器=这个; 警报(“包装”); var functions=Object.getOwnPropertyNames($.fn).filter(函数(p){ 返回值(typeof($.fn[p])=='function'); }); 对于(var i=0;i

我试图覆盖所有jQuery函数,以便在调用jQuery时执行操作(出于审计目的或其他原因)。但是,为了使以下代码正常工作,我可能需要获得函数接收的相同参数:

function\uuuuwrapjquery(){
var包装器=这个;
警报(“包装”);
var functions=Object.getOwnPropertyNames($.fn).filter(函数(p){
返回值(typeof($.fn[p])=='function');
});
对于(var i=0;i

元素
删除元素
如何替换所有函数(即使是带有参数的函数,如 每个)并保持jQuery正常工作

您可以检索插件,包括行
354-373
,以便使用

jQuery.sub()
返回

描述:创建jQuery的新副本,其属性和方法 可以在不影响原始jQuery对象的情况下进行修改

//https://code.jquery.com/jquery-migrate-1.4.1.js,第354-373行
jQuery.sub=函数(){
函数jQuerySub(选择器,上下文){
返回新的jQuerySub.fn.init(选择器,上下文);
}
extend(true,jQuerySub,this);
jQuerySub.superclass=这个;
jQuerySub.fn=jQuerySub.prototype=this();
jQuerySub.fn.constructor=jQuerySub;
jQuerySub.sub=这个.sub;
jQuerySub.fn.init=函数init(选择器,上下文){
var instance=jQuery.fn.init.call(this,selector,context,rootjQuerySub);
返回jQuerySub的实例instanceof?
实例:
jQuerySub(实例);
};
jQuerySub.fn.init.prototype=jQuerySub.fn;
var rootjQuerySub=jQuerySub(文档);
//migrateWarn(“jQuery.sub()已弃用”);
返回jQuerySub;
};
//使用jQuery的副本做一些事情
var__wrapjQuery=jQuery.sub();
__wrapjQuery.pluginName=“包装器”;
__wrapjQuery.fn.remove=函数(){
log(uuu wrapjQuery.fn.remove,$.fn.remove);
警报(wrapjQuery.pluginName);
}
__wrapjQuery(“.wrapper”)。单击(函数(){
__wrapjQuery(this.remove())
});
$(“.jquery”)。单击(函数(){
log($.fn.remove,_wrapjQuery.fn.remove);
$(this.remove();
});

包装器
.remove()
jQuery
.remove()

您可以使用以下代码包装所有jQuery对象方法,以收集您想要的任何统计信息:

// place this right after jQuery and any jQuery plugins are installed
(function($) {
    Object.getOwnPropertyNames($.fn).filter(function (p)   {
        return ( typeof( $.fn[p] ) === 'function' && p !== "init");
    }).forEach(function(funcName) {
        var orig = $.fn[funcName];
        $.fn[funcName] = function() {
            console.log(funcName + " jQuery method called");
            return orig.apply(this, arguments);
        }
    });
})(jQuery);
在此进行工作演示:

如果还想包括静态方法,可以对
jQuery
对象上的方法进行类似的枚举


请注意,由于
$.fn.init()
被称为构造函数,因此在如何处理它时需要不同的处理方法(不能将
.apply()
与构造函数一起使用),因此我绕过了记录该方法。我还没有通过jQuery搜索到任何其他被称为构造函数的方法,但它们可能也需要特殊处理



这里有一个更高级的版本,它甚至可以记录
.init()
和任何其他被称为构造函数的方法:。它检测是否使用
new
调用了一个方法,并相应地执行操作。

第一个明显的问题是为什么?您想解决什么问题?@charlietfl让我们假设我想审核jQuery中使用最多的方法。那么,当您删除
&&$.fn[p]==“remove”
并尝试使用
$.fn.each
时会发生什么?或者当你尝试链接方法时?@charlietfl小提琴手出错了。如果我放置
p==“each”
我发现它需要两个参数
jQuery.fn.jQuery.each(callback,args)
,然后
调用将失败。但是,如果我手动处理每个jQuery函数,它就会工作,但是如果我升级了具有更多函数的jQuery,脚本就会过时。每次循环都会覆盖
wrapper.oldTempjQueryFunction
。另外,在函数内部,
这个
将是调用jQuery方法的对象,而不是jQuery对象本身。参数
从何而来?@ClayKaboom-它内置于每个函数中:非常有用!这将有助于今后的参考!谢谢