如何创建无法关闭的Magento 2 Modal弹出窗口?


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.
在2002年

@KristofatFooman,哈哈哈,好吧,我将添加到模式文本:“请按F12键,检查此模式并将其从DOM中删除以将其关闭”。我认为您是对的,很有趣,但是我会接受这种风险,并且不会采取任何措施来阻止这种风险。
7ochem '16

Answers:


10

我无法覆盖modal.closeModal()通过mixin工作的功能,而且我认为通过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
做得好,这绝对是正确的方法
拉斐尔(Raphael)在Digital Pianism

7

我认为在这种情况下使用mixins是有意义的。

您可以尝试以下方法:

首先在您的模块中,创建以下内容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;
    };
});

使用此mixin,可以用closeModal自己的方法替换该方法的实现。在这种情况下,返回false将避免关闭模式。

旁注:我讨厌您这样做。不可打开的弹出窗口应从网上禁止。


3
我确实做到了,但是仍然关闭。如果我在终端中运行它,我会看到mixin正在运行:jQuery.mage.modal.closeModal给我function() { return false; }
7ochem

1
@ 7ochem可能return false;还不够。老实说,我对JS不太放心。我认为您应该阅读这篇文章,它可以帮助您缩小问题范围或找到另一种可能的解决方法:alanstorm.com/the-curious-case-of-magento-2-mixins
Digital Pianism的Raphael

3
我想这也将取代closeModal()我不想要的功能站点。我只想将此应用到该单模态
7ochem'1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.