点击任何连接或空白地方先弹窗。

本文介绍了一种在多种浏览器中实现兼容性良好的弹窗功能的方法。通过检测不同浏览器类型并采用相应的弹窗策略,确保了包括IE、Firefox、Chrome等在内的主流浏览器都能正常显示弹窗内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试过safar,火狐,Google,世界之窗。都可以支持弹窗  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
 </HEAD>
 <div id="Layer1" style="position:absolute; width:260px; height:115px; z-index:1; left: 50px; top: 77px; filter:Alpha(opacity=30)"> 
<a href="http://www.baidu.com" target="_blank">哦哦</a>
</div>
<script type="text/javascript" >
document.onclick=function(){
//封装的弹窗函数
  var cs_url = 'http://www.xunlei.com',
    uid = window.cs_U,
    cs_S = window.cs_S,
    cs_d = window.cs_d,
    cs_dt = window.cs_dt,
    cs_pidx1 = window.cs_pidx1,
    cs_user = window.cs_user;
    var cs_exp = new Date();
    cs_exp.setTime(86400000 * (Math.floor((cs_exp.getTime() - cs_exp.getTimezoneOffset() * 60000) / 86400000) + 1) + cs_exp.getTimezoneOffset() * 60000);
    var cs_exp1 = new Date();
    cs_exp1.setTime(cs_exp1.getTime() + 172800 * 1000);


    function SCK(sName, sValue, oExpires, sPath) {
        document.cookie = sName + "=" + escape(sValue) + ";expires=" + oExpires.toGMTString() + ";path=" + sPath
    }
    SCK('37cs_pidx', cs_pidx1, cs_exp, '/');
    SCK('37cs_user', cs_user, cs_exp1, '/');


    var ua = navigator.userAgent;
    var browser = {
        ie: /msie/i.test(ua),
        ie6: /msie 6/i.test(ua),
        ie7: /msie 7/i.test(ua),
        ie8: /msie 8/i.test(ua),
        ie9: /msie 9/i.test(ua),
        360 : /360se/i.test(ua),
        sogou: /;?se.+?MetaSr/i.test(ua),
        maxthon: /Maxthon/i.test(ua),
        tt: /TencentTraveler/i.test(ua),
        ff: /firefox/i.test(ua),
        webkit: /AppleWebKit/i.test(ua),
        opera: /Opera/i.test(ua),
        qqbrowser: /QQBrowser/i.test(ua),
        theworld: /Theworld/i.test(ua)
    };
    function event(e, event, func, act) {
        if (browser.ie) e[act === undefined ? 'attachEvent': 'detachEvent']('on' + event, func);
        else e[act === undefined ? 'addEventListener': 'removeEventListener'](event, func, false)
    }
    function updatecs() {
        try {
            var pen_exp = new Date();
            if (cs_dt == 0 || (cs_dt == 1 && cs_pidx1 == 0)) {
                pen_exp.setTime(pen_exp.getTime() + (uid == 9249 ? 1000 * cs_d: 60000 * cs_d));
                SCK('37cs_pennding' + uid, 'true', pen_exp, '/');
                SCK('CS_pending' + uid, 'true', pen_exp, '/')
            }
            pen_exp.setTime(pen_exp.getTime() + 172800 * 1000);
            SCK('37cs_show', cs_S, pen_exp, '/');
        } catch(q) {}
    }
    function pop(url, param) {
        if (!document.body) {
            return setTimeout(function() {
                pop(url, param)
            },
            13)
        }
        try {
            if (browser['webkit'] && browser['maxthon']) {
                if (!func(url)) {
                    a_pop(url)
                }
            } else if (browser['tt']) {
                if (!a_pop(url)) {
                    object_pop(url)
                }
            } else if (browser['sogou']) {
                if (!func(url)) {
                    a_pop(url)
                }
            } else if (browser['webkit'] && browser['qqbrowser']) {
                if (!func(url)) {
                    click_pop(url)
                }
            } else if (browser['webkit'] || browser['opera']) {
                a_pop(url)
            } else if (browser['theworld'] && browser.ie6) {
                if (!object_pop2(url)) {
                    a_pop(url)
                }
            } else if (browser['theworld'] && browser.ie8) {
                if (!func(url)) {
                    try {
                        object_pop(url)
                    } catch(e) {
                        click_pop(url)
                    }
                }
            } else if (browser.ie6) {
                if (!func(url)) {
                    object_pop2(url)
                }
            } else if (browser.ie8 || browser.ie9) {
                if (!func(url)) {
                    try {
                        object_pop(url)
                    } catch(e) {
                        a_pop(url)
                    }
                }
            } else if (browser['ie']) {
                if (!func(url)) {
                    try {
                        object_pop(url)
                    } catch(e) {
                        click_pop(url)
                    }
                }
            } else if (browser['ff']) {
                if (!func(url)) {
                    click_pop(url)
                }
            } else {
                if (!func(url)) {
                    click_pop(url)
                }
            }
            updatecs()
        } catch(e) {
            if (browser.ie7 || browser.ie8 || browser.ie9 || browser['qqbrowser']) {
                click_pop(url)
            } else {
                a_pop(url)
            }
            updatecs()
        }
    }
    function object_pop(url, param) {
        var object = document.createElement('object');
        object.setAttribute('classid', 'CLSID:6BF52A52-394A-11D3-B153-00C04F79FAA6');
        object.style.cssText = 'position:absolute;left:1px;top:1px;width:1px;height:1px;';
        append(object);
        object.launchURL(url)
    }
    function object_pop2(url, param) {
        var object2 = document.createElement('object');
        object2.setAttribute('classid', 'clsid:2D360201-FFF5-11d1-8D03-00A0C959BC0A');
        object2.style.cssText = 'position:absolute;left:1px;top:1px;width:1px;height:1px;';
        append(object2);
        for (var i in object2) {
            try { (function(o) {})(object2[i])
            } catch(e) {}
        }
        setTimeout(function() {
            object2.DOM.Script.open(url, '_blank', '')
        },
        500)
    }
    function append(e) {
        for (var t in {
            body: 1
        }) {
            var ele = document.getElementsByTagName(t);
            for (var i = 0; i < ele.length; i++) {
                ele[i].insertBefore(e, ele[i].firstChild);
                return
            }
        }
    }


    function click_pop(url, param) {
        event(document, 'mouseup',
        function(e) {
            e = e || window.event;
            e.canceBubble = true;
            event(document, 'mouseup', arguments.callee, true);
            func(url, param)
        })
    }


    function a_pop(url) {
        var a = document.createElement("a");
        a.href = url;
        a.target = "_blank";
        var div = document.createElement('div');
        div.style.backgroundColor = '#fff';
        a.appendChild(div);
        append(a);
        var as = a.style;
        as.position = "absolute";
        as.zIndex = '2147483647';
        as.display = "block";
        as.top = "0px";
        as.left = "0px";
        as.cursor = 'default';
        as.opacity = "0";
        as.filter = "alpha(opacity:0)";
        var m = setInterval(function() {
            a.style.zIndex = '2147483647';
            var d = (document.compatMode.toLowerCase() == 'css1compat') ? document.documentElement: document.body;
            a.style.top = Math.max(document.documentElement.scrollTop, document.body.scrollTop) + 'px';
            div.style.width = Math.min(d.clientWidth, d.scrollWidth) + 'px';
            div.style.height = d.clientHeight + 'px';
            if (browser['ie']) {
                try {
                    var divs = document.body.childNodes;
                    for (var i = 0; i < divs.length; i++) {
                        if (!divs[i]['style']) {
                            continue
                        }
                        var _i = parseInt(divs[i].style.zIndex);
                        if (_i && divs[i] != a && _i == 2147483647) {
                            divs[i].style.zIndex = _i - 1
                        }
                    }
                    a.style.zIndex = '2147483647'
                } catch(e) {}
            }
        },
        120);
        a.onclick = function(e) {
            e = e || window.event;
            e.cancelBubble = true;
            setTimeout(function() {
                a.parentNode.removeChild(a)
            },
            200);
            clearInterval(m)
        };
        event(a, 'mouseup',
        function(e) {
            e = e || window.event;
            e.cancelBubble = true
        });
    }
    function func(url, param) {
        var f = window[String.fromCharCode(111, 112, 101, 110)];
        var w = f(url, '_blank', 'left=0,top=0,toolbar=yes,location=yes,' + 'status=yes,menubar=yes,scrollbars=yes,' + 'resizable=yes,width=' + screen.width + ',height=' + screen.height);
        return w
    }
    setTimeout(function() {
        pop(cs_url, {
            a: 1,
            b: 2
        })
    },
    300);
    event(window, 'beforeunload',
    function() {})
//封装的弹窗函数
  document.onclick=null;//下次点击就不会生效了
}


</script> 
<body> 
<a href="http://www.baidu.com" target="_blank">哦哦2</a>
<a href="http://www.baidu.com" target="_blank">哦哦3</a>
 <BODY>
  
 </BODY>
</HTML>
<think>首,用户的问题是关于u-popup在uni-app中点击空白区域关闭弹窗的实现方法。用户提到参考了引用[2],其中描述了使用@touchend.stop来处理事件,以实现点击空白区域关闭弹窗而不影响内部元素的交互。回顾引用[2]的内容:它建议使用@touchend.stop来替代点击事件,并在子元素上使用@touchend.stop来阻止冒泡事件。这可以确保当用户点击空白区域(遮罩层)时关闭弹窗,而点击内部元素时不会关闭。用户当前的查询是:“我想解决u-popup点击空白区域不关闭弹窗的问题请问u-popup点击空白区域关闭弹窗实现方法”。这表明用户希望启用点击空白区域关闭的功能,但可能遇到了问题。在引用[2]中,解决方案是:-在遮罩层弹出层容器上使用@touchend.stop事件来关闭弹窗。-在内部内容元素上使用@touchend.stop来阻止事件冒泡,这样点击内部不会触发关闭。现在,我需要基于uni-app和uViewUI框架(u-popup是其中的组件)来提供清晰的实现步骤。u-popup组件本身有属性来控制点击遮罩层是否关闭。引用[4]提到了类似element-ui的:close-on-click-modal属性,设置为false可以禁止点击空白关闭。但用户可能希望启用关闭功能。在uViewUI的文档中,u-popup组件有一个属性叫mask-close,默认为true,表示点击遮罩层可以关闭弹窗。如果用户想自定义行为,可能需要覆盖使用事件。然而,用户提到“点击空白区域不关闭弹窗”,可能意味着mask-close被设置为false,者事件处理有问题。引用[5]展示了在Vue中如何通过检查事件目标来实现点击外部关闭弹窗。用户需要手动处理事件。所以,综合来看,实现方法包括:1.使用u-popup的默认属性:如果mask-close=true,点击遮罩层会自动关闭。2.如果默认行为不工作,者需要更多控制,使用事件处理:在弹出层容器上添加点击事件,检查事件目标是否为遮罩层,然后关闭。3.参考引用[2],使用@touchend.stop来处理触摸事件,避免冒泡问题。步骤:-确保u-popup的mask-close属性设置为true(默认就是true)。-如果内部元素需要交互,在内部元素上添加@click.stop@touchend.stop来阻止事件冒泡。-如果需要自定义,手动处理点击事件。用户说“点击空白区域不关闭弹窗”,可能他们想启用关闭功能,所以指导如何设置。在回答中,我需要:-使用中文。-结构清晰:解释问题,提供解决方案,代码示例。-添加引用标识。-生成相关问题。回答结构:1.介绍问题:u-popup点击空白区域关闭弹窗的实现。2.解释u-popup的默认行为:mask-close属性。3.提供解决方案:-方法1:使用mask-close属性。-方法2:手动事件处理(参考引用[2]和[5])。4.代码示例。5.生成相关问题。代码示例基于uni-app和uView。u-popup组件的基本用法:```html<u-popupv-model="showPopup"mode="bottom":mask-close="true"><!--内容--><view@click.stop>内部内容,点击不会关闭</view></u-popup>```如果mask-close=true,点击遮罩层会关闭。但为了确保内部点击不关闭,在内容上添加@click.stop。如果用户想自定义关闭逻辑,可以使用事件。参考引用[2],使用@touchend.stop:```html<viewclass="popup-container"v-if="showPopup"@touchend.stop="handleMaskClick"><viewclass="popup-content"@touchend.stop><!--内容--></view></view>```在handleMaskClick方法中关闭弹窗。在uni-app中,可能需要使用@touchstart@touchend,因为@click在移动端可能有延迟。现在,整合到回答中。最后,生成相关问题:1.如何在u-popup中阻止点击内部关闭弹窗?2.u-popup的其他常见问题有哪些?3.如何在uni-app中自定义弹窗行为?确保回答真实可靠。</think>### u-popup点击空白区域关闭弹窗的实现方法 在uni-app中使用uView UI的u-popup组件时,实现点击空白区域(遮罩层)关闭弹窗,同时不影响内部元素的交互,可通过以下两种方法实现。核心原理是控制事件冒泡和组件属性配置。 #### 方法1:使用u-popup原生属性(推荐) u-popup组件自带`mask-close`属性,默认为`true`(点击遮罩层关闭弹窗)。若失效,需显式设置并确保内部元素阻止事件冒泡: ```html <template> <!-- 触发按钮 --> <u-button @click="showPopup = true">打开弹窗</u-button> <!-- u-popup配置 --> <u-popup v-model="showPopup" mode="bottom" :mask-close="true" <!-- 关键属性:启用遮罩层点击关闭 --> @close="handleClose" > <!-- 内部内容:使用@click.stop阻止事件冒泡 --> <view @click.stop class="content"> <text>勾选卡片内容</text> <u-checkbox-group @change="onSelect">...</u-checkbox-group> </view> </u-popup> </template> <script> export default { data() { return { showPopup: false } }, methods: { handleClose() { this.showPopup = false; // 关闭弹窗逻辑 }, onSelect(e) { console.log('卡片选中状态:', e.detail); // 内部交互不受影响 } } } </script> ``` **关键点说明**: - `:mask-close="true"`:强制启用遮罩层点击关闭[^2][^4]。 - `@click.stop`:在内部元素上阻止点击事件冒泡到遮罩层,避免误关闭[^2][^5]。 - 此方法兼容性好,无需额外事件处理。 #### 方法2:手动事件处理(适用于自定义弹窗) 若u-popup原生属性失效,需要更精细控制,可结合`@touchend.stop`实现(尤其适合微信小程序): ```html <template> <!-- 遮罩层容器 --> <view v-if="showPopup" class="mask" @touchend.stop="closePopup" <!-- 点击空白区域触发关闭 --> @touchmove.stop.prevent <!-- 阻止滚动穿透 --> > <!-- 内容区域:阻止事件冒泡 --> <view @touchend.stop class="popup-content"> <text>勾选操作</text> <u-radio-group @change="onChange">...</u-radio-group> </view> </view> </template> <script> export default { methods: { closePopup(e) { // 确保点击目标为遮罩层(非内容区域) if (e.target.className.includes('mask')) { this.showPopup = false; } } } } </script> <style> .mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); /* 半透明遮罩 */ } .popup-content { position: absolute; bottom: 0; width: 100%; background: white; } </style> ``` **关键点说明**: - `@touchend.stop`:替代`@click`,解决移动端事件延迟和冒泡问题[^2]。 - 事件目标检查:通过`e.target.className`确保只有点击遮罩层才关闭[^5]。 - `@touchmove.stop.prevent`:防止滚动穿透(页面滚动影响弹窗)[^1]。 #### 常见问题排查 1. **事件冲突**:内部元素未添加`@click.stop``@touchend.stop`,导致点击内容时误关闭。 2. **属性未生效**:检查`v-model`绑定是否正确,尝试`@mask-click`事件(uView 2.0+支持)。 3. **平台差异**:微信小程序中优使用`@touchend`,H5可使用`@click`[^2]。 > 引用说明:以上方法综合了u-popup组件特性及事件冒泡控制的最佳实践[^1][^2][^4][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值