zoukankan      html  css  js  c++  java
  • 事件

    ## 事件驱动三要素:  ##
              1 事件  2 事件源  3 事件处理程序


       

    #   1  #DOM 0级事件绑定: 
                              脚本直接绑定
                                            button.onclick =function(){};

                              HTML元素中绑定
                                            <input type="button" id="button1" onclick="alert(1)" value="提交"/>
           
    # 2 # DOM 2级事件绑定:
                             针对IE obj.attachEvent("on事件","处理程序");添加事件
                                    obj.detachEvent("on事件","处理程序");删除事件

                             针对FF/CHROM obj.addEventListener("事件","处理程序",boolean);添加事件
                                          obj.removeEventListener("事件","处理程序",boolean);删除事件

    # 针对兼容性问题方法1: #
                function aa(obj,a,b){
                if(obj.attachEvent){
                    return obj.attachEvent("on"+a,b);
                }else if(obj.addEventListener){
                    return obj.addEventListener(a,b);
                }
            }
            function bb(obj,a,b){
                if(obj.detachEvent){
                    return obj.detachEvent("on"+a,b);
                }else if(obj.removeEventListener){
                    return obj.removeEventListener(a,b);
                }
            }
    # 针对兼容性问题方法2(使用创建对象的方法): #
            var Event={
                add:function(obj,a,b){
                    if(obj.attachEvent){
                        return obj.attachEvent("on"+a,b);
                    }else if(obj.addEventListener){
                        return obj.addEventListener(a,b);
                    }else{
                        obj["on"+a]=b;
                    }
                },
                remove:function(obj,a,b){
                    if(obj.detachEvent){
                        return obj.detachEvent("on"+a,b);
                    }else if(obj.removeEventListener){
                        return obj.removeEventListener(a,b);
                    }else{
                        obj["on"+a]=null;
                    }
                }

            };
            Event.add(button,"click",a);
            Event.add(button,"click",b);
            Event.remove(button,"click",a);

    # 3  事件对象(用来表示当前事件,只在事件发生的过程中才有效,对象的属性和方法包含了当前事件的状态。)        
                   var ev = e || window.event;
    # 4  #事件对象属性:
    ## 鼠标事件:   
                                        相对于浏览器位置 clientX:当鼠标事件发生时,鼠标相对于浏览器X轴的位置
                                                        clientY:当鼠标事件发生时,鼠标相对于浏览器Y轴的位置

                                         相对于屏幕位置   screenX:当鼠标事件发生时,鼠标相对于屏幕X轴的位置
                                                        screenY:当鼠标事件发生时,鼠标相对于屏幕Y轴的位置

                                         相对于事件源位置
                                                        针对W3C:
                                                         layerX:当鼠标事件发生时,鼠标相对于事件源X轴的位置
                                                         layerY:当鼠标事件发生时,鼠标相对于事件源Y轴的位置

                                                         针对IE/CHROM:
                                                         offsetX:当鼠标事件发生时,鼠标相对于事件源X轴的位置
                                                         offsetY:当鼠标事件发生时,鼠标相对于事件源Y轴的位置


    ## 解决  layerX 与 offsetX 的兼容问题
                        var div = document.getElementById("div");
                        var yuanyi={
                        yuanX:function(obj){
                            if(obj.layerX){
                                return obj.layerX;
                            }else if(obj.offsetX){
                                return obj.offsetX;
                            }
                        },
                        yuanY:function(obj){
                            if(obj.layerX){
                                return obj.layerY;
                            }else if(obj.offsetX){
                                return obj.offsetY;
                            }
                        }
            
                    };
            
                    document.onmousemove=function(e){
                        var ev = e || window.event;
                        div.innerHTML = ev.clientX + " "+ev.clientY+"<br/>"+ev.screenX + " "+
                        ev.screenY+"<br/>"+yuanyi.yuanX(ev) + " "+yuanyi.yuanY(ev);
            
                    };
    ## 示例 ##
               //当鼠标按下时
              div.onmousedown = function(e){
                var ev = e || window.event;
                var ox = yuanyi.yuanX(ev);
                //var ox = ev.offsetX;
                var oy = yuanyi.yuanY(ev);
                //var oy = ev.offsetY;

                //当鼠标移动时
                this.onmousemove=function(e){
                    var ev = e || window.event;
                this.style.marginTop = ev.clientY - oy +"px";
                this.style.marginLeft = ev.clientX - ox +"px";
                };

                //当鼠标抬起时
                this.onmouseup = function(){
                    this.onmousemove = null;
                }
            };
    ##键盘事件:   
                                        keyCode 获得键盘码
                                        altKey/ctrlKey/shiftKey 判断是否按,如果按了,由true,否则false
                                        type 输出事件名称
    ## 示例: 留言板提交内容功能

           var div = document.getElementById("div");
            var textarea = document.getElementById("textarea");

            textarea.onkeydown=function(e){
                var ev = e || window.event;
                if(ev.ctrlKey && ev.type == "keydown" && ev.keyCode == "13"){
                    //div.innerHTML = textarea.value;
                    var jia = document.createElement("p");
                    jia.innerHTML = textarea.value;
                    div.appendChild(jia);
                    textarea.value = "";
                    textarea.focus();
                }
            };

    //取得浏览器的型号
            function myBrowser() {
                var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
                var isOpera = userAgent.indexOf("Opera") > -1;
                //判断是否Opera浏览器
                if(isOpera) {
                    return "Opera";
                }
                //判断是否Firefox浏览器
                if(userAgent.indexOf("Firefox") > -1) {
                    return "FF";
                }
                if (userAgent.indexOf("Chrome") > -1) {
                    return "Chrome";
                }
                if (userAgent.indexOf("Safari") > -1) {
                    return "Safari";
                }
                if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) {
                    return "IE";
                }
            }

    ## 滚轮事件: 
                  滚轮事件: DOMMouseScroll (FF)  onmousewheel(chrom/IE)
                  判断 滚轮向上还是向下  wheelDelta/detail

    ## 示例: 使图片放大或缩小


           
            var picture = document.getElementById("picture");
            if(myBrowser() == "ff"){
                picture.addEventListener("DOMMouseScroll",fun,false);
            }else{
                picture.onmousewheel=fun;
            }
            function fun(){
                var num = detail ||wheelDelta ;
                if(num>0){
                    picture.style.width = picture.offsetWidth*1.2+"px";
                }else{
                    picture.style.width = picture.offsetWidth*0.8+"px";

                }
            }
     
     
    事件流: 当页面元素触发事件的时候,该元素容器以及整个页面都会按照特定顺序响应元素触发事件,事件传播的顺序叫做事件流.
     
    IE:冒泡事件:从点击的地方从内向外执行(由明确的事件源到最不确定事件源泉依次向上触发)
    W3C:捕获事件:从外到点击的地方开始执行(使用addEventListener添加事件时boolean值为true则为捕获,否则为冒泡)
    注:当有冒泡事件和捕获事件时,捕获事件先发生.
     
    阻止事件流:阻止事件流往外传播.
           IE(冒泡):ev.cancdBubble = true;
           W3C(捕获):ev.strpPropagation();
    补充:
    var ev=e || window.event;(用来表示当前事件,只在事件(比如onclick)发生的过程中才有效,对象的属性和方法包含了当前事件的状态。)
    var obj = ev.taget(W3C) || ev.srcElement(IE)触发事件的DOM节点,就是谁触发的这个事件。

    ##事件委托实例  表格修改

    <!DOCTYPE html>
    <html>
    <head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
    *{
    margin: 0;
    padding: 0;
    }

    input{
    border: 0;
    text-align: center;
    }
    td{
    30px;
    height: 20px;
    }
    </style>
    <script>
    window.onload=function(){
    var tr=document.getElementById("tr1");

    tr.onclick=function(e){
    var ev=e||window.event;
    var obj=ev.target||ev.srcElement;
    if(obj.nodeName=="TH"){
    return;
    }
    if(obj.nodeName=="TD"){
    var old=obj.innerHTML;
    var input=document.createElement("input");
    input.type="text";
    obj.innerHTML="";
    obj.appendChild(input);
    input.focus();
    input.onblur=input.ondblclick=input.onkeydown=function(e){
    var ev=e||window.event;
    if(ev.type == "blur" || ev.type == "dblclick" || (ev.type == "keydown" && ev.keyCode == "13")){
    var s;
    if(input.value.trim()==""){
    s=old;
    }
    else{
    s=input.value;
    }
    obj.removeChild(input);
    obj.innerHTML=s;


    }


    };


    }



    }


    }
    </script>
    </head>
    <body>
    <table id="tr1" border="1" style="text-align: center" cellspacing="0">
    <tr>
    <th> 姓名</th>
    <th> 年龄</th>
    <th>科目</th>
    <th>成绩</th>
    <th>性别</th>
    </tr>
    <tr >
    <td >张三</td>
    <td>20</td>
    <td>js</td>
    <td>80</td>
    <td>男</td>
    </tr>
    </table>
    </body>
    </html>
  • 相关阅读:
    Asp.Net 构架(Http Handler 介绍) Part.2<转>
    大数据插入<转>
    网站开发技巧参考大全<转>
    qq校友好东西
    SQL2005存储过程解密 <转>
    用Lucene.net对数据库建立索引及搜索<转>
    用SharpDevelop3调试ASP.NET的方法
    【转】卢彦的利用xml实现通用web报表打印
    张仰彪第二排序法 <转>
    依赖注入那些事儿 <转>
  • 原文地址:https://www.cnblogs.com/alicezq/p/4805838.html
Copyright © 2011-2022 走看看