S_eVent
S_eVent
  • 发布:2016-06-23 15:20
  • 更新:2021-06-26 16:17
  • 阅读:5677

禁用Popover点击黑色背景后关闭的功能实现

分类:MUI

在项目中经常需要写一些通知弹出窗,这时就会经常使用到Popover组件。有时候制作一些弹出窗时,我做到只有用户点击了“确定”或者其他按钮时才会关闭,这个时候我就得想办法禁用其自带的“点击黑色背景后会关闭Popover”的这个功能。
通过阅读源码我找到了点击黑色背景关闭Popover的代码位置:

/**  
 * Popovers  
 * @param {type} $  
 * @param {type} window  
 * @param {type} document  
 * @param {type} name  
 * @param {type} undefined  
 * @returns {undefined}  
 */  
(function($, window, document, name) {  

……  

    var backdrop = (function() {  
        var element = document.createElement('div');  
        element.classList.add(CLASS_BACKDROP);  
        element.addEventListener($.EVENT_MOVE, $.preventDefault);  
        element.addEventListener('tap', function(e) {  
            var popover = $.targets._popover;  
            if (popover) {  
                popover.addEventListener('webkitTransitionEnd', onPopoverHidden);  
                popover.classList.remove(CLASS_ACTIVE);  
                removeBackdrop(popover);  
                document.body.setAttribute('style', ''); //webkitTransitionEnd有时候不触发?  
            }  
        });  

        return element;  
    }());

有没有看到,在tap事件的侦听函数中做了Popover关闭的动作,此时我们若想要通过一个开关变量来控制其“自动关闭”功能的开启与关闭的话就像我一样加上如下一句代码:

element.addEventListener('tap', function(e) {  
    var popover = $.targets._popover;  
    if (popover) {  
        if(popover.getAttribute('data-disable-auto-close'))return;//added by S_eVent 阻止点击遮罩关闭弹窗  
        popover.addEventListener('webkitTransitionEnd', onPopoverHidden);  
        popover.classList.remove(CLASS_ACTIVE);  
        removeBackdrop(popover);  
        document.body.setAttribute('style', ''); //webkitTransitionEnd有时候不触发?  
    }  
});

这样的话我们就通过一个“data-disable-auto-close”属性来控制Popover自动关闭功能的开关了,比如我有如下一个Popover准备弹出

<div class="mui-popover">弹出窗口</div>

那么给它加上data-disable-auto-close属性就能控制其黑色背景在点击后不会关闭Popover了

<div class="mui-popover" data-disable-auto-close=“true”>弹出窗口</div>
2 关注 分享
BirdZhang Danny

要回复文章请先登录注册

l***@163.com

l***@163.com

我直接用css把它搞成透明
2021-06-26 16:17
2***@qq.com

2***@qq.com

var backdrop = (function() {
var element = document.createElement('div');
element.classList.add(CLASS_BACKDROP);
element.addEventListener($.EVENT_MOVE, $.preventDefault);
element.addEventListener('tap', function (e) {
var popover = $.targets._popover;
if (popover) {
//如果页面存在这个方法 则阻止关闭
if (typeof fnCancel === 'function') {
return;
}
popover.addEventListener('webkitTransitionEnd', onPopoverHidden);
popover.classList.remove(CLASS_ACTIVE);
removeBackdrop(popover);
}
});
只要在引用mui.js的页面定义一个 function fnCancel (){}即可
2017-08-15 14:28
6***@qq.com

6***@qq.com

回复 1***@qq.com :
那就弹不出来了
2017-05-16 15:57
1***@qq.com

1***@qq.com

为什么要这么麻烦,只要a标签中的href中的锚点和弹出DIV的ID不一样就能实现,可以试试。
2017-04-18 18:55
Danny

Danny

官方的大大们,能不能把这里功能封装一下啊啊
2016-07-18 09:19