2011-01-09 3 views
6

Есть ли способ заставить функцию зависания выполнить только один раз? Это то, что я сейчас пытаюсь:jQuery - Использование .one() с зависанием

$('#ask').live('hover', function() { 

    $('#homesearch-after').hide(300); 

    $.doTimeout(300, function() { 
     hideClosedSearchLink(); 
     showHomeSearch(); 
    }); 

}); 

Но это не работает. Как я могу только активировать этот зависание?

Я пробовал сменить .live с .one и .bind ..., что привело к небытию.

+2

Unrelated на ваш вопрос, но вы можете избавиться от тайм-аута путем добавления кода внутри него непосредственно как callback после завершения 'hide':' $ ('# homesearch-after'). hide (300, function() {/ ** здесь код ** /}); ' –

ответ

10

Вы уже ответили на себя, используя .one() (не .live()).

Но lasseespeholt просто указал в комментарии, .hover() является сокращением для связывания с mouseenter и mouseleave, и это не событие само по себе.

Попробуйте это:

$('#ask').one('mouseenter', function() { 

    $('#homesearch-after').hide(300); 

    $.doTimeout(300, function() { 
     hideClosedSearchLink(); 
     showHomeSearch(); 
    }); 

}); 

Если это все еще не работает, попробуйте только с помощью хорошего ола».hover(), а затем .unbind() сразу ИНГ его после того, как он закончил.

$('#ask').hover(function() { 

    $('#homesearch-after').hide(300); 

    $.doTimeout(300, function() { 
     hideClosedSearchLink(); 
     showHomeSearch(); 
    }); 

    // Again taking into account what lasseespeholt said 
    $(this).unbind('mouseenter mouseleave') 

}); 
+1

По какой-то причине, когда я использую этот код, ничего не делает. =/ – Jared

+0

@Jared: Является ли ваш '# ask' динамически добавлен на вашу страницу JS? – BoltClock

+0

Нет, он отображается со статическим HTML. – Jared

8

hover не является реальным event, но сокращенный метод, который связывает обработчики для двух событий, mouseenter и mouseleave, и как таковой не работает с .one (как показано here). Для того, чтобы воспроизвести поведение hover вы должны иметь два привязок, которые будут как срабатывают только один раз, как это:

$("#foo").one("mouseenter mouseleave", function(e){ 
    $(this).toggleClass("bar"); 
}); 

выше будет такой же, как в следующем, за исключением того, что он срабатывает только один раз :

$("#foo").hover(function(){ 
    $(this).toggleClass("bar"); 
}); 

Если вы хотите, чтобы делать разные вещи на mouseenter и mouseleave, необходимо связать отдельные обработчики:

$("#foo").one("mouseenter", function(e){ 
    $(this).addClass("bar").text("Over"); 
}).one("mouseleave", function(e){ 
    $(this).removeClass("bar").text("Out"); 
}); 

W Шляпа я могу читать из вашего кода является то, что вы только хотите связать mouseenter событие, как это:

$('#ask').one('mouseenter', function() { 
    $('#homesearch-after').hide(300); 
    $.doTimeout(300, function() { 
     hideClosedSearchLink(); 
     showHomeSearch(); 
    }); 
}); 
+1

В качестве альтернативы, '.one ('mouseenter mouseleave', function (e) {...)' – BoltClock

+0

@BoltClock, это даже лучше, если вы хотите сделать «переключение», как в моем примере. Я добавлю! – mekwall

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