click-outside

447 阅读1分钟
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style >
        .content{
            width: 100px;
            height: 100px;
            background-color: red;
        }
    </style>
</head>
<body>
    <div id='app'>
        <div v-color = "'red'">大家好</div>
        <div v-click-outside = "hide">
            <input type="text" @focus='show' >
            <div class="content" v-show="isShow"></div>
        </div>
        
    </div>
    <script src="./node_modules/vue/dist/vue.js"></script>

    <script>
        //全局指令   只需在全局引用即可
        Vue.directive('color',function(el,bindings,vnode){ // el:<div>大家好</div> ;  bindings 绑定的属性;  vnode 虚拟节点,里面有上下文context,Vue,就是我们这里的vm
           // console.log(el,bindings,vnode)
            el.style.border = `1px solid ${bindings.value}`
        })
        let vm = new Vue({
            el:'#app',
            directives:{
                "click-outside"(el,bindings,vnode){
                    //绑定给document   事件捕获
                    console.log('el',el)
                    document.addEventListener('click',(e)=>{
                        if(!el.contains(e.target)){
                           
                            console.log('失去焦点',bindings.expression)
                            vnode.context[bindings.expression]()
                        }
                    })
                }
            },
            data:{
                isShow:false
            },
            methods:{
                show(){
                    this.isShow = true
                },
                hide(){
                    this.isShow = false
                }
            }
        })
    </script>
</body>
</html>