javaScript中的事件

<!DOCTYPE html>
<html οnclick="alert('冒泡test4')">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>dom事件流模型測試(IE)</title>
</head>
<script>
    window.addEventListener("冒泡click",function(){
        alert("test5");
    });
    /*
    //按下鍵後會一直執行
    window.addEventListener("keydown",function(e){
        console.log("======"+e.keyCode);
    });

    */
        window.addEventListener("keypress",function(e){
            console.log(e.type+"======"+e.keyCode+"--"+e.charCode);
            var div=document.getElementById("fj");
            //style屬性可以獲得html標籤的樣式,但是不能獲取非行間樣式,獲取行間樣式。
            //moz:getComputedStyle(div,false)[attr]
            //IE: currentStyle[attr]
            //
            var top=div.style.top,
                cTop=div.currentStyle?parseInt(div.currentStyle["top"]):parseInt(getComputedStyle(div,true)["top"]),
                cLeft=div.currentStyle?parseInt(div.currentStyle["left"]):parseInt(getComputedStyle(div,true)["left"]),
                v= 1,
                left=div.style.left;
            switch(e.charCode){
                case 119://W 上
                   if(div.currentStyle){
                       div.style.top=(parseInt(div.currentStyle["top"])-v)+"px";
                   }else{
                       div.style.top=(parseInt(getComputedStyle(div,false)["top"])-v)+"px";
                   }
                   console.log(top+"---------sss------------"+cTop);

                  // top= (cTop- v) + "px";
                    break;
                case 115://s 下
                    if(div.currentStyle){
                        div.style.top=(parseInt(div.currentStyle["top"])+v)+"px";
                    }else{
                        div.style.top=(parseInt(getComputedStyle(div,false)["top"])+v)+"px";
                    }
                    break;
                case 97://A左
                    if(div.currentStyle){
                        div.style.left=(parseInt(div.currentStyle["left"])-v)+"px";
                    }else{
                        div.style.left=(parseInt(getComputedStyle(div,false)["left"])-v)+"px";
                    }
                    break;
                case 100://D 右
                    if(div.currentStyle){
                        div.style.left=(parseInt(div.currentStyle["left"])+v)+"px";
                    }else{
                        div.style.left=(parseInt(getComputedStyle(div,false)["left"])+v)+"px";
                    }
                    break;
            }
        });


        window.addEventListener("keyup",function(e){ //釋放按鍵時一直觸發
            console.log(e.type+"======"+e.keyCode);
            var div=document.getElementById("fj");
            var zd=document.createElement("div");
            zd.style.background="#FF0000";
            zd.style.width="5px";
            zd.style.height="5px";
            zd.style.position="absolute";
            var content=document.getElementById("content");
            if(e.keyCode==76){//L
                if(div.currentStyle){
                    zd.style.left=(parseInt(div.currentStyle["left"])+10)+"px";
                    zd.style.top=(parseInt(div.currentStyle["top"])-20)+"px";
                }else{
                    zd.style.top=(parseInt(getComputedStyle(div,false)["top"])-20)+"px";
                    zd.style.left=(parseInt(getComputedStyle(div,false)["left"])+10)+"px";
                }
                console.log(zd.style.top+"||"+zd.style.left);

                content.appendChild(zd);
                setInterval(function(){
                    if(parseInt(getComputedStyle(zd,false)["top"])==0){
                        clearInterval();
                       //content.removeChild();
                    }else{
                        zd.style.top=(parseInt(getComputedStyle(zd,false)["top"])-2)+"px";
                    }
                },100)
            }

        });
    /**
     * Dom事件流標準包含:事件冒泡和事件捕獲
     * 事件流:不僅一個甚至多個元素響應同一事件。
     * 事件冒泡:<源於IE>
     *      最特定的事件目標(DOM:text)----->最不特定的目標(IE4:document,DOM:window)順序觸發;
     * 事件捕獲:<源於Mozille>
     *      最不精確的(Mozille:window,DOM:window)----------->最精確的目標(DOM:text)順序觸發;
     *      (不會講很多的元素暴露給事件)
     * 事件冒泡模型:
     *
     *                                  test5(window)------|
     *                                  ^                  |
     *                                  |                  |
     *   冒泡                       test4(html<document>) <-|         捕獲
     *                              ^       |
     *                              |       |
     *                        test3(body)<--|
     *                        ^             |
     *                        |             |
     *                   test2(parent_div)<-|
     *                   ^                  |
     *                   |                  |
     *(點擊test的div) test(div)   <---------|
     *
     *  --------------
     *  事件註冊方法:|
     *  -------------
     *  1 html 默認的是冒泡
     *  2 js
     *     DOM:
     *     ----註冊事件-----
     *     參數: evnetName:string 事件名
     *           fn:function 事件處理回調函數,參數event對象
     *           useCapture:boolean false:不用捕獲用冒泡 ,true :用捕獲不用冒泡
     *     ele.addEventListener(eventName,fn,useCapture);
     *     ----移除事件-----
     *     參數:同註冊事件
     *     ele.removeEventListener(eventName,fn,useCapture)
     *
     *     IE:
     *     ----註冊事件----- (只有冒泡)
     *     參數: evnetName:string 事件名
     *           fnHandler:function 事件處理回調函數,參數event對象
     *     ele.attachEvent(eventName,fnHandler);
     *     ----移除事件-----
     *     參數:同註冊事件
     *     ele.detachEvent(eventName,fnHandler)
     *     //一個元素一個事件綁定多個處理函數順序執行
     *
     *     //阻止事件冒泡的方法:
     *
     *    ----------
     *    事件對象 -|
     *    ----------
     *   事件對象:捕獲事件的信息。
     *   包含信息:
     *   1--引起事件的對象
     *   2--事件發生時鼠標的信息
     *   3--事件發生時鍵盤的信息
     *   時空(生命期和作用域):
     *   1--創建,只能在事件發生時創建
     *   2--銷燬,事件處理函數執行完畢後銷燬
     *   3--作用域,只有事件處理函數才能訪問
     *   IE和DOM事件對象的異同:
     *   相同點:
     *   1 獲取事件類型:oEvent.type
     *   2 獲取按鍵代碼(keydown/keyup):oEvent.keyCode
     *      keyCode總包含代表按下按鍵的一個代碼,他可能是一個字符,也可能不是。
     *   3 檢測shift、alt、ctrl鍵:
     *          檢測是否被按下:boolean
     *          oEvent.shiftKey;
     *          oEvent.altKey;
     *          oEvent.ctrlKey;
     *   4 獲取客戶端座標:
     *         在鼠標事件中,可用clientX和clientY屬性獲取鼠標指針在客戶端區域的位置。
     *         oEvent.clientX;
     *         oEvent.clientY;
     *   5 獲取屏幕座標:
     *        鼠標事件中,可以用screenX和clientY屬性獲取鼠標指針在計算機屏幕中的位置。
     *        oEvent.screenX;
     *        oEvent.clientY;
     *   不同點:
     *   1 獲取目標 :
     *       IE:oEvent.srcElement;
     *       DOM:oEvent.target;
     *   2 獲取字符代碼 :
     *       IE:oEvent.keyCode;//返回字符代碼的Unicode值
     *       DOM: oEvent.keyCode;//獲取實際的字符
     *            String.fromChatCode(oEvent.charCode);//獲取實際的字符
     *       如果不確定是否包含字符:
     *             if(oEvent.isChar){//判斷
     *
     *             }
     *   3 阻止某個事件的默認行爲 :
     *          IE:oEvent.returnValue=false;     I
     *          Mozilla:oEvent.preventDefault();
     *          eg.1 右鍵阻止使用上下文菜單:
     *              document.body.οncοntextmenu=function(){
     *                  if(isIE){
     *                     oEvent=window.event;
      *                    oEvent.returnValue=false;
     *                  }else{
     *                     oEvent.preventDefault();
     *                  }
     *              }
     *   4 停止事件複製(冒泡):
     *       阻止事件進一步冒泡
     *       IE:oEvent.cancelBubble=true;
     *       moz:oEvent.stopPropagation();I
     *
     *  ----------
     *  事件類型  |
     *  ----------
     *  鼠標事件:
     *   事件:
     *   click
     *   dbclick
     *   mouseDown
     *   mouseout
     *   mouseover
     *   mouseup
     *   mousemove
     *   屬性:
     *   座標屬性-
     *   type屬性-
     *   target(DOM)或srcElement(IE)屬性-
     *   shiftkey、ctrlkey、aletKey和metaKey(DOM)屬性
     *   button屬性(只有在mousedown / mouseover/mouseout/mouseove/mouseup)
     *   事件順序:
     *   mousedown-->mouseup-->click-->mousedown-->mouseup-->click-->dbclick
     *  鍵盤事件:
     *    事件:
     *    keydown :按下某鍵時發生。一直按着,就會不斷觸發
     *    keypress:按下某鍵,並上升一個字符時發生(也不管類似shift的鍵)。
     *              一直按會持續發生。
     *    keyup:釋放按鍵時發生。
     *    屬性:
     *    keyCode屬性-
     *    charCode屬性(僅DOM)-
     *    target(DOM)或者srcElement(IE)屬性-
     *    shiftKy ctrlKey altKey metaKey(DOM)屬性-
     *    順序:
     *    keydown->keypress->keyup
     *    //如果用戶按一次某非字符按鍵(例如 shift)
     *    keydown->keyup
     *    //如果按着字符鍵且不放,keydown和keypress事件將諸葛持續觸發,知道鬆開。
     *  Html事件:
     *    load:頁面完全加載後,在window對象上觸發。所有的框架都載入後,
     *          在框架集上觸發;<img/>完全載入後觸發;<object/>元素,
     *          當其完全載入後在其上觸發。
     *    unload:完全卸載後觸發。
     *    abort:用戶停止下載過程時,如果<object/>對象還未完全載入,就在其上觸發。
     *    error:js腳本出錯時,在window對象上觸發;<img/>無法載入觸發,
     *          <object/>元素無法載入,框架集中一個或多個無法載入時觸發。
     *    select:
     *          用戶選擇了文本框中的一個或多個字符時觸發(<input>/<textarea>)
     *    change:
     *       <input/>或<textarea/>失去焦點時並且獲取焦點後內容發生改變
     *       時觸發。<select/>元素的值發生改變時觸發。
     *    submit :<input type='submit'/>點擊時,在<from/>上觸發。
     *    reset :<input type='reset'/>
     *    resize: 窗口或者框架的大小發生改變時觸發。
     *    scroll:用戶在任何帶滾動條的元素上捲動它時觸發。<body/>元素
     *          包含載入頁面的滾動條。
     *    focus: 任何元素或者窗口本身獲取焦點時(用戶點擊它、Tab鍵切換到
     *          它或者任何其他與它交互的手段)觸發。
     *    blur:任何元素或者窗口本身失去焦點時
     *  突變事件(DOM標準的一部分,但是目前沒有主流瀏覽器實現):
     *
     */
</script>
<body οnclick="alert('冒泡test3')">
    <div οnclick="alert('冒泡test2')">
       <div οnclick="alert('冒泡test');">冒泡test</div>
    </div>
    <div id="test1">
    <div id="test">捕獲test</div>
    </div>
    <script>
        document.getElementById("test").addEventListener("click",function(e){
            alert("捕獲test");
        },true);
        document.getElementById("test").addEventListener("click",function(e){
            alert("冒泡test");
        },false);
        document.getElementById("test1").addEventListener("click",function(e){
            alert("捕獲test1");
        },true);
    </script>
    <div style="width:200px;height:200px;border: 2px #ff0000 solid" id="content">
          <div id="fj" style="position: absolute;top:200px;left:90px;background:#1dc116;height: 20px;width: 20px; ">
          </div>
    </div>

</body>
</html>


例子:

http://www.oschina.net/question/54100_25614




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章