1. 程式人生 > >js事件高階應用01(事件繫結 、高階拖拽)

js事件高階應用01(事件繫結 、高階拖拽)

  • 事件繫結
  •         IE方式
  •               attachEvent(事件名稱、函式),繫結事件處理函式
  •               detachEvent(事件名稱、函式),解除繫結
  •        DOM方式
  •                addEventListener(事件名稱,函式,捕獲)
  •                removeEventListener(事件名稱,函式,捕獲)

            attachEvent是用來繫結事件的。如果我在一個元素的同一事件上去加兩次,會相互覆蓋。而繫結就不會出現這種問題。可以同時加好幾個函式在同一個事件上。

Internet Explorer 從 5.0 開始提供了一個 attachEvent 方法,使用這個方法,就可以給一個事件指派多個處理過程了。attachEvent 對於目前的 Opera 也適用。但是問題是 Mozilla/Firefox 並不支援這個方法。但是它支援另一個 addEventListener 方法,這個方法跟 attachEvent 差不多,也是用來給一個事件指派多個處理過程的。但是它們指派的事件有些區別,在 attachEvent 方法中,事件是以 “on” 開頭的,而在 addEventListener 中,事件沒有開頭的 “on”,另外 addEventListener 還有第三個引數,一般這個引數指定為 false 就可以了。

相容性問題:attachEvent(IE)    addEventListener(火狐)

<script>
        window.onload=function(){
            var oBtn=document.getElementById('btn');
            //attachEvent(事件名,函式)
            oBtn.addEventListener('click',function(){
                alert('a');
            },false);
            oBtn.addEventListener('click',function(){
                alert('b');
            },false);
            /*oBtn.onclick=function(){
                alert('a');
            }
            oBtn.onclick=function(){
                alert('b');
            }*/
        }
    </script>
</head>
<body>
<input type="button" id="btn" value="點選按鈕"/>
</body>

處理相容性問題:

    
    <script>
        /*window.onload=function(){
            var oBtn=document.getElementById('btn');
            //先出現b再出現a.IE9以下的瀏覽器執行順序和你繫結的執行順序相反,
            if(oBtn.attachEvent){
                oBtn.attachEvent('onclick',function(){
                    alert('a');
                });
                oBtn.attachEvent('onclick',function(){
                    alert('b');
                });
            }else{
                oBtn.addEventListener('click',function(){
                    alert('a');
                },false);
                oBtn.addEventListener('click',function(){
                    alert('b');
                },false);
            }
        }*/
        function myAddEvent(obj,ev,fn){
            if(obj.attachEvent){
                obj.attachEvent('on'+ev,fn);
            }else{
                obj.addEventListener(ev,fn,false);
            }
        }
        window.onload=function(){
            var oBtn=document.getElementById('btn');
            myAddEvent(oBtn,'click',function(){
                alert('a');
            });
            myAddEvent(oBtn,'click',function(){
                alert('b');
            });
        }

    </script>
  • 高階拖拽
  •     複習拖拽原理:距離不變      三個事件:down、move、up
  •     限制範圍:1.對位置判斷 (例子1,不能拖出視窗的Div.  例子2,不能拖出指定物件的Div)
  •                       2.磁性吸附
//例子2,不能拖出指定物件的Div.
<style>
        #div1{
            width: 100px;
            height: 100px;
            background: red;
            position: absolute;
        }
        #div2{
            width: 700px;
            height: 500px;
            background: #cccccc;
            position: relative;
        }
    </style>

    <script>
        //滑鼠按下 滑鼠擡起 滑鼠移動
        window.onload=function(){

            var oDiv=document.getElementById('div1');
            var oDiv2=document.getElementById('div2');
            var disX=0;
            var disY=0;
            oDiv.onmousedown=function(ev){
                var oEvent=ev||event;

                disX=oEvent.clientX-oDiv.offsetLeft;
                disY=oEvent.clientY-oDiv.offsetTop;

                //滑鼠移動
                document.onmousemove=function(ev){
                    var oEvent=ev||event;
                    var l=oEvent.clientX-disX;
                    var t=oEvent.clientY-disY;

                    if(l<0){
                        l=0;
                    }else if(l>oDiv2.offsetWidth-oDiv.offsetWidth){
                        l=oDiv2.offsetWidth-oDiv.offsetWidth;
                    }
                    if(t<0){
                        t=0;
                    }else if(t>oDiv2.offsetHeight-oDiv.offsetHeight){
                        t=oDiv2.offsetHeight-oDiv.offsetHeight;
                    }

                    oDiv.style.left=l+'px';
                    oDiv.style.top=t+'px';

                }
                //滑鼠擡起不動
                document.onmouseup=function(){
                    document.onmousemove=null;
                    document.onmouseup=null;
                }
            };
            return false;//火狐下,空div會有bug.加上false則無。
        }
    </script>
</head>
<body>
<div id="div2">
    <div id="div1"></div>
</div>
</body>
//吸附
                    if(l<50){
                        l=0;
                    }else if(l>oDiv2.offsetWidth-oDiv.offsetWidth){
                        l=oDiv2.offsetWidth-oDiv.offsetWidth;
                    }
                    if(t<50){
                        t=0;
                    }else if(t>oDiv2.offsetHeight-oDiv.offsetHeight){
                        t=oDiv2.offsetHeight-oDiv.offsetHeight;
                    }
  • 圖片拖拽    阻止預設事件
  • 文字選中    阻止預設事件    IE下拖動有問題(事件捕獲)
  • 與DOM配合(帶框拖拽、保留原有位置的拖拽)

當在拖拽的時候,我們不會選中頁面中的其他文字。

  • 事件捕獲:setCapture()只在IE可用。
return false;//可以解決chrome、ff、IE9下的問題,但是解決不了IE7以下的問題

 所以我們要製作一個適用於IE的。

//沒加事件捕獲之前只有點選按鈕才能彈出a。加上事件捕獲之後,隨便點選一個地方都能彈出a.
<script>
        window.onload=function(){
            var oBtn=document.getElementById('btn1');
            oBtn.onclick=function(){
                alert('a');
            }
            oBtn.setCapture();//事件捕獲。作用:把事件都集中到一個按鈕身上。
        }
    </script>
</head>
<body>
<input type="button" id="btn1" value="按鈕"/>
</body>

 加了事件捕獲,oDiv.setCapture();整個網頁裡面所有的事件都會聚集到一個div身上。

<style>
        #div1{
            width: 100px;
            height: 100px;
            background: red;
            position: absolute;
        }

    </style>
    <script>
        //滑鼠按下 滑鼠擡起 滑鼠移動
        window.onload=function(){

            var oDiv=document.getElementById('div1');
            var disX=0;
            var disY=0;
            oDiv.onmousedown=function(ev){
                var oEvent=ev||event;

                disX=oEvent.clientX-oDiv.offsetLeft;
                disY=oEvent.clientY-oDiv.offsetTop;

                //滑鼠移動  之前我們是document.onmousemove
                oDiv.onmousemove=function(ev){
                    var oEvent=ev||event;
                    var l=oEvent.clientX-disX;
                    var t=oEvent.clientY-disY;

                    oDiv.style.left=l+'px';
                    oDiv.style.top=t+'px';

                }
                //滑鼠擡起不動.之前我們是document.onmouseup
                //換成document的原因是div太小,拖拽太快,容易滑鼠與div脫離。
                oDiv.onmouseup=function(){
                    oDiv.onmousemove=null;
                    oDiv.onmouseup=null;
                }
                oDiv.setCapture();//無論拖拽的多快,div都不會跟不上滑鼠
                return false;
            };

        }
    </script>
</head>
<body>
djsakfgjaukdhwuq
    <div id="div1">dwfewfewfwefwefefwef</div>
wdsfregtehrshtefeagregr
</body>

我加了setCapture()之後,文字就得不到事件了。所以在要文字得到事件的時候,取消捕獲。

 <script>
        //滑鼠按下 滑鼠擡起 滑鼠移動
        window.onload=function(){

            var oDiv=document.getElementById('div1');
            var disX=0;
            var disY=0;
            oDiv.onmousedown=function(ev){
                var oEvent=ev||event;

                disX=oEvent.clientX-oDiv.offsetLeft;
                disY=oEvent.clientY-oDiv.offsetTop;
                function mouseMove(ev){
                    var oEvent=ev||event;
                    var l=oEvent.clientX-disX;
                    var t=oEvent.clientY-disY;
                    oDiv.style.left=l+'px';
                    oDiv.style.top=t+'px';
                }
                function mouseUp(){
                    this.onmousemove=null;
                    this.onmouseup=null;
                    if(oDiv.releaseCapture){
                        oDiv.releaseCapture();//在滑鼠擡起的時候,釋放掉捕獲。
                    }
                }

                if(oDiv.setCapture){
                    //IE
                    oDiv.onmousemove=mouseMove;
                    oDiv.onmouseup=mouseUp;
                    oDiv.setCapture();
                }else{
                    //chrome
                    document.onmousemove=mouseMove;
                    document.onmouseup=mouseUp;
                }
                return false;//可以解決chrome、ff、IE9下的問題,但是解決不了IE7以下的問題
            };

        }
    </script>
 <script>
        //滑鼠按下 滑鼠擡起 滑鼠移動
        window.onload=function(){

            var oDiv=document.getElementById('div1');
            var disX=0;
            var disY=0;
            oDiv.onmousedown=function(ev){
                var oEvent=ev||event;

                disX=oEvent.clientX-oDiv.offsetLeft;
                disY=oEvent.clientY-oDiv.offsetTop;
                function mouseMove(ev){
                    var oEvent=ev||event;
                    var l=oEvent.clientX-disX;
                    var t=oEvent.clientY-disY;
                    oDiv.style.left=l+'px';
                    oDiv.style.top=t+'px';
                }
                function mouseUp(){
                    this.onmousemove=null;
                    this.onmouseup=null;
                    if(oDiv.releaseCapture){
                        oDiv.releaseCapture();//在滑鼠擡起的時候,釋放掉捕獲。
                    }
                }

                if(oDiv.setCapture){
                    //IE
                    oDiv.onmousemove=mouseMove;
                    oDiv.onmouseup=mouseUp;
                    oDiv.setCapture();
                }else{
                    //chrome
                    document.onmousemove=mouseMove;
                    document.onmouseup=mouseUp;
                }
                return false;//可以解決chrome、ff、IE9下的問題
            };

        }
    </script>