事件流丶事件對象

一丶js的事件流的概念(重點)

   事件流描述的是從頁面中接收事件的順序

  1.DOM事件流

    (1)事件捕獲階段

    (2)處於目標階段

    (3)事件冒泡階段

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件流</title>
    <script>

    window.onload = function(){

        var oBtn = document.getElementById('btn');

        oBtn.addEventListener('click',function(){
            console.log('btn處於事件捕獲階段');
        }, true);
        oBtn.addEventListener('click',function(){
            console.log('btn處於事件冒泡階段');
        }, false);

        document.addEventListener('click',function(){
            console.log('document處於事件捕獲階段');
        }, true);
        document.addEventListener('click',function(){
            console.log('document處於事件冒泡階段');
        }, false);

        document.documentElement.addEventListener('click',function(){
            console.log('html處於事件捕獲階段');
        }, true);
        document.documentElement.addEventListener('click',function(){
            console.log('html處於事件冒泡階段');
        }, false);

        document.body.addEventListener('click',function(){
            console.log('body處於事件捕獲階段');
        }, true);
        document.body.addEventListener('click',function(){
            console.log('body處於事件冒泡階段');
        }, false);

    };

    </script>
</head>
<body>
    <a href="javascript:;" id="btn">按鈕</a>
</body>
</html>
View Code

  2.addEventListener

  addEventListener是DOM2級事件新增的指定事件處理程序的操做,這個方法接收3個參數:

要處理的事件名丶做爲事件處理程序的函數和一個布爾值.最後這個布爾值參數若是是true,表示在捕獲階段調用事件處理程序:若是是false,表示在冒泡階段調用事件處理程序.

  2.document、documentElement和document.body三者之間的關係:

  document表明的是整個html頁面;

  document.documentElement表明的是<html>標籤;

  document.body表明的是<body>標籤;

  首先在事件捕獲過程當中,document對象首先接收到click事件,而後事件沿着DOM樹依次向下,一直傳播到事件的實際目標,就是id爲btn的a標籤。

  接着在事件冒泡過程當中,事件開始時由最具體的元素(a標籤)接收,而後逐級向上傳播到較爲不具體的節點(document)。

  須要注意的點:因爲老版本的瀏覽器不支持事件捕獲,所以在實際開發中須要使用事件冒泡,在由特殊須要時再使用事件捕獲

  補充知識瞭解便可:

  一、IE中的事件流只支持「事件冒泡」,可是版本到了IE9+之後,實現了「DOM2級事件」,也就是說IE9+之後也能夠在捕獲階段對元素進行相應的操做。

  二、在DOM事件流中,實際的目標在「捕獲階段」不會接收到事件。而是在「處於目標階段」被觸發,並在事件處理中被當作「冒泡階段」的一部分。而後,「冒泡階段」發生,事件又傳播迴文檔。

二丶JQuery的經常使用事件

  1.事件對象

    Event 對象表明事件的狀態,好比事件在其中發生的元素、鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。

    (1)何時會產生Event 對象呢? 

         例如: 當用戶單擊某個元素的時候,咱們給這個元素註冊的事件就會觸發,該事件的本質就是一個函數,而該函數的形參接收一個event對象

         (2)事件一般與函數結合使用,函數不會在事件發生前被執行!

   2.關於event對象

   在觸發的事件的函數裏面咱們會接收到一個event對象,經過該對象咱們須要的一些參數,好比說咱們須要知道此事件做用到誰身上了,就能夠經過event的屬性target來獲取到(IE暫且不談),或者想阻止瀏覽器的默認行爲能夠經過方法preventDefault()來進行阻止.如下是event對象的一些屬性和方法 

  • IE 屬性(除了上面的鼠標/事件屬性,IE 瀏覽器還支持下面的屬性)

 

Event對象的一些兼容性寫法

    • 得到event對象兼容性寫法 

      event || (event = window.event);

    • 得到target兼容型寫法 

      event.target||event.srcElement

    • 阻止瀏覽器默認行爲兼容性寫法 

      event.preventDefault ? event.preventDefault() : (event.returnValue = false);

    • 阻止冒泡寫法 

      event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);

 三丶JQuery的事件綁定和解綁

  1.綁定事件   bind(type,data,fn)

  描述:爲每個匹配元素的特定事件(像click)綁定一個事件處理器函數.

  type(String):事件類型

  data(Object):(可選)  做爲event.data屬性值傳遞給事件對象的額外數據對象

  fn(Function):綁定到每一個匹配元素的事件上面的處理函數

  示例:當每一個p標籤被點擊的時候,彈出其文本

$("p").bind("click", function(){
  alert( $(this).text() );
});

  你能夠在時間處理以前傳遞一些附加的數據

function handler(event) {
//event.data 能夠獲取bind()方法的第二個參數的數據
  alert(event.data.foo);
}
$("p").bind("click", {foo: "bar"}, handler)

   經過返回false來取消默認的行爲並阻止事件起泡.

$("form").bind("submit", function() { return false; })

  經過使用preventDefault()方法只取消默認的行爲

$("form").bind("submit", function(event){
  event.preventDefault();
});

  2.解綁事件   unbind(type,fn);

  描述:bind()的反向操做,從每個匹配的元素中刪除綁定的事件.

   若是沒有參數,則刪除全部綁定的事件。 

  若是把在綁定時傳遞的處理函數做爲第二個參數,則只有這個特定的事件處理函數會被刪除。

  參數解釋:

  type (String) : (可選) 事件類型

  fn(Function) : (可選) 要從每一個匹配元素的事件中反綁定的事件處理函數

  示例:把全部段落的全部事件取消綁定

$("p").unbind()

  將段落的click事件取消綁定

  $("p").unbind( "click" )

  刪除特定函數的綁定,將函數做爲第二個參數傳入

var foo = function () {
  //綁定事件和解綁事件的事件處理函數
};

$("p").bind("click mouseenter", foo); // 給p段落綁定click mouseenter事件

$("p").unbind("click", foo); // 只解綁了p段落標籤的click事件

   3.自定義事件

  其實事件的綁定和解綁,都是我爲了自定義事件作準備(你們把jQuery的提供的事件熟記在心),之後對jquery熟了之後,能夠玩一下自定義事件

  語法:

trigger(type,data);

  描述:在每個匹配的元素上觸發某類事件,它觸發的是由bind()註冊的自定義事件。

  參數解釋:

  type (String) : 要觸發的事件類型

  data (Array) : (可選)傳遞給事件處理函數的附加參數

  示例:給一個按鈕添加自定義的事件

$('button').bind('myClick',function(ev,a,b){
    //給button按鈕添加的自定義事件myClick事件        
})
       

   而後經過trigger()觸發自定義的事件

   4.補充一次性事件

  語法:

one(type,data,fn)

  描述:

  爲每個匹配元素的特定事件(像click)綁定一個一次性的事件處理函數。在每一個對象上,這個事件處理函數只會被執行一次。其餘規則與bind()函數相同

  參數解釋:

  type (String) : 事件類型

  data (Object) : (可選) 做爲event.data屬性值傳遞給事件對象的額外數據對象

  fn (Function) : 綁定到每一個匹配元素的事件上面的處理函數

  示例:當全部段落被第一次點擊的時候,顯示全部其文本。

$("p").one("click", function(){
//只有第一次點擊的時候纔會觸發,再次點擊不會觸發了
  alert( $(this).text() );
});

   5.事件代理

  原理:

    利用冒泡的原理,把事件加到父級上,觸發執行效果。

  做用:

  1.性能要好
  2.針對新建立的元素,直接能夠擁有事件

  事件源 :

    跟this做用同樣(他不用看指向問題,誰操做的就是誰),event對象下的

  使用情景:

    •爲DOM中的不少元素綁定相同事件;
    •爲DOM中尚不存在的元素綁定事件;

  示例:

<body>
        <ul>
            <li class="luffy">路飛</li>
            <li>路飛</li>
            <li>路飛</li>
            
        </ul>
</body>
<script src="jquery-3.2.1.js"></script>
<script type="text/javascript">
$(document).ready(function(){
    
    //經過on()方法
     $('ul').on('click','#namei,.luffy',function(){
        console.log(this);
       })
            
   //將來追加的元素 
    $('ul').append('<a id="namei">娜美</a>')

}
</script>

  語法:

on(type,selector,data,fn);

  描述:在選定的元素上綁定一個或多個事件處理函數

  參數解釋

  events( String) : 一個或多個空格分隔的事件類型

  selector( String) : 一個選擇器字符串,用於過濾出被選中的元素中能觸發事件的後代元素
  data: 當一個事件被觸發時,要傳遞給事件處理函數的 event.data
  fn:回調函數

 例子:無縫輪播實現(比較考驗邏輯思惟)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        *{
            padding: 0;
            margin: 0;
        }
        ul{
            list-style: none;
        }
        .slider-list{

            width: 580px;
            overflow: hidden;
            margin: 100px auto;
            position: relative;
        }
        .slider-list .slider-wrapper{
            height: 470px;
        }
        .slider-wrapper ul{
            height: 100%;

            position: relative;

        }
        .slider-wrapper ul li{
            float: left;
            width: 590px;
            height: 470px;

        }
        .slider-wrapper ul li a{
            display: block;
            width: 100%;
            height: 100%;
        }
         .focus-img{
            width: 590px;
            height: 470px;
        }
        button{
            position: absolute;
            width: 24px;
            height: 40px;
            top: 50%;
            line-height: 40px;
            text-align: center;
            background-color: rgba(0,0,0,.2);
            color: white;
            font-size: 30px;
            border: 0;
            outline: none;
            cursor: pointer;
            z-index: 99;
        }
        button.next{
            right: 0;
        }
        button.prev{
            left: 0;
        }
        .slider-index{
            position: absolute;
            bottom: 10px;
            left:250px;
            z-index: 2;

        }
        .slider-index span{
            display: inline-block;
            width: 10px;
            height: 10px;
            border: 2px solid red;
            border-radius: 50%;
        }
        .slider-index span.active{
            background-color: orange;
        }

    </style>
</head>
<body>
    <div class="slider-list">
        <div class="slider-wrapper">
            <ul>
                
            </ul>
        </div>
        <button class="next">></button>
        <button class="prev"><</button>
        <div class="slider-index">
            <span class="active"></span>
            <span></span>
            <span></span>
            <span></span>
            <span></span>    
        </div>
    </div>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script type="text/javascript">
        
        $(function(){
            // 1.獲取本地圖片數據 590*470
            var imgArr = ['./5.jpg','./1.jpg','./2.jpg','./3.jpg','./4.jpg','./5.jpg','./1.jpg'];

            // 獲取圖片的寬度
            var imgWidth = 590;
            var len = $('span').length;

            // 2.遍歷數據 將圖片添加到ul中
            for(let i = 0;i < imgArr.length;i++){
                let width = i*imgWidth;
                $(`<li>
                    <a href="javascript:;">
                        <img src=${imgArr[i]} alt=${i}>
                    </a>
                </li>`).appendTo('.slider-wrapper ul').addClass('slider-item')    

            }
            

            // 設置圖片的類名
            $('img').addClass('focus-img');
            // 設置父盒子的總寬度
            $('.slider-wrapper').width((imgArr.length+1)*imgWidth);
            $('.slider-wrapper ul').width((imgArr.length+1)*imgWidth);


            // 初始化 
            // 默認顯示第一張圖片
            init();
            function init(){
                 $("ul").css("left",-imgWidth);
            }

            
            // 下一張
            $('button.next').click(function(event) {
                
                next();
            });

            // 控制圖片顯示第幾張
            var count  = 1;
            function next(){

                if (count ==len+1) {
                    count  = 2;
                    $("ul").css("left",-imgWidth);
                }else{
                    count++;
                }
                $('.slider-wrapper ul').stop().animate({left:-count*imgWidth},200);

                
                // 控制輪播圖索引改變顏色
                if (count>len) {
                    $("span").eq(0).addClass("active").siblings("span").removeClass("active");
                }else{

                 $("span").eq(count-1).addClass("active").siblings("span").removeClass("active");
                }
                
            }

            // 給小圓圈添加點擊事件

            $('span').click(function(){
                  //本身的樣式
                            $(this).addClass("active").siblings("span").removeClass("active");
                             count = $(this).index()+1;
                            $("ul").animate({"left":-count*imgWidth},200);
            })

            setInterval(next,2000);
            

        })
    </script>
</body>
</html>
View Code

 四丶JQuery的ajax

  AJAX = 異步的javascript和XML(Asynchronous Javascript and XML)

  簡言之,在不重載整個網頁的狀況下,AJAX經過後臺加載數據,並在網頁上進行顯示。

  經過 jQuery AJAX 方法,您可以使用 HTTP Get 和 HTTP Post 從遠程服務器上請求文本、HTML、XML 或 JSON - 同時您可以把這些外部數據直接載入網頁的被選元素中。

   1.JQuery的load()方法

  jQuery load()方法是簡單但強大的AJAX方法。

  load()方法從服務器加載數據,並把返回的數據放入被選元素中。

  ps:該方法使用很少,瞭解便可

  語法:

$("selector").load(url,data,callback);

  第一種狀況

$('#btn').click(function(){

    //只傳一個url,表示在id爲#new-projects的元素里加載index.html
    $('#new-projects').load('./index.html');
})

  第二種狀況

$('#btn').click(function(){
    //只傳一個url,導入的index.html文件含有多個傳遞參數,相似於:index/html?name='張三'
    $('#new-projects').load('./index.html',{"name":'張三',"age":12});
})

  第三種狀況

//加載文件以後,會有個回調函數,表示加載成功的函數
    $('#new-projects').load('./index.html',{"name":'張三',"age":12},function(){

});

   2.JQuery的getJSON方法

  jQuery的AJAX中使用getJSON()方法異步加載JSON格式數據。獲取服務器中的數據,並對數據進行解析,顯示到頁面中

  語法: 

$.getJSON(url,[data],[callback])

  參數解釋:

  url參數:爲請求加載json格式文件的服務器地址
  可選項data參數:爲請求時發送的數據
  callback參數:爲數據請求成功後執行的函數

複製代碼
  $.getJSON("./data/getJSON.json", function (data) {
       var str = "";//初始化保存內容變量
       $.each(data, function(index,ele) {
          $('ul').append("<li>"+ele.name+"</li>")

          });
       })
複製代碼

   3.JQuery的$.get()方法

  $.get() 方法經過 HTTP GET 請求從服務器上請求數據

  語法:

$.get(URL,callback);

  url參數:規定你請求的路徑,是必需參數
  callback參數:爲數據請求成功後執行的函數

$.get('./data/getJSON.json',function(data,status){
    console.log(status);   //success    200狀態碼 ok的意思              
})

   4.JQuery的post()方法

  與get()方法相比,post()方法多用於以POST方式向服務器發送數據,服務器接收到數據以後,進行處理,並將處理結果返回頁面

  語法:

$.post(URL,data,callback);

  url參數:規定你請求的路徑,是必需參數,可選的data參數是連同請求發送的數據
  可選的callback參數:爲數據請求成功後執行的函數

 $.post('/index',{name:'張三'},function(data,status){
      console.log(status);

 })

   JQuery的$.ajax()方法

  query的$.ajax()方法 是作ajax技術常用的一個方法。   它的參數不少,總會有一些初學者記不住,在這裏,演示幾個常用的參數。後面講django課程部分會詳細講ajax技術的原理。你們先把每一個參數作個筆記。

  參數以下: 

1.url: 要求爲String類型的參數,(默認爲當前頁地址)發送請求的地址。

2.type: 要求爲String類型的參數,請求方式(post或get)默認爲get。注意其餘http請求方法,例如put和delete也可使用,但僅部分瀏覽器支持。

3.timeout: 要求爲Number類型的參數,設置請求超時時間(毫秒)。此設置將覆蓋$.ajaxSetup()方法的全局設置。

4.async: 要求爲Boolean類型的參數,默認設置爲true,全部請求均爲異步請求。若是須要發送同步請求,請將此選項設置爲false。注意,同步請求將鎖住瀏覽器,用戶其餘操做必須等待請求完成才能夠執行。

5.cache: 要求爲Boolean類型的參數,默認爲true(當dataType爲script時,默認爲false),設置爲false將不會從瀏覽器緩存中加載請求信息。

6.data: 要求爲Object或String類型的參數,發送到服務器的數據。若是已經不是字符串,將自動轉換爲字符串格式。get請求中將附加在url後。防止這種自動轉換,能夠查看  processData選項。對象必須爲key/value格式,例如{foo1:"bar1",foo2:"bar2"}轉換爲&foo1=bar1&foo2=bar2。若是是數組,JQuery將自動爲不一樣值對應同一個名稱。例如{foo:["bar1","bar2"]}轉換爲&foo=bar1&foo=bar2。

7.dataType: 要求爲String類型的參數,預期服務器返回的數據類型。若是不指定,JQuery將自動根據http包mime信息返回responseXML或responseText,並做爲回調函數參數傳遞。可用的類型以下:

 

  xml:返回XML文檔,可用JQuery處理。

  html:返回純文本HTML信息;包含的script標籤會在插入DOM時執行。

  script:返回純文本JavaScript代碼。不會自動緩存結果。除非設置了cache參數。注意在遠程請求時(不在同一個域下),全部post請求都將轉爲get請求。

  json:返回JSON數據。

    jsonp:JSONP格式。使用SONP形式調用函數時,例如myurl?callback=?,JQuery將自動替換後一個「?」爲正確的函數名,以執行回調函數。

  text:返回純文本字符串。

8.beforeSend: 要求爲Function類型的參數,發送請求前能夠修改XMLHttpRequest對象的函數,例如添加自定義HTTP頭。在beforeSend中若是返回false能夠取消本次ajax請求。XMLHttpRequest對象是唯一的參數。 function(XMLHttpRequest){ this; //調用本次ajax請求時傳遞的options參數 } 9.complete:

要求爲Function類型的參數,請求完成後調用的回調函數(請求成功或失敗時均調用)。參數:XMLHttpRequest對象和一個描述成功請求類型的字符串。 function(XMLHttpRequest, textStatus){ this; //調用本次ajax請求時傳遞的options參數 }

10.success:

  要求爲Function類型的參數,請求成功後調用的回調函數,有兩個參數。

  (1)由服務器返回,並根據dataType參數進行處理後的數據。

  (2)描述狀態的字符串。 function(data, textStatus){ //data多是xmlDoc、jsonObj、html、text等等 

11.error: 要求爲Function類型的參數,請求失敗時被調用的函數。該函數有3個參數,即XMLHttpRequest對象、錯誤信息、捕獲的錯誤對象(可選)。ajax事件函數以下: function(XMLHttpRequest, textStatus, errorThrown){ //一般狀況下textStatus和errorThrown只有其中一個包含信息 this; //調用本次ajax請求時傳遞的options參數 }

12.contentType: 要求爲String類型的參數,當發送信息至服務器時,內容編碼類型默認爲"application/x-www-form-urlencoded"。該默認值適合大多數應用場合。

13.dataFilter: 要求爲Function類型的參數,給Ajax返回的原始數據進行預處理的函數。提供data和type兩個參數。data是Ajax返回的原始數據,type是調用jQuery.ajax時提供的dataType參數。函數返回的值將由jQuery進一步處理。 function(data, type){ //返回處理後的數據 return data; }

14.dataFilter: 要求爲Function類型的參數,給Ajax返回的原始數據進行預處理的函數。提供data和type兩個參數。data是Ajax返回的原始數據,type是調用jQuery.ajax時提供的dataType參數。函數返回的值將由jQuery進一步處理。 function(data, type){ //返回處理後的數據 return data; }

15.global: 要求爲Boolean類型的參數,默認爲true。表示是否觸發全局ajax事件。設置爲false將不會觸發全局ajax事件,ajaxStart或ajaxStop可用於控制各類ajax事件。

16.ifModified: 要求爲Boolean類型的參數,默認爲false。僅在服務器數據改變時獲取新數據。服務器數據改變判斷的依據是Last-Modified頭信息。默認值是false,即忽略頭信息。

17.jsonp: 要求爲String類型的參數,在一個jsonp請求中重寫回調函數的名字。該值用來替代在"callback=?"這種GET或POST請求中URL參數裏的"callback"部分,例如{jsonp:'onJsonPLoad'}會致使將"onJsonPLoad=?"傳給服務器。

18.username: 要求爲String類型的參數,用於響應HTTP訪問認證請求的用戶名。

19.password: 要求爲String類型的參數,用於響應HTTP訪問認證請求的密碼。

20.processData: 要求爲Boolean類型的參數,默認爲true。默認狀況下,發送的數據將被轉換爲對象(從技術角度來說並不是字符串)以配合默認內容類型"application/x-www-form-urlencoded"。若是要發送DOM樹信息或者其餘不但願轉換的信息,請設置爲false。

21.scriptCharset: 要求爲String類型的參數,只有當請求時dataType爲"jsonp"或者"script",而且type是GET時纔會用於強制修改字符集(charset)。一般在本地和遠程的內容編碼不一樣時使用
View Code

  get方式

//get()方式
  $.ajax({
     url:'./data/index.txt',
     type:'get',
     dataType:'text',
     success:function(data){
        $('p').html(data);

     },
     error:function(error){
        console.log(error)
     }

  post方式

//post()方式
$.ajax({
   url:'/index',
   type:'post',
   data:{name:'張三',age:12},
   success:function(data){
      $('p').html(data);
   },
   error:function(error){
      console.log(error)
}

注意:以上全部操做,請在服務器上運行此代碼,若是沒有服務器,能夠在本地搭建本地服務器。

相關文章
相關標籤/搜索