1. 程式人生 > >jQuery學習筆記之事件

jQuery學習筆記之事件

事件物件
    target  這個反應觸發事件的DOM物件,可以在事件冒泡的時候判斷是否是事件源頭(compare event.target to this)獲取繫結事件的DOM元素(觸發元素),你點了那個就是那個
    currentTarget:冒泡前的當前觸發事件的DOM物件,獲取監聽元素的DOM,你繫結那個就是那個,等同於this
    relatedTarget:對於滑鼠事件, 標示觸發事件時離開或者進入的DOM元素
    pageX:  滑鼠的left屬性,相對於page
    pageY:  滑鼠的top屬性,相對於page//獲取相對於頁面原點的水平垂直座標
    screenX/Y:對於滑鼠事件, 獲取事件相對於螢幕原點的水平/垂直座標
    clientX/Y 獲取相對於頁面視口的水平垂直座標
    Data:  如果事件中還有EventData你就可以用這個屬性獲得對應Eventdata資料了。獲取事件呼叫時的額外資料。四種格式:數字 字串 陣列 物件。
    eg:$('input').bind('click',[1,2,2,3],function(ev){alert(ev.data);})
    ctrlKey: 型別: Boolean, 說明: Ctrl 鍵是否按下
    shiftKey: 型別: Boolean, 說明: Shift鍵是否按下
    altKey: 型別: Boolean, 說明: Alt 鍵是否按下
    charCode: 型別: Number, 說明: 最後響應鍵盤按鍵的 charCode 值
    keyCode: 型別: Number, 說明: 最後響應鍵盤按鍵的 keyCode 值
     //DOM標準下
          keyCode:表示按下按鍵的數字程式碼。
          charCode:按下按鍵的Unicode字元。
    button: 型別: Number, 說明: IE下按下的滑鼠鍵, 左鍵:1, 右鍵:2, 中鍵:4 其它按下的滑鼠鍵, 左鍵:0, 右鍵:2, 中鍵:1
    which: 型別: Number, 說明: 最後響應的是哪個按鍵, 如果是鍵盤按鍵則等於 charCode ; 如果是滑鼠按鍵, 左鍵:1, 右鍵:3, 中鍵2
    type : 事件型別
    result: 上一個事件處理函式返回的值
    timeStamp 獲取事件觸發的時間戳,是一串字串,比較好儲存和比較


冒泡行為
    如果在頁面中重疊了多個元素,並且重疊的這些元素都綁定了同一個事件,那麼就會出現冒泡問題。
    解決方法:
    stop.Propagation();將這方法設定到需要觸發的事件上時,其上層的冒泡行為都將被取消。
    * stopPropagation():讓Jquery停止事件冒泡
預設行為(比如右鍵出現系統選單,點選超連結跳轉頁面)
    阻止預設行為的方法
    * preventDefault():  這個方法被呼叫,則原有事件就被忽略。(例如 clicked link就不會去新的Url了)比如禁止表單提交,禁止超連結跳轉
    eg:$('form').sunmit(function(ev){ev.preventDefault();});
    eg:$('a').click(function(ev){return false;})//既阻止冒泡又阻止預設


    isDefaultPrevented() 判斷是否呼叫了preventDefault()方法
    isPropagationStopped() 判斷是否呼叫了stopPropagation()方法
    stopimmediatePropagation() 取消事件冒泡,並取消該事件的後續事件處理函式
    isstopimmediatePropagationStopped() 判斷是否呼叫了stopimmediatePropagation() 函式


基礎事件


繫結事件
    通過.bind(type,[data],fn)或物件的鍵值來進行,其中data方法已經被刪除
    eg:$(function(){
    //$('input').bind('click',function(){alert('點選!')})
    //$('input').bind('click',fn);
    function fn(){alert('點選!')};
    //$('input').bind({
    'mouseout':function(){alert('移入');},
    'mouseover':function(){alert('移出');}
    })
    })
刪除事件
    $('input').unbind();刪除全部事件
    $('input').unbind('click');只刪除click事件
    $('input').unbind('click',fn2);刪除click事件繫結fn2的
簡寫事件
    click(fn) dblclick(fn)雙擊。。。
    unload(fn)頁面解除安裝除了Ie一般不支援,需要特殊處理 一般用於清理工作
    resize(fn)視窗大小改變時發生
    select(fn)文字選定
    change(fn)文字改變
    表單提交用form,比如$('form').submit(fn)
    keydown和keypress
    keydown:使用者在鍵盤上按下某按鍵是發生。一直按著某按鍵則會不斷觸發(opera瀏覽器除外)。
    keypress:使用者按下一個按鍵,併產生一個字元時發生(也就是不管類似shift、alt、ctrl之類的鍵,就是說使用者按了一個能在螢幕上輸出字元的按鍵keypress事件才會觸發)。一直按


著某按鍵則會不斷觸發。


    mouseover mouseout會觸發子節點
    mouseenter mouseleave不會觸發子節點,作用與mouseover mouseout一樣


    focus()游標移入時啟用
    blur()游標丟失時啟用
    focus blur必須當前元素才能啟用,不會觸發子節點
    focusin focusout可以是子元素啟用,也就是會觸發子節點
    當一個元素,或者其內部任何一個元素獲得焦點的時候會觸發這個事件。這跟focus事件區別在於,他可以在父元素上檢測子元素獲取焦點的情況。


    複合事件
    ready(fn)當DOM載入完畢觸發事件
    hover(fn1,fn2)當滑鼠移入觸發第一個fn1,移出觸發fn2//結合mouseenter和mouseleave
    //toggle(fn1,fn2[,fn3..]) 當滑鼠點選觸發fn1,再點選觸發fn2。。。不過這種方式已經廢棄,不必深究,若要使用,可以引入外掛jquery-migrate-1.2.1.js來使用
    eg:
    var flag=1;
    $('div').click(function(){
    if(flag==1)
    {$(this).css(....);flag=2;}
    }else if(flagg==2){$(this).css(....);flag=3;}elseif(flagg==3){$(this).css(....);flag=1;}});




高階事件


模擬操作
    在事件觸發的時候,有時我們需要一些模擬使用者行為的操作,例如當網頁載入完畢的時候自行點選一個按鈕觸發一個事件,而不是使用者去點選
    $('input').click(function (ev,data1,data2,data3,data4) {
                    alert(data1+'|'+data2+'|'+data3+'|'+data4.user);
                }).trigger('click',['123','abc',['a','b','c'],{user:'YST'}]);
            })//trigger額外資料一個數據可以不帶【】,兩個了以上必須帶,這裡data3為陣列,data4為物件


    $('input').bind('click',{user:'YST'},function (ev,data1,data2,data3,data4) {
        alert(data1+'|'+data2+'|'+data3+'|'+data4.user+'|'+ev.data.user);
    }).trigger('click',['123','abc',['a','b','c'],{user:'YST'}]);
})//trigger額外資料一個數據可以不帶【】,兩個了以上必須帶,這裡data3為陣列,data4為物件


    自定義事件,就是自己起名字的事件,所謂自定義時間就是一個唄bind()繫結的任意函式,比如上面的例子,這裡trigger()方法提供了一個簡寫的方法,直接在呼叫一個空的同名事件即可
    eg:$('input').click(function(){alert('YST');}).click();
    在jquery裡幾乎所有的常用事件都提供了這個方法。


    triggerHandler()方法與trigger()的區別是
    1、不會觸發事件的預設行為
    2、只會影響第一個匹配到的元素,不會冒泡
    3、會返回當前事件執行的返回值,如果沒有返回值,則返回undifined(),而trigger()方法會返回當前包含事件觸發元素的jQuery物件(方便鏈式連綴呼叫)


    名稱空間
    $('input').bind('click.abc',function(){alert('abc');});
    $('input').bind('click.def',function(){alert('def');});
    $('input').unbind('.abc');//這樣可以移出相同名稱空間的不同事件,對於模擬操作用法一樣。


    事件委託


    什麼是事件委託:舉例理解:有1000個學生同事在某天上午收到郵件,但是這個1000個同學不能同時去郵局取,那麼就會委託某個人取統一收取,然後再逐個交給學生。在jQuery中,我們通過事件冒泡的特性,讓子元素繫結的事件冒泡到父元素或祖先元素上,然後再進行相關處理。
    之前版本用live() delegate()後來用on()統一代替bind() live() delegate()
    取消委託之前用die() undelegate() 後來用off()統一代替 unbind() die() undelegate()
    live() die()[jquery1.4.3之後被摒棄]不支援連綴呼叫 delegate() undelegate()[jquery1.7之前,但依然存在]支援連綴呼叫但是後來被整合替代了
    bind()是事件複製行為不是事件委託
    事件委託eg:$('#box').on('click','.button',function(){$(this).clone().appendTo('#box');};)
    $('#box').off('click','.button')
    on off的其餘用法與bind unbind類似,以後幾乎就用on()和off()


    one()方法,繫結元素執行完畢後自動移除,可以僅觸發一次的事件
    $('.button').one('click',function(){alert('one 僅觸發一次');})
    這裡類似於.delegate()