js 事件

常见事件类型:

用户点击事件   鼠标经过特定事件 用户按下键盘事件  用户滚动窗口或改变窗口大小  页面元素加载完或加载失败






定义事件





例子







三种绑定事件的方法优缺点


直接在html中 绑定的方式不要用!!!


勘误

DOM0级事件,应该是同种类型下只能绑定一个事件句柄而不是事件类型.  即如果是同一个btn.onclick 有两个事件句柄 只会以后一个为准




绑定事件的兼容情况





事件解绑





<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>DOM2级事件处理</title>
</head>
<body>
   <button id="myBtn">点击我</button>
   <script type="text/javascript">
      // 事件依附元素作用域
      var btn = document.getElementById("myBtn");
      btn.addEventListener("click", function(){
         alert(this.id);
      }, false);

      // 元素可以添加多个事件
      var btn = document.getElementById("myBtn");
      btn.addEventListener("click", function(){
         alert(this.id);
      }, false);
      btn.addEventListener("click", function(){
         alert("Hello World");
      }, false);

      // 如何解除事件绑定
      // 错误做法
      var btn = document.getElementById("myBtn");
      btn.addEventListener("click", function(){
         alert(this.id);
      }, false);

      btn.removeEventListener("click", function(){
         alert(this.id);
      }, false);

      // 正确做法 保证addxx和removexx中的参数相同
      var btn = document.getElementById("myBtn");
      var handler = function(){
         alert(this.id);
      }
      btn.addEventListener("click", handler, false);

      btn.removeEventListener("click", handler, false);


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



DOM0级事件移除事件  只需例如  obj.onclick = null;




IE事件流






<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>IE事件处理程序</title>
</head>
<body>
   <button id="myBtn">点击我</button>
   <script type="text/javascript">
      // 事件依附元素作用域
      var btn = document.getElementById("myBtn");
      btn.attachEvent("onclick", function(){
         alert("Clicked");
      });

      // this指向window ie下的规定匿名函数的this指向window
      btn.attachEvent("onclick", function(){
         alert(this === window);
      });

      // 添加多个事件
      var btn = document.getElementById("myBtn");
      btn.attachEvent("onclick", function(){
         alert("Clicked");
      });
      btn.attachEvent("onclick", function(){
         alert("Hello world!");//俩个事件都能绑定上去
      });
      

      // 移除事件
      var btn = document.getElementById("myBtn");
      var handler = function(){
         alert(this.id);
      }
      btn.attachEvent("click", handler);

      btn.detachEvent("click", handler);


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




写一套代码兼容ie和非ie


<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>跨浏览器的事件处理程序</title>
</head>
<body>
   <button id="myBtn">点击我</button>
   <script type="text/javascript">
      // 事件依附元素作用域
      var EventUtil = {
         addHandler: function(element, type, handler){
            if(element.addEventListener){
               element.addEventListener(type, handler, false);
            }else if(element.attachEvent){
               element.attachEvent("on" + type, handler);
            }else{
               element["on"+type] = null
            }
         },
         removeHandler: function(element, type, handler){
            if(element.removeEventListener){
               element.removeEventListener(type, handler, false);
            }else if(element.detachEvent){
               element.detachEvent("on" + type, handler);
            }else{
               element["on"+type] = null
            }
         }
      }

      var btn = document.getElementById("myBtn");
      var handler = function(){
         alert("Clicked");
      }
      EventUtil.addHandler(btn, "click", handler);
      EventUtil.removeHandler(btn, "click", handler);

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


事件委托和事件冒泡



addeventlistener后面的false就是事件冒泡 默认为false   true就是事件捕获


事件冒泡







事件捕获


大部分情况用事件冒泡



事件委托(原理是事件冒泡)


问:如果采用html或者DOM0级事件绑定事件的时候,是默认事件冒泡吗???

“默认事件冒泡”这句话是不合适的。只能说通过DOM0级事件处理添加的事件,无法控制冒泡、捕获,但是可以取消事件冒泡(在冒泡阶段的事件传递)。




Event对象属性



event.type事件类型




target和eventtarget



preventDefault

// 阻止默认行为
var link = document.getElementById("myLink");
link.onclick = function(event){
   event.preventDefault();
}


stopPropagation
// 取消事件捕获或者冒泡
var btn = document.getElementById("myBtn");
btn.onclick = function(event){
   alert("Clicked");
   event.stopPropagation();
}
document.body.onclick = function(event){
   alert("Body clicked");
}


ie8下event属性
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>IE中的事件对象</title>
</head>
<body>
   <button id="myBtn">点击我</button>
   <script type="text/javascript">
       // DOM0中获取事件对象
       var btn = document.getElementById("myBtn");
       btn.onclick = function(){
         var events = window.event;
         alert(events.type);    //"click"
       }

       // attachEvent方式获得事件对象
       var btn = document.getElementById("myBtn");
       btn.attachEvent("onclick", function(event){
         alert(event.type);
       });

       // 有cancelBubble  returnValue  srcElement  type 
       var btn = document.getElementById("myBtn");
       btn.onclick = function(){
         alert(window.event.srcElement === this);      //true 等同于target
       }

       btn.attachEvent("onclick", function(event){
         alert(event.srcElement === this);       //false
       })

       // IE浏览器中阻止默认事件
       var link = document.getElementById("myLink");
       link.onclick = function(){
         window.event.returnValue = false;//同preventDefault
       }

       // IE阻止事件冒泡
       var btn = document.getElementById("myBtn");
       btn.onclick = function(){
         alert("Clicked");
         window.event.cancelBubble = true;//等于stopPropagation
       }
       document.body.onclick = function(){
         alert("body clicked");
       }

       // 跨浏览器的事件对象 兼容性写法!!!!!!!!!!
       var EventUtil = {
         addHandler: function(element, type, handler){

         },
         getEvent: function(event){
            return event? event : window.event;
         },
         getTarget: function(event){
            return event.target || event.srcElement;
         },
         preventDefault: function(event){
            if(event.preventDefault){
               event.preventDefault();
            }else{
               event.returnValue = false;
            }
         },
         removeHandler: function(element, type, handler){

         },
         stopPropagation: function(event){
            if(event.stopPropagation){
               event.stopPropagation();
            }else{
               event.cancelBubble = true;
            }
         }
       }

       btn.onclick = function(event){
         var event = EventUtil.getEvent(event);
         var target = EventUtil.getTarget(event);
       }

      btn.onclick = function(event){
         var event = EventUtil.getEvent(event);
         EventUtil.preventDefault(event);
      }

      btn.onclick = function(event){
         alert("Clicked");
         var event = EventUtil.getEvent(event);
         EventUtil.stopPropagation(event);
      }

      document.body.onclick = function(event){
         alert("Body clicked");
      }
   </script>
</body>
</html>


使用



事件类型





<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>js中常用的事件</title>
</head>
<body>
   <script type="text/javascript">
      // UI事件
      // 1、load
      // 当页面完全加载后在window上面触发
      var EventUtil = {};//补充前面
      EventUtil.addHandler(window, "load", function(e){
         alert("Loaded!");
      });

      // img标签加载完毕
   /* var image = document.createElement('img');
      image.src = "";
      EventUtil.addHandler(image, "load", function(e){
         e = EventUtil.getEvent(e);
         alert(EventUtil.getTarget(e).src);
      })*/

      // 实例img预加载
   /* EventUtil.addHandler(window, "load", function(){
         var image = new Image();
         img.src = "";//将图片缓存到内存上面
         EventUtil.addHandler(image, "load", function(event){
            alert("Image loaded!");
         })
      })*/
      // js动态加载完毕
      /*EventUtil.addHandler(window, "load", function(){
         var script = document.createElement("script");
         EventUtil.addHandler(script, "load", function(event){
            alert("js Loaded");
         });
         script.src = "example.js";
         document.body.appendChild(script);
      });*/

      // css动态加载完毕
      EventUtil.addHandler(window, "load", function(){
         var link = document.createElement("link");
         link.type = "text/css";
         link.rel = "stylesheet";
         EventUtil.addHandler(link, "load", function(event){
            alert("css Loaded");
         });
         link.href = "example.css";
         document.getElementsByTagName("head")[0].appendChild(link);
      });

      // 2、unload事件 用户从一个页面切换到另外一个 页面  不好举例子。。
      EventUtil.addHandler(window, "unload", function(event){
         alert("Unloaded");
      });

      // 3、resize事件
      EventUtil.addHandler(window, "resize", function(event){
         alert("Resized");
      })

      // 4、scroll事件.  主要针对新旧浏览器 耗性能
      EventUtil.addHandler(window, "scroll", function(event){
         if(document.compatMode == "CSS1Compat"){
            // 新
            alert(document.documentElement.scrollTop)
         }else{
            // 旧
            alert(document.body.scrollTop);
         }
      });
      //焦点事件
      var input = document.getElementById('input');
      //1.blur
      EventUtil.addHandler(input , 'blur' , function (event) {
         alert('元素失去焦点时候触发');
        });

      //2.focus 不支持冒泡
      EventUtil.addHandler(input , 'focus' , function (event) {
         alert('元素获得焦点触发');
        })

      //3.focusin 同focus 支持冒泡  4.focusout 同blur 这俩区别在于浏览器支持上

      // 鼠标事件  down + up = click
      EventUtil.addHandler(document, "mousedown", function(event){
         alert("mousedown");
         console.log(event.button);//等于0的时候 鼠标左键  等于1 鼠标中键 等于2 右键
         //ie8里 等于0 没有按下按钮  等于1 按下主鼠标按钮   等于2 按下次鼠标按钮 ??? 等于3 同时按下主次鼠标按钮 等于4 中间鼠标按钮...
      })
      EventUtil.addHandler(document, "mouseup", function(event){
         alert("mouseup");
      })
      //mouseover 进入目标元素执行 像这种重复触发次数多的 内部代码要简洁
      // mouseout 鼠标离开这个元素
      //mouseenter mouseleave



      EventUtil.addHandler(div, "click", function(event){
         alert("client" + event.clientX);
         alert("client" + event.pageX);
         alert("client" + event.screenX);
      })
      //双击  dbclick
        EventUtil.addHandler(btn, "dbclick", function(event){
            alert("1111");
        })

      // 键盘事件   在文本框内按下键盘
      var textBox = document.getElementById("textBox");
      EventUtil.addHandler(textBox, "keyUp", function(event){
         alert(event.keyCode);
      })
      //keydown 
      // 触摸与手势事件
      function handleTouchEvent(event){
         switch(event.type){
            case "touchstart": 
               alert("touchstart");
               break;
            case "touchmove":
               alert("touchmove");
               break;
            case "touchend":
               alert("touchend");
               break;
         }
      }
      EventUtil.addHandler(document, "touchstart", handleTouchEvent);
      EventUtil.addHandler(document, "touchmove", handleTouchEvent);
      EventUtil.addHandler(document, "touchend", handleTouchEvent);

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值