mouseleave / ввод логики привязки / отмены привязки

#javascript #jquery

#javascript #jquery

Вопрос:

Я пытаюсь создать простой скрипт для формы. Скрипт покажет форму, когда пользователь наведет курсор мыши на div контейнера. Затем я хочу проверить, нажимает ли пользователь на какую-либо форму ввода, если нет, форма скроется. Если в фокусе находится поле ввода или текстовое поле, я отменяю mouseleave. Если пользователь хочет закрыть форму на этом этапе, ему нужно нажать на кнопку закрытия.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что после того, как у меня есть ввод в фокусе, и я закрываю форму, при следующем наведении курсора форма не скрывается. Я должен снова нажать кнопку закрытия. Как мне «сбросить» или отключить отмену привязки mouseleave, когда пользователь нажимает «Закрыть»?

Это соответствующая часть скрипта:

 $(".close").on('click', function() {
    $(".background").removeClass("green");
    $(".q-form").hide();
    $('.close').hide();
});

$(".container-background").on('mouseenter', function(){
    $('.q-form').show();
    $('.close').show();
    $('.background').addClass("green");
});

$(".container-background").on('mouseleave', function() {
    f ($('#contactForm input').is(':focus')) {
        $(".container-background").off("mouseleave"); 
            } else { 
                $('.q-form').hide();
                $('.close').hide();
                $('.background').removeClass("green");
            }
});
  

Комментарии:

1. Нет необходимости отменять mouseleave. Просто ничего не делайте с mouseleave, если ввод имеет фокус. В принципе … на mouseleave, если форма не в фокусе, закройте форму.

2. Ну, это было быстрое решение, спасибо! 🙂

Ответ №1:

Во-первых, небольшой оффтопик: я не рекомендую проверять input вход :focus . Лучший подход для описанного вами сценария — иметь:

 $(document).on("focus", "#contactForm input", function() {
    $(".container-background").off("mouseleave");
});
  

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

 $(".container-background").on("mouseleave", myFunction);
$(".close").on('click', function() {
    $(".background").removeClass("green");
    $(".q-form").hide();
    $('.close').hide();
    $(".container-background").off("mouseleave", myFunction)
                              .on("mouseleave", myFunction);
});
var myFunction = function() {
    // You won't need this condition if you also do what's above
    if (!$('#contactForm input').is(':focus')) {
        $('.q-form').hide();
        $('.close').hide();
        $('.background').removeClass("green");
    }
};
  

Если подумать, вы также можете просто сделать это и .off() вообще не вызывать вызов:

 if (!$('#contactForm input').is(':focus')) {
  

Ответ №2:

Лично мне не нравится использовать .наведите курсор или .on. Я использую .mouseenter и .mouseleave . Тогда, если вы просто создадите .mouseenter , не будет кода, чтобы вернуть его в несфокусированное состояние. Вот пример:

$(«#something»).mouseenter(функция (){ $(this).animate({ // какой-нибудь css или что-то еще. }) }) пока вы не поместите .mouseleave , он не должен расфокусироваться.