2018-09-26 Day27 - JS中的事件处理

2018-09-26  本文已影响0人  Deathfeeling

一、JavaScript中的事件处理

1、在标签上使用onXXX属性来进行事件绑定(不推荐使用)
        <button onclick="sayHello()">按钮1</button>
        <script type="text/javascript">
            function sayHello(){
                alert("Hello!");
            }
2、通过代码获取标签绑定onXXX属性(不推荐使用)
        <button id="button1">按钮1</button>
        
        <script type="text/javascript">
            var button1 = document.getElementById("button1");
            button1.textContent = "点我呀!";
            button1.onclick = sayHello;
            function sayHello(){
                alert("Hello!");
            }
        </script>
3、通过diamante获取标签然后使用addEventListener绑定事件(推荐)

方法一:内部JS

        <button id="button1">按钮1</button>
        
        <script type="text/javascript">
            var button1 = document.getElementById("button1");
            //判断因为IE浏览器低版本不兼容
            if (button1.addEventListener){
                button1.textContent = "点我呀!";
                button1.addEventListener("click",sayHello);
                button1.addEventListener("click",sayGoodbye);
                button1.addEventListener("click",function(){
                    button1.removeEventListener("click",sayHello); //移除事件监听
                    button1.removeEventListener("click",sayGoodbye);
                })
            }else{ 
                //低版本IE浏览器使用的代码
                button1.attachEvent("onclick",sayHello);
                button1.attachEvent("onclick",sayGoodbye);
                button1.attachEvent("click",function(){
                    button1.detachEvent("onclick",sayHello); //移除事件监听
                    button1.detachEvent("onclick",sayGoodbye);
                })
            }

            function sayHello(){
                alert("Hello!");
            }
            function sayGoodbye(){
                alert("Goodbye!")
            }
        </script>

方法二:外部封装JS函数

<!DOCTYPE html>
<html>
   <head>
       <meta charset="utf-8" />
       <title></title>
   </head>
   <body>
       <button id="button1">按钮1</button>
       
       <script src="js/new_file.js"></script>
       <script type="text/javascript">
           var button1 = document.getElementById("button1");
           // 绑定事件的回调函数(callback function)
           // 你知道事件发生的时候,但是不知道事件什么时候发生,只是进行绑定。
           bind(button1, "click", sayHello);
           bind(button1, "click", sayGoodbye);
           bind(button1, "click", function(){
               onbind(button1, "click", sayHello);
           })

           function sayHello(){
               alert("Hello!");
           }
           function sayGoodbye(){
               alert("Goodbye!")
           }
       </script>
   </body>
</html>

//js文件
function bind(elem, event, fn){
   if (elem.addEventListener){
       elem.addEventListener(event, fn);
   }else{
       elem.attachEvent("on" + event, fn);
   }
}

function onbind(elem, event, fn){
   if (elem.removeEventListener){
       elem.removeEventListener(event, fn);
   }else{
       elem.detachShader("on" + event, fn);
   }
}

在事件回调函数中获取事件源(易错点)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="buttons">
            <button>button1</button>
            <button>button2</button>
            <button>button3</button>
            <button>button4</button>
            <button>button5</button>
        </div>
        
        <script src="js/javascript.js"></script>
        <script type="text/javascript">
            var buttons = document.querySelectorAll("#buttons>button");
            for (var i = 0; i<buttons.length; i+=1){
            //如果希望在事件回调函数中获得事件源
            //应该通过事件对象的target属性去获取事件源       
                bind(buttons[i], "click", function(evt){   
                    //取事件源不能用下标去获取
                    evt = evt || window.event; //兼容ie代码
                    evt.target.textContent = "欧耶";
                })
            }

        </script>
    </body>
</html>

二、事件回调函数和事件对象

绑定事件监听器的函数都需要传入事件的回调函数,程序员因为事件发生的时候要做什么,但是不知道什么时候发生,所以传入一个函数在将来发生事件的时候,由事件调用,这种就叫回调函数。

回调函数的第一个参数代表事件对象(封装了和事件相关的所有信息),对于低版本的IE,可以通过window.event来获取事件对象。

事件对象的属性和方法:
1、target / srcElement(IE) - 事件源(引发事件的标签)

2、阻止事件的默认行为,比如:a标签 --> preventDefault()

                    if (evt.preventDefault){
                        evt.preventDefault();
                    }else{
                        evt.returnValue = false; //兼容ie
                    }

3、事件的捕获和冒泡
事件冒泡 内 --> 外(子代-->父代)(默认 false)
事件捕获 外 --> 内 (true)

停止事件传播(捕获和冒泡) -- stopPropagation()
IE浏览器只有冒泡 -- cancelBubble = true

猜数字游戏(网页版)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>

    </head>
    <body>
    
        <input type="number" id="input" placeholder="猜0~10的数字"/>
        <input type="button" id="confirm" value="确定">   
        
        <script type="text/javascript">
            var count = 0;
            var num = parseInt(Math.random()*11);
            var guess = document.getElementById("input");
            var confirm = document.getElementById("confirm");
            confirm.addEventListener("click", guess_number);
            // 判断回车
            guess.addEventListener("keydown",function(evt){
                evt = evt || window.event;
                if (evt.keyCode == 13 || evt.which == 13){
                    guess_number();
                }
            })
            
            function guess_number(){
                var thyAnswer = parseInt(guess.value);
                count += 1;
                if (thyAnswer > num){
                    alert("大了大了~");
                }else if(thyAnswer < num){
                    alert("小了小了~");
                }else if(thyAnswer == num){
                    alert("恭喜你猜对了,一共猜了"+count+"次!");
                    confirm.disabled = true; //禁止按钮
                    guess.disabled = true;  //禁止输入框
                }
                guess.value = "";  //清除文本框内容
                guess.focus();  //获得焦点
    
            }
        </script>
    </body>
</html>

效果:


三、JS中创建对象常用方法

1、


2、


上一篇下一篇

猜你喜欢

热点阅读