jq点击元素之外关闭元素的共存问题

1.首先第一个想到的是阻止事件冒泡;

随便写的css;
.select-wrap, .select-wrap1{
            position: relative;
            width: 100px;
            border: 1px solid #000;
        }
        .select-wrap1{
            margin-top: 100px;
        }
       .select-list{
        display: none;
        position: absolute;
        border: 1px solid red;
        top: 100%;
        left: 0
       }
<div class="select-wrap">
    <div class="select-span">
        <span>选择一个</span>
    </div>
    <ul class="select-list">
        <li>1111111111</li>
        <li>2222222222</li>
        <li>3333333333</li>
    </ul>
</div>
<script>
    $(".select-wrap .select-span").click(function(e){
        e.stopPropagation();
        $(".select-wrap .select-list").slideToggle();
    });
    $(document).click(function(e) {
       $(‘.select-wrap‘).find(‘.select-list‘).slideUp();
    });

</script>

这样写当有一个的时候没什么问题,但是当有两个以上的时候有点问题

<div class="select-wrap">
    <div class="select-span">
        <span>选择一个</span>
    </div>
    <ul class="select-list">
        <li>1111111111</li>
        <li>2222222222</li>
        <li>3333333333</li>
    </ul>
</div>

<div class="select-wrap1">
    <div class="select-span">
        <span>选择一个</span>
    </div>
    <ul class="select-list">
        <li>1111111111</li>
        <li>2222222222</li>
        <li>3333333333</li>
    </ul>
</div>
<script>
    $(".select-wrap .select-span").click(function(e){
        e.stopPropagation();
        $(".select-wrap .select-list").slideToggle();
    });
    $(".select-wrap1 .select-span").click(function(e){
        e.stopPropagation();
        $(".select-wrap1 .select-list").slideToggle();
    });
    $(document).click(function(e) {
       $(‘.select-wrap‘).find(‘.select-list‘).slideUp();
       $(‘.select-wrap1‘).find(‘.select-list‘).slideUp();
    });

</script>

我们发现,点击第二个的时候,第一个应该是要关闭的,但是并没有(反之亦然),其实是点击了凡是阻止事件冒泡的元素,都不会关闭,

点击没有事件冒泡的地方才会关闭;

我是这样解决这个问题的,可能还有其他更好的解决方法

下面是完整代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .select-wrap, .select-wrap1{
            position: relative;
            width: 100px;
            border: 1px solid #000;
        }
        .select-wrap1{
            margin-top: 100px;
        }
       .select-list{
        display: none;
        position: absolute;
        border: 1px solid red;
        top: 100%;
        left: 0
       }
    </style>
</head>
<body>
<div class="select-wrap">
    <div class="select-span">
        <span>选择一个</span>
    </div>
    <ul class="select-list">
        <li>1111111111</li>
        <li>2222222222</li>
        <li>3333333333</li>
    </ul>
</div>

<div class="select-wrap1">
    <div class="select-span">
        <span>选择一个</span>
    </div>
    <ul class="select-list">
        <li>1111111111</li>
        <li>2222222222</li>
        <li>3333333333</li>
    </ul>
</div>
</body>
<script  src="http://libs.baidu.com/jquery/1.7.2/jquery.min.js"></script>
<script>
    $(".select-wrap .select-span").click(function(){
        $(".select-wrap .select-list").slideToggle();
    });
    $(".select-wrap1 .select-span").click(function(){
        $(".select-wrap1 .select-list").slideToggle();
    });
    //
    $(".select-wrap .select-list li").on(‘click‘, function (e) {
        e.stopPropagation();
        $(this).parents(‘.select-wrap‘).find(‘span‘).html($(this).html());
        $(this).parents(‘.select-wrap‘).find(‘.select-list‘).slideUp();
        $(".select-wrap1 .select-list").slideDown(‘fast‘, ‘swing‘);
    })
    $(".select-wrap1 .select-list li").on(‘click‘, function (e) {
        e.stopPropagation();
        $(this).parents(‘.select-wrap1‘).find(‘span‘).html($(this).html());
        $(this).parents(‘.select-wrap1‘).find(‘.select-list‘).slideUp();
    })
    $(document).click(function(e) {
        var target = $(e.target);
        if(target.closest(".select-wrap").length == 0) {
           $(".select-wrap .select-list").slideUp();
        };
        if (target.closest(‘.select-wrap1‘).length == 0) {
           $(‘.select-wrap1 .select-list‘).slideUp(‘fast‘, ‘swing‘);
        };
    });

</script>
</html>

可以试试,如果有问题,欢迎提出,以便更正([email protected])

时间: 2024-10-14 05:39:25

jq点击元素之外关闭元素的共存问题的相关文章

jquery点击元素之外触发事件

1 $("#errorMsg_layer").bind("click",function(e){ 2 if($(e.target).closest("#errorMsg_div").length == 0){ 3 foo();5 } 6 });//点击 #errorMsg_div 之外触发foo()方法.

jquery 点击弹窗之外的地方,关闭?弹窗

jquery 点击弹窗之外的地方,关闭弹窗 方法一: $(document).click(function(event){ var _con = $(".select3_box"); if(!_con.is(event.target) && (_con.has(event.target).length ===0)){ _con.remove(); $(mythis).show(); } }); 方法二: $(document).click(function(event)

每天一个JavaScript实例-铺货鼠标点击位置并将元素移动到该位置

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-铺货鼠标点击位置并将元素移动到该位置</title> <style> #info{ width:100px; height:100px;

jquery简单原则器(匹配除了指定选择器之外的元素 selector 表示选择器)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>简单选择器</title> &

消除父级元素对子级元素的点击事件影响

<ul onclick="fatherClick()"> <li onclick="childClick()"> </li> </ul> <script> function fatherClick(){ alert("第二个响应"); } function childClick(){ window.event.cancelBubble = true; //取消事件的冒泡机制 alert(

vue.js click点击事件获取当前元素对象

Vue.js可以传递$event对象 <body id="app"> <ul> <li v-on:click="say('hello!', $event)">点击当前行文本</li> <li>li2</li> <li>li3</li> </ul> <script> new Vue({ el: '#app', data: { message: 'He

vue.js click点击事件获取当前元素对象及获取自定义属性

Vue.js可以传递$event对象 <body id="app"> <ul> <li :data-price="m.price" v-on:click="say('hello!', $event)">点击当前行文本</li> <li>li2</li> <li>li3</li> </ul> <script> new Vue({

LeetCode OJ:Product of Array Except Self(除己之外的元素乘积)

Given an array of n integers where n > 1, nums, return an array output such that output[i] is equal to the product of all the elements of nums except nums[i]. Solve it without division and in O(n). For example, given [1,2,3,4], return [24,12,8,6].由于不

jQuery中兄弟元素、子元素和父元素的获取

我们这里主要总结jQuery中对某元素的兄弟元素.子元素和父元素的获取,原声的Javascript代码对这些元素的获取比较麻烦一些,而jQuery正好对这些方法进行封装,让我们更加方便的对这些元素进行获取和操作. jQuery提供的方法 上来就把jQuery提供的方法摆在这里是不是有点不好呀,不过,我们从jQuery的方法名称上就能知道这些方法是干嘛的了. parent(selector) 查找父元素,可传入selector进行过滤(下同) parents(selector) 查找所有的祖先节点