Як створити спливаюче вікно Magento 2, яке неможливо закрити?


10

Я намагаюся створити модальне спливаюче вікно, яке неможливо закрити. На ньому є кнопка, яка перенаправляє вас до наступної сторінки, натискаючи на неї, але я не хочу, щоб користувачі могли її закрити.

Модальне спливаюче вікно можна закрити трьома способами:

  1. Клацнувши хрест / [X]кнопку у верхньому правому куті
  2. Натискаючи на втечу
  3. Клацніть на накладку

Поки це мій модальний JS, і я думаю, що clickableOverlay: falseя вже вирішив третій:

require(
    [ 'jquery', 'Magento_Ui/js/modal/modal' ],
    function($, modal) {
        $("#popup").modal({
            autoOpen: true,
            responsive: true,
            clickableOverlay: false,
            modalClass: 'modal-custom',
            title: 'Popup',
            buttons: [{
                text: $.mage.__('Take me back to the homepage'),
                class: 'action close-popup wide',
                click: function () {
                    window.location.href = '/';
                }
            }]
        });
    }
);

ОНОВЛЕННЯ:

Я також намагався налаштувати модаль по-іншому, намагаючись надані рішення:

require(
    [ 'jquery', 'Magento_Ui/js/modal/modal' ],
    function($, modal) {
        modal({
            //options
        }, $("#popup"));
    }
);

1
4. Використовуйте інструмент для розробників, щоб видалити вставлений модаль з DOM
Kristof в Fooman

@ KristofatFooman, ха-ха, Ок, я додам до модального тексту: "Будь ласка, натисніть F12, огляньте цей модал і видаліть його з DOM, щоб закрити його". Я думаю, ти маєш рацію, досить цікавий, але я прийму цей ризик і не буду застосовувати жодних заходів, щоб запобігти цьому.
7оч.

Відповіді:


10

Я не міг отримати перебір modal.closeModal()функції для роботи через mixins, а також я думаю, що це виконує через mixin, робить це перекриттям через весь веб-сайт у всіх режимах, чого я не хочу. Мені це потрібно лише на цьому одному модалі.

Я закінчив, просто видаливши будь-який тригер, який дзвонить modal.closeModal(). Є кілька інших модальних варіантів, які ви можете використовувати для досягнення цього:

  1. Я приховую кнопку закриття при відкритті модалу з openedопцією / подією, яка буде спрацьовувати відразу після відкриття модалу
  2. Я перекриваю keyEventHandlers.escapeKeyваріант

Отже, це мій остаточний код:

require(
    [ 'jquery', 'Magento_Ui/js/modal/modal' ],
    function($, modal) {
        modal({
            autoOpen: true,
            responsive: true,
            clickableOverlay: false,
            modalClass: 'modal-custom',
            title: 'Popup',
            buttons: [{
                text: $.mage.__('Take me back to the homepage'),
                class: 'action close-popup wide',
                click: function () {
                    window.location.href = '/';
                }
            }],
            opened: function($Event) {
                $('.modal-header button.action-close', $Event.srcElement).hide();
            },
            keyEventHandlers: {
                escapeKey: function () { return; }
            }
        }, $("#popup"));
    }
);

1
Хороша робота, це, безумовно, правильний спосіб зробити це
Рафаель у Digital Pianism

7

Я вважаю, що використання міксинів у цьому випадку буде доречним.

Ви можете спробувати наступне:

Спочатку у своєму модулі створіть наступне view/base/requirejs-config.js:

var config = {
    'config':{
        'mixins': {
            'Magento_Ui/js/modal/modal': {
                'Vendor_Module/hook':true
            }
        }
    }
}; 

Потім створіть view/base/web/hook.js:

define([], function(){
    'use strict';    
    return function(targetModule){
        targetModule.closeModal = function(){
            return false;
        }
        return targetModule;
    };
});

За допомогою цього міксину ви замінюєте реалізацію closeModalметоду власним методом. У такому випадку повернення false не дозволить закрити модальний.

Бічна примітка: Я ненавиджу вас за це. Незакриті спливаючі вікна повинні бути заборонені з Інтернету.


3
Я зробив саме це, але все одно це закривається. Якщо я запускаю це в своєму терміналі, я бачу, що mixin працює: jQuery.mage.modal.closeModalдає меніfunction() { return false; }
7ochem

1
@ 7ochem, можливо return false;, недостатньо. Мені не дуже зручно з JS, якщо чесно. Я думаю, ви повинні прочитати цю статтю, це може допомогти вам звузити проблему або знайти інший можливий спосіб її вирішення
Рафаель у Digital Pianism

3
Я думаю, що це також замінює closeModal()функціональний сайт поперек, чого я не хочу. Я хочу лише застосувати це до цього єдиного
модалу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.