美文网首页
JS事件相关基础

JS事件相关基础

作者: 张正yi | 来源:发表于2018-01-26 13:27 被阅读0次

    js事件:

    onclick 
    ondblclick 双击
    onmousedown
    onmousemove
    onmouseout
    onmouseover
    onmouseup
    

    键盘事件:

    onkeydown
    onkeypress 
    onkeyup
    

    JS中的事件冒泡和事件捕获:

    事件冒泡、事件捕获、阻止默认事件
    
    事件捕获阶段:事件从最上一级标签开始往下查找,直到捕获到事件目标(target)。
    事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签。
    
    event.stopPropagation 停止传播事件
    event.preventDefault:阻止默认行为
    

    1、事件冒泡。如下代码:

    <body>
      <div><input type="button" value="测试事件冒泡"/></div>
    </body>
    <script type="text/javascript">
            var input = document.getElementsByTagName("input")[0];
            var div = document.getElementsByTagName("div")[0];
            var body = document.getElementsByTagName("body")[0];
            input.onclick = function (e) {
                this.style.border = "5px solid red"
                alert("red")
            }
            div.onclick = function (e) {
                this.style.border = "5px solid green"
                alert("red")
            }
            body.onclick = function (e) {
                this.style.border = "5px solid yellow"
                // var e = e || window.e;
                alert("red")
            }
    </script>
    

    点击button事件,连同父元素绑定的事件一同触发。依次弹出”red“,"green","yellow"

    2、阻止事件冒泡:

    上面代码中我们修改input的事件代码如下:

    input.onclick = function (e) {
            this.style.border = "5px solid red";
            var e = e || window.e;
            alert("red");
            e.stopPropagation();
     }
    

    这个时候只会弹出”red“,因为阻止了事件冒泡。

    3、事件捕获:从顶层元素到目标元素或者从目标元素到顶层元素,和事件冒泡是一个相反的过程。

    修改代码如下:

    input.addEventListener("click", function () {
                this.style.border = "5px solid red";
                alert("red")
            }, true);
            div.addEventListener("click", function () {
                this.style.border = "5px solid green";
                alert("green")
            }, true);
            body.addEventListener("click", function () {
                this.style.border = "5px solid yellow";
                alert("yellow")
            }, true)
    

    点击button事件,这时候会依次弹出”yellow“,"green","red",如果把addEventListener方法的第三个参数改成false,则表示只在冒泡的阶段触发,弹出的依次为:”red“,"green","yellow"。

    这是因为在W3C模型中,任何事件发生时,先从顶层开始进行事件捕获,直到事件触发到达了事件源元素。然后,再从事件源往上进行事件冒泡,直到到达document。
    只要记住:
    第三个参数若是true,则表示采用事件捕获,若是false,则表示采用事件冒泡。      
    ele.addEventListener('click',fun,true)  true=捕获。false=冒泡
    

    4、阻止默认事件

    1.通过on这种方式的绑定的,使用return false;
    2.addEventListener绑定的,使用e.preventDefault();
    如下:

       <a href="https://www.baidu.com" id="btn">百度一下</a>
       btn.onclick = function () {
              document.body.innerHTML = "hello world";
              return false;
       }
       btn.addEventListener("click", function (e) {
        document.body.innerHTML = "hello world";
            var e = e || window.e;
            e.preventDefault();
      },false);
    上面两个事件都能阻止事件向下进行(阻止页面跳转)。   
    

    Vue相关事件基础

    事件处理:
    监听事件:v-on 指令监听DOM事件。
    eg:<button v-on:click="aaa()">点击</button>

    <!-- 阻止单击事件冒泡 -->
    <a v-on:click.stop="doThis"></a>
    <!-- 添加事件侦听器时使用事件捕获模式 -->
    <div v-on:click.capture="doThis">...</div>
    

    事件绑定的简写:

    <a v-on:click="doSomething"></a>

    <a @click="doSomething"></a>

    Vue中属性的绑定的简写直接是: === 'v-bind:'
    事件冒泡:

    <div id="app">
          <div @click="show1()">
              <input type="button" value="按钮" @click="show()">
          </div>
     </div>
    
        var vm = new Vue({
            el: "#app",
            data: {},
            methods: {
                show: function () {
                    alert("input click");
                },
                show1: function () {
                    alert("div click");
                }
            }
        });
    

    点击按钮会执行show,show1方法。

    练习:现在需要组织事件冒泡该怎么做呢?

    有两种方法:
    1)修改input标签代码如下即可:

    <div @click="show1()">
          <input type="button" value="按钮" @click.stop="show()"> 
    </div>
    

    此时点击按钮,就只会执行show()方法了。
    2)使用event对象,具体如下:

    show:function(event){
        alert("input click");    
        event.cancelBubble = true;
    }, 
    

    默认事件:
    如下代码(以鼠标右键菜单事件为例):

    <div id="app">
         <input type="button" value="按钮1" @contextmenu="show()">
         <input type="button" value="按钮2" @contextmenu.prevent="show1()">
    </div>
    

    按钮1右击,会出现弹窗,然后右击的默认菜单也会出现。
    按钮2右击,只会出现弹窗,默认的事件会被阻止。

    相关文章

      网友评论

          本文标题:JS事件相关基础

          本文链接:https://www.haomeiwen.com/subject/udniaxtx.html