重写jQuery.find()函数以提供额外的功能

时间:2011-03-16 15:16:34

标签: jquery jquery-selectors

我想覆盖jQuery.find来覆盖额外的功能。我已经使用了Ben Nadel博客上讨论的想法(http://www.bennadel.com/blog/1624-Ask-Ben-Overriding-Core-jQuery-Methods.htm),但由于某种原因它不能用于$ .find(),这是我的代码

        (function () {
        // Store a reference to the original remove method.
        var originalFindFunction = jQuery.find;

        // Define overriding method.
        jQuery.find = function () {
            // Log that we are calling the overridden function.
            Console.log("------> Find method called");

            // then execute the original method
            var results = originalFindFunction.apply(this, arguments);
            return results;
        };
    })();

你知道什么是错的,或者如何覆盖jquery函数?

3 个答案:

答案 0 :(得分:1)

您正在寻找覆盖/挂钩jQuery.fn.find而不是jQuery.find


(function () {
    // Store a reference to the original remove method.
    var originalFindFunction = jQuery.fn.find;

    // Define overriding method.
    jQuery.fn.find = function () {
        // Log that we are calling the overridden function.
        Console.log("------> Find method called");

        // then execute the original method
        var results = originalFindFunction.apply(this, arguments);
        return results;
    };
})();

答案 1 :(得分:1)

参考中的演示使用.fn.

中的函数
jQuery.fn.remove

你在

上覆盖一个功能的地方
jQuery.find

此级别的覆盖函数对this具有不同的含义。 当您处理.fn.时 - 这是返回的查询结果,它与任何查询结果“混合”。

这里,this将是根对象本身,并且它的用法是不同的。这些是“静态”调用的函数或实用函数。

答案 2 :(得分:0)

我实际上没有看到你的代码有任何错误。这个例子使用的是jQuery原型(“fn”),但你也可以操作$ .find。我基本上复制了您在以下示例中提供的相同代码:

var oldFind = $.find;

$.find = function() {
    console.log("something new.");

    console.log(oldFind.apply(this, arguments));
};

$.find("div");

意识到,您可能正在以特定方式执行此操作。上面你有:

(function() {...})();

这使得代码在第一个parens中自动执行(如果我在这里错了,请纠正我),如果你在这个函数之外调用包含的代码,这可能没有所需的意图。上面代码段的一个工作示例如下:http://jsfiddle.net/nuPLV/