Атрибут данных JQuery, используемый для нескольких всплывающих окон, но для запуска определенного при отпускании мыши

jquery

function initPopup() {
//----- OPEN
$('[data-popup-open]').on('click', function (e) {
    var targeted_popup_class = jQuery(this).attr('data-popup-open');
    $('[data-popup = "' + targeted_popup_class + '"]').fadeIn(350);
    e.preventDefault();
});
//----- CLOSE
$('[data-popup-close]').on('click', function (e) {
    var targeted_popup_class = jQuery(this).attr('data-popup-close');
    $('[data-popup = "' + targeted_popup_class + '"]').fadeOut(350);
    e.preventDefault();
});
}

$(document).ready(function () {
    initPopup();
});

Выше мой код jquery, который используется для отображения определенных всплывающих данных с использованием атрибута.

HTML

<div class = "popup" data-popup = "popup-1">
        <div class = "popup-inner">
            <h2>TEST</h2>
            <p>TEST</p>
            <p>TEST</p>
            <a data-popup-close = "popup-1" href = "#" class = "close">Close</a>
            <a class = "popup-close" data-popup-close = "popup-1" href = "#">x</a>
        </div>
    </div>


<div class = "popup" data-popup = "popup-2">
            <div class = "popup-inner">
             <h2>TEST</h2>
            </div>
        <a data-popup-close = "popup-2" href = "#" class = "close">Close</a>
        <a class = "popup-close" data-popup-close = "popup-2" href = "#">x</a>
    </div>

Я бы хотел, чтобы при событии mouseleave тела отображалось data-popup = "popup-2"

Я очень новичок в jquery, но мне нравится прыгать в глубину, если вы можете предложить лучший способ / другой способ сделать это, я буду рад узнать.

Спасибо, что нашли время прочитать.

Георгий

вы не используете событие mouseleave в своем коде. Под телом вы имеете в виду тело HTML?

Ngob 01.05.2018 15:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
615
2

Ответы 2

Если вы хотите привязать событие mouseleave к телу html (я не понимаю ваш вариант использования), вы можете сделать следующее:

$("body").on("mouseleave", function() {
  $("[data-popup='popup-2']").show();
});
$("body").on("mouseenter", function() {
  $("[data-popup='popup-2']").hide();
});

Этот код сбросит состояние, что означает, что он не сохранит открытое всплывающее окно, когда мышь повторно войдет в тело. Если вы хотите сохранить состояние, простой способ сделать это:

var isPopupShown = $"([data-popup='popup-2']").is(":visible");
$("body").on("mouseleave", function() {
  isPopupShown = $"([data-popup='popup-2']").is(":visible");
  $("[data-popup='popup-2']").show();
});
$("body").on("mouseenter", function() {
  $("[data-popup='popup-2']").show();
  if (!isPopupShown) {
     $("[data-popup='popup-2']").hide();
  }
});

Этот код покажет popup-2, когда мышь покидает тело, и восстановит исходное состояние, когда мышь находится внутри тела (не тестировалось, но это идея).

Есть много способов создать всплывающее окно, лично я использую только css (js не требуется для простого всплывающего окна) для простого случая. Вы можете создать кусок многоразового CSS и просто воспроизвести структуру html:

HTML:

 <label for = "foobaz">click here</label>
  <input type = "checkbox" class = "hide popup-controller" id = "foobaz"/>
  <div class = "popup" id = "popup1">
    <div>foo</div>
  </div>

CSS:

.popup-controller {
  display: none;
}
.popup {
  display: none;
}
.popup-controller:checked + .popup {
  display: block;
}
/** This show the popup if the mouse is out the body **/
body:not(:hover) #popup1.popup {
  display: block;
}

используя это, вы свободны от js (связанный jsbin). Используя этот код, если вход отмечен или указатель мыши не находится в теле, отобразится всплывающее окно. Вам просто нужно использовать ту же структуру html, чтобы иметь такой же эффект для других всплывающих окон. Используя это, вы можете управлять всплывающим окном в JS, используя trigger для флажка.

Если вам действительно нравится JS, я бы порекомендовал создать объект и сделать код, в котором вы указываете «popup-1» как можно меньше. Сделать это легко:

$( ".popup" ).on( "click", function( event ) {
  if ($(event.target).is('.close')) {
    $(this).hide();
    event.stopImmediatePropagation();
    event.preventDefault();
  }
});

В этом случае, даже если у вас есть много «закрытий» внутри вашего всплывающего окна, оно закроет всплывающее окно без необходимости указывать popup-1 (вы можете сохранить свой код open).

Добавьте во всплывающее окно, которое вы хотите закрыть в отпуске, другой атрибут данных, например, data-bodyclose (или название меттере). Затем в событии body проверьте, имеет ли .popup этот атрибут, если true, закрыть его (возможно, лучше запустить событие дочернего элемента data-close-popup)

Другие вопросы по теме