Перегрузка функции на объекте jQuery - PullRequest
4 голосов
/ 27 декабря 2011

Я пытаюсь добавить метод в объект jQuery с тем же именем (но с другим набором параметров), что и у другого метода.

То, что у меня так далеко:

jQuery.fn.insertBefore = function(elem, duration)
{
    this.css("display", "none");
    this.insertBefore(elem);
    this.toggle(duration);
}

Однако этот код (в частности, строка this.insertBefore(where);) вызывает ту же самую функцию, а не функцию jQuery insertBefore(), как требуется.Что мне нужно сделать, чтобы добавить эту функцию в объект jQuery и перегрузить (не перезаписать) существующую функцию?

РЕДАКТИРОВАТЬ: Решение

(function ($)
{
    var oldInsertBefore = $.fn.insertBefore;
    jQuery.fn.insertBefore = function(elem, duration)
    {
        if (duration === undefined)
        {
            oldInsertBefore.call(this, elem);
            return;
        }

        this.css("display", "none");
        this.insertBefore(elem);
        this.toggle(duration);
    }
})(jQuery);

Ответы [ 3 ]

5 голосов
/ 27 декабря 2011

Вы сохраняете оригинальную функцию перед перезаписью.Как то так:

(function($){
    var oldInsertBefore = $.fn.insertBefore;
    jQuery.fn.insertBefore = function(elem, duration)
    {
        oldInsertBefore.apply(this, arguments);
        this.css("display", "none");
        this.insertBefore(elem);
        this.toggle(duration);
    }
})(jQuery);
3 голосов
/ 27 декабря 2011

вы можете использовать $.sub()

(function($){
    var sub$ = $.sub();

    sub$.fn.insertBefore = function(where, duration) {
       this.css("display", "none");
       this.insertBefore(where);
       this.toggle(duration);
    }

    /* you can use this plugin in this scope or you could also
       return sub$ and call the plugin outside */
})(jQuery);

описание $.sub():

Создает новую копию jQuery, свойства и методы которой можно изменять, не затрагивая оригинальный объект jQuery.

из http://api.jquery.com/jQuery.sub/

0 голосов
/ 27 декабря 2011

С технической точки зрения JavaScript не позволяет вам определять отдельные функции с одинаковыми именами, но с разными аргументами.Вы можете иметь только одну функцию с тем же именем, хотя все равно, сколько аргументов передается.Все вышеперечисленные решения используют это преимущество, но в итоге переименовывают исходную функцию и вызывают ее. Если нет действительно веской причины, я бы предложил присвоить вашему пользовательскому методу другое имя, чтобы оно не конфликтовало с существующей функцией. Представьте, что кто-то еще пытается добавить в вашу кодовую базу и не осознает этогостандартный метод jQuery был перезаписан.

Ваш собственный метод может принимать любое количество аргументов, к которым можно получить доступ через объект arguments.Вы можете сделать что-то вроде arguments.length или просто проверить, существуют ли ваши аргументы, чтобы выяснить, сколько / какие аргументы были переданы (см .: https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments).

В jQuery более стандартно просто передавать объект параметровкогда вы создаете собственный плагин, как объяснено здесь .

Почему вы пытаетесь сделать это точно?

...