2011-01-21 2 views
7

Hey Guys, Я пытаюсь создать медиа-плейлист, который может продвигать кредиты, воспроизводить видео и изменять заголовок на палец, конец видео и на следующий/предыдущий клик , Поэтому мне нужно написать некоторые функции, которые затем могут быть вызваны вместе. Так вот так:

function showBox() 
    { 
     $(this).parents('.container').find('.box').show(); 
    }; 

    function hideBox() 
    { 
     $(this).parents('.container').find('.box').hide(); 
    }; 

    $('a').hover(
     function() 
     { 
      showBox(); 
     }, 
     function() 
     { 
      hideBox(); 
     } 
    ); 

Проблема в том, что $ (это) не выполняет функции из .hover. Как мне это сделать?

Спасибо за помощь!

ответ

3

this будет проводить, если вы просто сделать:

$('a').hover(showBox,hideBox); 

EDIT: Для решения вопроса в комментарии, это будет работать для любой функции вы назначаете как событие обработчик. Не имеет значения, является ли это анонимной функцией или именованной.

Это:

$('a').click(function() { 
    alert(this.tagName); 
}); 

... так же, как:

function alertMe() { 
    alert(this.tagName); 
} 

$('a').click(alertMe); 

...или это:

function alertMe() { 
    alert(this.tagName); 
} 

$('a').bind('click', alertMe); 
+0

Действительно? Это было бы лучшим способом, я думаю. Будет ли это работать и для .click и .bind событий? –

+0

@Drew: Абсолютно. : o) Это просто назначение ваших функций непосредственно в качестве обработчиков, и в любое время, когда вызывается обработчик, значение 'this' в обработчике будет элементом, который получил событие. – user113716

+0

Ну, тогда это лучший способ сделать то, что я пытаюсь сделать точно! Есть ли недостатки в этом? Почему все эти люди не предлагали это? Кажется, это так просто! –

7

Ответ на ответ @ patrickdw jQuery задает область обратного вызова для события в элемент DOM, на котором было запущено событие. Например, см. Параметр eventObject в документации для обработчика click().

Мой первоначальный ответ (ниже) полезна, когда вы хотите создать JQuery плагин, так что вы можете ссылаться на свои собственные методы объектов JQuery и есть объект JQuery установлен как this во время выполнения. Однако, не правильный и простой ответ на исходный вопрос.

// Within a plug-in, `this` is already a jQuery object, not DOM reference 
$.fn.showBox = function(){ this.parents('.container').find('.box').show(); }; 
$.fn.hideBox = function(){ this.parents('.container').find('.box').hide(); }; 
$('a').hover(
    function(){ $(this).showBox() }, 
    function(){ $(this).hideBox() } 
); 

Редактировать: Или, если (как это было предложено) вы хотите добавить только одно имя для метода ~ глобального Jquery имен:

$.fn.myBox = function(cmd){ 
    this.closest('.container').find('.box')[cmd](); 
}; 

$('a').hover(
    function(){ $(this).myBox('show') }, 
    function(){ $(this).myBox('hide') } 
); 

Или в более общем плане:

$.fn.myBox = function(cmd){ 
    switch(cmd){ 
    case 'foo': 
     ... 
    break; 
    case 'bar': 
     ... 
    break; 
    } 
    return this; 
}; 

Для получения дополнительной информации см. jQuery Plugin Authoring Guide.

+0

+1 - Это еще один отличный подход, который не требует закрытия. Хороший ответ. –

+1

Красивый, jQuery способ сделать это. Хотя для записи рекомендации для плагинов обычно запрашивают однократное вторжение пространства имен. Поэтому '.theBox ('open')/.theBox ('close')' будет больше для regs. – Orbling

+1

Отличная точка, @ Orbling. Я думаю, что руководство является вполне разумным, когда вы сворачиваете свой собственный код для плагина, но, возможно, его можно использовать для одноразовых сценариев. Я обновил свой ответ, чтобы показать один из способов сделать это. – Phrogz

2

Вы должны изменить код, чтобы что-то вроде этого:

function showBox(elem) 
{ 
    elem.parents('.container').find('.box').show(); 
}; 

function hideBox(elem) 
{ 
    elem.parents('.container').find('.box').hide(); 
}; 

$('a').hover(
    function() 
    { 
     var $this = $(this); 

     showBox($this); 
    }, 
    function() 
    { 
     var $this = $(this); 

     hideBox($this); 
    } 
); 
+0

Это не сработает. 'hover (hoverOverFn, hoverOffFn)' - возможно, переместите привязку снаружи, но я не совсем понимаю, что задает вопрос :-) –

+0

@pst - поймал его, когда я его перечитал, обновил, чтобы правильно установить переменную , –

+0

@gddc Теперь, когда нет необходимости кэшировать его, как насчет просто showBox ($ (this)); ' – Phrogz

1

Добавить параметры showBox и hideBox так, чтобы они могли принимать элемент, а затем вызвать showBox($(this)) и hideBox($(this)).

2
$('a').hover(function() { 
    $(this).closest('.container').find('.box').show(); 
}, function() { 
    $(this).closest('.container').find('.box').hide(); 
}); 
+0

+1 для' ближайшего() ' – Phrogz

3

В JavaScript вы можете использовать call() или apply() для выполнения функции и явно указать this для него:

$('a').hover(
    function() 
    { 
     showBox.call(this); 
    }, 
    function() 
    { 
     hideBox.call(this); 
    } 
); 

Первый параметр, задаваемый call() определяет объект, который this будет ссылаться в функции. Любые дополнительные параметры используются в качестве параметров в вызове функции.

Смежные вопросы