JQuery 事件

1.click與dbclick事件

$("ele").click()  //手動指定觸發事件 
方法二:$ele.click( handler(eventObject) )

<div id="test">點擊觸發<div>
$("#text").click(function() {
    //this指向 div元素
});
方法三:$ele.click( [eventData ], handler(eventObject) )

<div id="test">點擊觸發<div>
$("#text").click(11111,function(e) {
    //this指向 div元素
    //e.date  => 11111 傳遞數據
});
注意:在同一元素上同時綁定 click 和 dblclick 事件是不可取的。


2.mousedown與mouseup事件

方法同上

mousedown事件觸發需要以下幾點:

mousedown強調是按下觸發

如果在一個元素按住了鼠標不放,並且拖動鼠標離開這個元素,並釋放鼠標鍵,這仍然是算作mousedown事件

任何鼠標按鈕被按下時都能觸發mousedown事件

用event 對象的which區別按鍵,敲擊鼠標左鍵which的值是1,敲擊鼠標中鍵which的值是2,敲擊鼠標右鍵which的值是3

click事件其實是由mousedown於mouseup 2個動作構成,所以點擊的動作只有在鬆手後才觸發

$("button:eq(0)").mousedown(function(e) {
        alert('e.which: ' + e.which)
    })
3.mousemove事件

方法同1

mousemove事件是當鼠標指針移動時觸發的,即使是一個像素
如果處理器做任何重大的處理,或者如果該事件存在多個處理函數,這可能造成瀏覽器的嚴重的性能問題

 $(".aaron1").mousemove(function(e) {
        $(this).find('p:last').html('移動的X位置:' + e.pageX)
    })
4.mouseover與mouseout事件

方法同1

</pre><pre name="code" class="html">var n = 0;
$(".aaron1 p:first").mouseover(function(e) {
            $(".aaron1 a").html('進入元素內部,mouseover事件觸發次數:' + (++n))
        })
var n = 0;
        //不同函數傳遞數據
        function data(e) {
            $(".right a").html('mouseover事件觸發次數:' + (++n) + '<br/> 傳入數據爲 :'+ e.data)
        }

        function a() {
            $(".right p:first").mouseover('data = 慕課網', data)
        }
        a();
5.mouseenter與mouseleave事件

mouseenter事件和mouseover的區別

關鍵點就是:冒泡的方式處理問題

mouseover爲例:

<div class="aaron2">
    <p>鼠標離開此區域觸發mouseleave事件</p>
</div>
如果在p元素與div元素都綁定mouseover事件,鼠標在離開p元素,但是沒有離開div元素的時候,觸發的結果:
p元素響應事件
div元素響應事件
這裏的問題是div爲什麼會被觸發? 原因就是事件冒泡的問題,p元素觸發了mouseover,他會一直往上找父元素上的mouseover事件,如果有全觸發了
mouseenter事件只會在綁定它的元素上被調用,而不會在後代節點上被觸發

所以在這種情況下面,jQuery推薦我們使用 mouseenter事件

6.hover事件

$(selector).hover(handlerIn, handlerOut)

handlerIn(eventObject):當鼠標指針進入元素時觸發執行的事件函數
handlerOut(eventObject):當鼠標指針離開元素時觸發執行的事件函數
7.focusin事件

元素或者其內部任何一個元素獲得焦點的時候觸發

方法同1

8.focusout事件

當一個元素,或者其內部任何一個元素失去焦點的時候觸發

方法同1

9.blur與focus事件

focus()在元素本身產生,focusin()在元素包含的元素中產生

blur與focusout也亦是如此

10.change事件

input元素

</pre><p>監聽value值的變化,當有改變時,<span style="color:#ff0000;">失去焦點後</span>觸發change事件</p><p> select元素</p><p>對於下拉選擇框,複選框和單選按鈕,當用戶用鼠標作出選擇,該事件立即觸發</p><p> textarea元素</p><p>多行文本輸入框,當用戶用鼠標點擊時,該事件立即觸發</p><p><strong>11.select事件</strong></p><p>當 textarea 或文本類型的 input 元素中的文本被選擇時,會發生 select 事件。</p><p>方法同1</p><pre name="code" class="javascript"> $('textarea').select(function(e) {
        alert(e.target.value);
    });
12.submit事件
有時候開發者需要在表單提交的時候過濾一些的數據、做一些必要的操作(例如:驗證表單輸入的正確性,如果錯誤就阻止提交,從新輸入)此時可以通過submit事件,監聽下提交表單的這個動作

能觸發submit事件的行爲:

<input type="submit">

<input type="image">

<button type="submit">

當某些表單元素獲取焦點時,敲擊Enter(回車鍵)

特別注意:

form元素是有默認提交表單的行爲,如果通過submit處理的話,需要禁止瀏覽器的這個默認行爲

傳統的方式是調用事件對象  e.preventDefault() 來處理, jQuery中可以直接在函數中最後結尾return false即可

jQuery處理如下:

$("#target").submit(function(data) { 
   return false; //阻止默認行爲,提交表單
});
 $('#target1').submit(function(e) {
        alert('捕獲提交表達動作,不阻止頁面跳轉')
    });
    //回車鍵或者點擊提交表單,禁止瀏覽器默認跳轉:
    $('#target2').submit(function() {
        alert('捕獲提交表達動作,阻止頁面跳轉')
        return false;
    });
13.keydown()與keyup()事件

keydown事件:

當用戶在一個元素上第一次按下鍵盤上字母鍵的時候,就會觸發它

方法:

//直接綁定事件
$elem.keydown( handler(eventObject) )
//傳遞參數
$elem.keydown( [eventData ], handler(eventObject) )
//手動觸發已綁定的事件
$elem.keydown()

keyup事件:

當用戶在一個元素上第一次鬆手鍵盤上的鍵的時候,就會觸發它。使用方法與keydown是一致的

理論上它可以綁定到任何元素,但keydown/keyup事件只是發送到具有焦點的元素上,不同的瀏覽器中,可獲得焦點的元素略有不同,但是表單元素總是能獲取焦點,所以對於此事件類型表單元素是最合適的。

$('.target1').keydown(function(e) {
        $("em:first").text(e.target.value)
    });
    $('.target2').keyup(function(e) {
        $("em:last").text(e.target.value)
    });
注意:keydown事件觸發在文字還沒敲進文本框,這時如果在keydown事件中輸出文本框中的文本,得到的是觸發鍵盤事件前的文本,而keyup事件觸發時整個鍵盤事件的操作已經完成,獲得的是觸發鍵盤事件後的文本

14.keypress()事件

keypress 事件與 keydown 事件類似。當按鈕被按下時,會發生該事件。它發生在當前獲得焦點的元素上。

keypress事件與keydown和keyup的主要區別

keypress:
對中文輸入法支持不好,無法響應中文輸入
無法響應系統功能鍵(如delete,backspace)

keydown與keypress區別

雖然從字面理解, KeyDown是按下一個鍵的意思, 但實際上二者的根本區別是, 系統由KeyDown返回鍵盤的代碼, 然後由TranslateMessage函數翻譯成成字符, 由KeyPress返回字符值. 因此在KeyDown中返回的是鍵盤的代碼, 而KeyPress返回的是ASCII字符. 所以根據你的目的, 如果只想讀取字符, 用KeyPress, 如果想讀各鍵的狀態, 用KeyDown. 

總之,KeyPress主要用來接收字母、數字等ANSI字符,而 KeyDown 和 KeyUP 事件過程可以處理任何不被 KeyPress 識別的擊鍵。諸如:功能鍵(F1-F12)、編輯鍵、定位鍵以及任何這些鍵和鍵盤換檔鍵的組合等。

15.on()的多事件綁定

官方推薦的綁定事件的一個方法。

基本用法:.on( events [, selector ] [, data ] )

$("#elem").click(function(){})  //快捷方式
$("#elem").on('click',function(){}) //on方式

多個事件綁定同一個函數

 $("#elem").on("mouseover mouseout",function(){ });

多個事件綁定不同函數

$("#elem").on({
    mouseover:function(){},  
    mouseout:function(){},
});
將數據傳遞到處理程序
function greet( event ) {
  alert( "Hello " + event.data.name ); //Hello 慕課網
}
$( "button" ).on( "click", {
  name: "慕課網"
}, greet );
可以通過第二參數(對象),當一個事件被觸發時,要傳遞給事件處理函數的

委託機制

.on( events [, selector ] [, data ], handler(eventObject) )
<div class="left">
    <p class="aaron">
        <a>目標節點</a> //點擊在這個元素上
    </p>
</div>
$("div").on("click","p",fn)
事件綁定在最上層div元素上,當用戶觸發在a元素上,事件將往上冒泡,一直會冒泡在div元素上。如果提供了第二參數,那麼事件在往上冒泡的過程中遇到了選擇器匹配的元素,將會觸發事件回調函數
16.卸載事件off()方法

通過off() 方法移除綁定的事件

$("elem").off("mousedown mouseup")
銷燬全部事件:

$("elem").off()

17.jQuery事件對象

事件對象是用來記錄一些事件發生時的相關信息的對象。事件對象只有事件發生時纔會產生,並且只能是事件處理函數內部訪問,在所有事件處理函數運行結束後,事件對象就被銷燬

event.target代表當前觸發事件的元素,可以通過當前元素對象的一系列屬性來判斷是不是我們想要的元素

<ul>
                <li>點擊:觸發一</li>
                <li>點擊:觸發二</li>
                <li>點擊:觸發三</li>
                <li>點擊:觸發四</li>
            </ul>
<script type="text/javascript">
        //多事件綁定一
        $("ul").on('click',function(e){
           alert('觸發的元素是內容是: ' + e.target.textContent)
        })
    </script>

jQuery事件對象的屬性和方法

event.type:獲取事件的類型

觸發元素的事件類型

event.pageX 和 event.pageY:獲取鼠標當前相對於頁面的座標

鼠標相對於文檔的左邊緣的位置(左邊)與 (頂邊)的距離,簡單來說是從頁面左上角開始,即是以頁面爲參考點,不隨滑動條移動而變化

event.preventDefault() 方法:阻止默認行爲

這個用的特別多,在執行這個方法後,如果點擊一個鏈接(a標籤),瀏覽器不會跳轉到新的 URL 去了。我們可以用 event.isDefaultPrevented() 來確定這個方法是否(在那個事件對象上)被調用過了

event.stopPropagation() 方法:阻止事件冒泡

事件是可以冒泡的,爲防止事件冒泡到DOM樹上,也就是不觸發的任何前輩元素上的事件處理函數

event.which:獲取在鼠標單擊時,單擊的是鼠標的哪個鍵

event.which 將 event.keyCode 和 event.charCode 標準化了。event.which也將正常化的按鈕按下(mousedown 和 mouseupevents),左鍵報告1,中間鍵報告2,右鍵報告3

event.currentTarget : 在事件冒泡過程中的當前DOM元素

冒泡前的當前觸發事件的DOM對象, 等同於this.

this和event.target的區別:

js中事件是會冒泡的,所以this是可以變化的,但event.target不會變化,它永遠是直接接受事件的目標DOM元素;

.this和event.target都是dom對象

如果要使用jquey中的方法可以將他們轉換,爲jquery對象:$(this)和$(event.target);比如:event.target和$(event.target)的使用:

<body>
    <h3>事件對象的屬性與方法</h3>
    <div class="left">
        <div id="content">
            外層div元素
            <br />
            <span style="background: silver;">內層span元素</span>
            <br /> 外層div元素
        </div>
        <br />
        <div id="msg"></div>
    </div>
    <script type="text/javascript">
    //爲 <span> 元素綁定 click 事件  
    $("span").click(function() {
        $("#msg").html($("#msg").html() + "<p>內層span元素被單擊</p>");
    });
    //爲 Id 爲 content 的 <div> 元素綁定 click 事件  
    $("#content").click(function(event) {
        $("#msg").html($("#msg").html() + "<p>外層div元素被單擊</p>");
        event.stopPropagation(); //阻止事件冒泡  
    });
    //爲 <body> 元素綁定 click 事件  
    $("body").click(function() {
        $("#msg").html($("#msg").html() + "<p>body元素被單擊</p>");
    });
    </script>
</body>

18.trigger事件

trigger方法來觸發瀏覽器事件

trigger事件會在DOM樹上冒泡

$('#elem').on('Aaron', function(event,arg1,arg2) {
    alert("自觸自定義時間")
 });
$('#elem').trigger('Aaron',['參數1','參數2'])
<body>
    <h2>自定義事件trigger</h2>
    <div class="left">
        <div><span></span><span>0</span>點擊次數</div>
        <button>直接點擊</button>
        <button>通過自定義點擊</button>
    </div>
    <script type="text/javascript">

    //點擊更新次數
    $("button:first").click(function(event,bottonName) {
        bottonName = bottonName || 'first';
        update($("span:first"),$("span:last"),bottonName);
    });

    //通過自定義事件調用,更新次數
    $("button:last").click(function() {
        $("button:first").trigger('click','last');
    });

    function update(first,last,bottonName) {
        first.text(bottonName);
        var n = parseInt(last.text(), 10);
        last.text(n + 1);
    }
    </script>
</body>

19.triggerHandler事件

若要觸發通過 jQuery 綁定的事件處理函數,而不觸發原生的事件,使用.triggerHandler() 來代替

儘管 .trigger() 模擬事件對象,但是它並沒有完美的複製自然發生的事件

triggerHandler與trigger的用法是一樣的,重點看不同之處:

triggerHandler不會觸發瀏覽器的默認行爲,.triggerHandler( "submit" )將不會調用表單上的.submit()

.trigger() 會影響所有與 jQuery 對象相匹配的元素,而 .triggerHandler() 僅影響第一個匹配到的元素

使用 .triggerHandler() 觸發的事件,並不會在 DOM 樹中向上冒泡。 如果它們不是由目標元素直接觸發的,那麼它就不會進行任何處理

與普通的方法返回 jQuery 對象(這樣就能夠使用鏈式用法)相反,.triggerHandler() 返回最後一個處理的事件的返回值。如果沒有觸發任何事件,會返回 undefined

 

<body>
    <h2>自定義事件triggerHandler</h2>
    <div class="left">
        <div>
            <input type="text" value="" />
        </div>
        <button>trigger聚焦觸發瀏覽器事件</button>
        <button>triggerHandler聚焦沒有觸發瀏覽器事件</button>
    </div>
    <script type="text/javascript">

    //給input綁定一個聚焦事件
    $("input").on("focus",function(event,titie) {
        $(this).val('聚焦')
    });


    //trigger觸發focus
    $("button:first").click(function() {
        $("input").trigger("focus",['觸發默認事件']);
    });

     //triggerHandler觸發focus
    $("button:last").click(function() {
        $("input").triggerHandler("focus",'沒有觸發默認事件');
    });



    </script>
</body>








發佈了18 篇原創文章 · 獲贊 13 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章