Проверьте, является ли функция JavaScript методом для элемента jQuery


Как определить, является ли функция методом для элемента jQuery?

Например, $.fn.fadeIn является функцией:

typeof $.fn.fadeIn === 'function' //true

Однако мне нужен способ отличить его от обычного метода без jQuery. Цель состоит в том, чтобы иметь возможность передать функцию в качестве параметра, а затем вызвать функцию правильно. Ниже приведен пример использования функции под названием doIt, которая принимает элемент jQuery и функцию, применяемую к этому элементу.

Пример HTML:

<h1>jQuery Function Test</h1>
<p class=t1>Highlight this line.</p>
<p class=t2>Hide this line.</p>

Пример JavaScript:

function doIt(elem, func) {
   if (func === 'a jQuery function')  //possible?
      func.apply(elem);
   else
      func(elem);
   }

function highlight(elem) {
   elem.css('background-color', 'gold');
   }

doIt($('p.t1'), highlight);
doIt($('p.t2'), $.fn.fadeOut);

Строка # 2 JavaScript нуждается в помощи.

Интерактивная версия:

Http://jsfiddle.net/sxduwke9/

2 4

2 ответа:

Вот решение, которое сочетает в себе идею строкового параметра, проверку, существует ли метод на объекте, и поддержку параметров...

function doIt(elem, func, params) {
    if (typeof func === 'function')
        func.apply(elem, [elem].concat(params));
    else if (elem[func] && params instanceof Array)
        elem[func](params[0], params[1], params[2]);
    else if (elem[func])
        elem[func](params);
}

Или на jsfiddle

Нет. Но вы можете полностью удалить оператор if:

function doIt(elem, func) {
    func.apply(elem);
}

function highlight() {
    this.css('background-color', 'gold');
}

doIt($('p.t1'), highlight);
doIt($('p.t2'), $.fn.fadeOut);

Если вы хотите передать больше аргументов, вот быстрый пример:

function doIt(elem, func) {
    var args = Array.prototype.slice.call(arguments, 2);
    func.apply(elem, args);
}

function highlight(color) {
    this.css('background-color', color);
}

doIt($('p.t1'), highlight, 'gold');
doIt($('p.t2'), $.fn.fadeOut);