Как я могу определить, когда функция вызывается как обратный вызов jQuery или вызывается напрямую? - PullRequest
4 голосов
/ 07 февраля 2010

Я использую hoverIntent, который в рамках своих настроек будет вызывать функцию.Я думаю, это называется «ссылка на функцию» (правильно?):

var HIconfig = {
     interval: 250,
     sensitivity: 8,
     over: myFunction,
     timeout: 100,
     out: myOtherFunction
};

Однако я бы хотел использовать эту функцию время от времени и явно передавать объект jQuery.Итак, я добавил это к функции.

myFunction($myObject){
}

Теперь задача состоит в том, чтобы выяснить, когда функция вызывается из hoverIntent или вызывается явно.Я думал, что проверю, содержит ли $ (this) определенный элемент DOM:

myFunction($myObject){
     if($(this).is('li')){
       $myObject = $(this)
     };

     $myObject.doSomething...

}

Но ... У меня проблемы.Если я выйду из системы как $ (this), так и $ myObject, это будет результат:

Вызывается через hoverIntent:

$(this) = [li#Trigger-0.nav-main-tab]
$myObject = Object { originalEvent=, more...}

Вызывается через явную передачу объекта

$(this) = [Window PT02-home-page.php#]
$myObject = [li#Trigger-0.nav-main-tab]

Я могу проверить на $(this).is('li') в первом сценарии, поскольку это правда.

Не могу за секунду, хотя, как и при попытке выполнить тест, Firefox это не нравится:

g.nodeName is undefined

Одним из предложений было переключиться на 1.4.1и попробуйте проверить обратное с помощью .isPlayObject:

if (jQuery.isPlainObject($myObject))...

Это прекрасно работает в Firefox.Тем не менее, IE8 всегда возвращает истину.

Мои вопросы:

  1. Является ли моя логика простой с точки зрения того, как моя функция вызывается из hoverIntent или напрямую?

  2. Если нет, то есть ли способ последовательно проверить, передал ли я явно объект в мою переменную в функции?

Ответы [ 3 ]

3 голосов
/ 07 февраля 2010

Я бы сделал это совершенно по-другому. Во-первых, странно, когда функция принимает в качестве параметра объект jQuery. Идите по пути jQuery и превратите свою функцию в плагин jQuery. Для использования в конфигурации hoverIntent вы можете либо обернуть свою функцию в другую маленькую функцию, либо сделать это с помощью новой (1.4) функции jQuery.proxy ().

1 голос
/ 07 февраля 2010

Вы делаете это излишне сложным. Просто используйте оболочку для обратного вызова, который передает аргумент, ожидаемый функцией:

var HIconfig = {
     interval: 250,
     sensitivity: 8,
     // myFunction expects a jQuery object, so create one from the context
     over: function() { myFunction($(this)) },
     timeout: 100,
     out: myOtherFunction
};

... тогда вы можете вообще пропустить проверку внутри вашей функции:

myFunction($myObject)
{
     $myObject.doSomething...
}
1 голос
/ 07 февраля 2010

Вместо передачи объекта, почему бы не передать простое логическое значение, чтобы указать, откуда он был вызван, например:

myFunction(asOption){
    if(asOption) {
        alert("called from hoverIntent");
    } else {
        alert("called from somewhere else");
    }
}

или я полностью упускаю суть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...