1. 程式人生 > 實用技巧 >jQuery的事件機制和其他知識

jQuery的事件機制和其他知識

jQuery 設定寬度和高度

寬度操作:

	$(selector).height();     //不帶引數表示獲取高度
	$(selector).height(200);  //帶引數表示設定高度

寬度操作:

	$(selector).width();     //不帶引數表示獲取寬度
	$(selector).width(200);  //帶引數表示設定高寬度

問題:jQuery的css()獲取高度,和jQuery的height獲取高度,二者的區別?

答案:

	$("div").css();     //返回的是string型別,例如:30px

	$("div").height();  //返回得失number型別,例如:30。常用於數學計算。

如上方程式碼所示,$("div").height();返回的是number型別,常用於數學計算。

#jQuery 的座標操作

#offset()方法

	$(selector).offset();
	$(selector).offset({left:100, top: 150});

作用:獲取或設定元素相對於 document 文件的位置。引數解釋:

  • 無引數:表示獲取。返回值為:{left:num, top:num}。返回值是相對於document的位置。

  • 有引數:表示設定。引數建議使用 number 數值型別。

注意:設定offset後,如果元素沒有定位(預設值:static),則被修改為relative。

#position()方法

	$(selector).position();

作用:獲取相對於其最近的帶有定位的父元素的位置。返回值為物件:{left:num, top:num}

注意:只能獲取,不能設定。

#scrollTop()方法

	scrollTop();
	$(selector).scrollTop(100);

作用:獲取或者設定元素被捲去的頭部的距離。引數解釋:

  • 無引數:表示獲取偏移。

  • 有引數:表示設定偏移,引數為數值型別。

#scrollLeft()方法

	scrollLeft();
	$(selector).scrollLeft(100);

作用:獲取或者設定元素水平方向滾動的位置。引數解釋:

  • 無引數:表示獲取偏移。

  • 有引數:表示設定偏移,引數為數值型別。

程式碼示範:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        body {
            height: 5000px;
        }

        .box1 {
            width: 300px;
            height: 300px;
            position: relative;
            margin: 10px;
            overflow: auto;
            background-color: pink;
        }

        .box2 {
            width: 200px;
            height: 400px;
            position: absolute;
            top: 50px;
            left: 50px;
            background-color: yellow;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {
            //距離頁面最頂端或者最左側的距離和有沒有定位沒有關係
            $("button").eq(0).click(function () {
                alert($(".box2").offset().top);
            })

            //距離頁面最頂端或者最左側的距離和有沒有定位沒有關係
            $("button").eq(1).click(function () {
                $(".box2").offset({"left": 1000, "top": 1000});
            })

            //距離父系盒子中帶有定位的盒子的距離(獲取的就是定位值,和margin/padding無關)
            $("button").eq(2).click(function () {
                alert($(".box2").position().top);
            })

            //距離父系盒子中帶有定位的盒子的距離(獲取的就是定位值,和margin/padding無關)
            $("button").eq(3).click(function () {
                $(".box2").position().top = "100px";
            })

            //獲取被選取的頭部
            $("button").eq(4).click(function () {
                alert($(window).scrollTop());
            })

            //獲取被選取的頭部
            $("button").eq(5).click(function () {
                $(window).scrollTop(100);
            })

        })
    </script>

</head>
<body>


<div class="box1">
    <div class="box2"></div>
</div>

<button>offset().top獲取</button>
<button>offset().top設定</button>
<button>position().top獲取</button>
<button>position().top設定</button>
<button>scrollTop()</button>
<button>scrollTop()</button>

</body>
</html>

#jQuery的事件機制

#常見的事件繫結

  • click(handler) 單擊事件。

  • blur(handler) 失去焦點事件。

  • mouseenter(handler) 滑鼠進入事件。

  • mouseleave(handler) 滑鼠離開事件。

  • dbclick(handler) 雙擊事件。

  • change(handler) 改變事件,如:文字框值改變,下拉列表值改變等。

  • focus(handler) 獲得焦點事件。

  • keydown(handler) 鍵盤按下事件。

參考連結:http://www.w3school.com.cn/jquery/jquery_ref_events.asp

#on方式繫結事件

最早採用的是 bind、delegate等方式繫結的。jQuery 1.7版本後,jQuery用on統一了所有的事件處理的方法,此方法相容zepto(移動端類似於jQuery的一個庫)。

格式舉例:

        $(document).on("click mouseenter", ".box", {"name": 111}, function (event) {
            console.log(event.data);      //event.data獲取的就是第三個引數這個json。
            console.log(event.data.name); //event.data.name獲取的是name的值。
        });

引數解釋:

  • 第一個引數:events,繫結事件的名稱可以是由空格分隔的多個事件(標準事件或者自定義事件)。上方程式碼繫結的是單擊事件和滑鼠進入事件。

  • 第二個引數:selector, 執行事件的後代元素。

  • 第三個引數:data,傳遞給事件處理函式的資料,事件觸發的時候通過event.data來使用(也就是說,可以通過event拿到data)

  • 第四個引數:handler,事件處理函式。

簡單點的寫法:

    $(document).on("click",".box", function () {
       alert(1);
    });

#off方式解綁事件

    $(selector).off();      // 解綁匹配元素的所有事件

    $(selector).off("click");   // 解綁匹配元素的所有click事件

    $(selector).off( "click", "**" );   // 解綁所有代理的click事件,元素本身的事件不會被解綁

#jQuery的事件物件

event.data 傳遞給事件處理程式的額外資料

event.currentTarget 等同於this,當前DOM物件

event.pageX 滑鼠相對於文件左部邊緣的位置

event.target 觸發事件源,不一定===this

event.stopPropagation(); 阻止事件冒泡

event.preventDefault(); 阻止預設行為

event.type 事件型別:click,dbclick…

event.which 滑鼠的按鍵型別:左1 中2 右3

event.keyCode 鍵盤按鍵程式碼

程式碼演示:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {
            $(document).on("click", {}, function (event) {
                console.log(event.data);
                console.log(event.currentTarget);
                console.log(event.target);
                console.log(event.pageX);
                console.log(event.type);
                console.log(event.which);
                console.log(event.keyCode);
            });
        })
    </script>
</head>
<body>

</body>
</html>

上方程式碼中,我們通過event引數,獲取了點選事件的各種event裡的屬性。

單擊網頁後,列印結果為:

舉例:鍵盤上對的按鍵按下時,變色

這個時候就要用到event引數,因為要獲取event.keyCode,才能知道按下的是鍵盤上的哪個按鍵。

程式碼實現:

<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .wrap {
            width: 400px;
            height: 400px;
            margin: 100px auto 0;
        }

        .wrap h1 {
            text-align: center;
        }

        .wrap div {
            width: 400px;
            height: 300px;
            background: pink;
            font-size: 30px;
            text-align: center;
            line-height: 300px;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {
            //需求:在頁面上,按鍵.是哪個顏色的首寫字母div就改變為該顏色,然後span內容賦值。
            //步驟:
            //1.給document繫結keyup事件
            //2.獲取值,根據此值,給div和span上色和內容

            var div = $("#bgChange");
            var span = $("#keyCodeSpan");

            //繫結事件
            $(document).keyup(function (e) {  //鍵盤彈出時,觸發事件
                //呼叫方法
                setColor(e.keyCode);
            });


            function setColor(keyCode) {
                //alert(e.keyCode);
                //2.獲取值,根據此值,給div和span上色和內容
                switch (keyCode) {
                    case 80:
                        //修改內容pink
                        setEle("pink", keyCode);
                        break;
                    case 66:
                        //修改內容blue
                        setEle("blue", keyCode);
                        break;
                    case 79:
                        //修改內容orange
                        setEle("orange", keyCode);
                        break;
                    case 82:
                        //修改內容red
                        setEle("red", keyCode);
                        break;
                    case 89:
                        //修改內容yellow
                        setEle("yellow", keyCode);
                        break;
                    default :
                        alert("系統沒有設定該顏色!");
                }

                function setEle(a, b) {
                    div.css("background-color", a);
                    span.text(b);
                }

            }

            //1.給document繫結keyup事件
//            $(document).keyup(function (e) {
//                //alert(e.keyCode);
//                //2.獲取值,根據此值,給div和span上色和內容
//                switch (e.keyCode){
//                    case 80:
//                        //修改內容pink
//                        div.css("background-color","pink");
//                        span.text(e.keyCode);
//                        break;
//                    case 66:
//                        //修改內容blue
//                        div.css("background-color","blue");
//                        span.text(e.keyCode);
//                        break;
//                    case 79:
//                        //修改內容orange
//                        div.css("background-color","orange");
//                        span.text(e.keyCode);
//                        break;
//                    case 82:
//                        //修改內容red
//                        div.css("background-color","red");
//                        span.text(e.keyCode);
//                        break;
//                    case 89:
//                        //修改內容yellow
//                        div.css("background-color","yellow");
//                        span.text(e.keyCode);
//                        break;
//                    default :
//                        alert("系統沒有設定該顏色!");
//                }
//            });
        })
    </script>
</head>

<body>

<div class="wrap">
    <h1>按鍵改變顏色</h1>
    <div id="bgChange">
        keyCode為:
        <span id="keyCodeSpan">80</span>
    </div>
</div>

</body>
</html>

#jQuery 的兩大特點

(1)鏈式程式設計:比如.show().html()可以連寫成.show().html()

鏈式程式設計原理:return this。

通常情況下,只有設定操作才能把鏈式程式設計延續下去。因為獲取操作的時候,會返回獲取到的相應的值,無法返回 this。

    end(); // 結束當前鏈最近的一次過濾操作,並且返回匹配元素之前的狀態。
1

(2)隱式迭代:隱式 對應的是 顯式。隱式迭代的意思是:在方法的內部會為匹配到的所有元素進行迴圈遍歷,執行相應的方法;而不用我們再進行迴圈,簡化我們的操作,方便我們呼叫。

如果獲取的是多元素的值,大部分情況下返回的是第一個元素的值。

**舉例:**五角星評分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>五角星評分案例</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        .comment {
            font-size: 40px;
            color: #ff3100;
        }

        .comment li {
            float: left;
            cursor: pointer;
        }

        ul {
            list-style: none;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {
            var star_none = '☆'; // 空心五角星
            var star_sel = '★'; // 實心五角星

            //需求1:滑鼠放懸停時,當前的li和之前所有的li內容全部變為實心五角星,移開變為空心。
            $(".comment li").on("mouseenter", function () {
                //當前五角星,和之前的所有五角星,全部是實心的,其他的為空心

                //寫法一:分兩次寫
//                $(this).text(star_sel).prevAll("li").text(star_sel);
//                $(this).nextAll("li").text(star_none);
                //寫法二:一次性寫完,但要用到end(),否則會出問題。【重要】
                $(this).text(star_sel).prevAll("li").text(star_sel).end().nextAll("li").text(star_none);
            });

            $(".comment li").on("mouseleave", function () {
                //bug:如果沒有點選過li,那麼會出現無法清除的現象,處理辦法就是先判斷,看看是否有current類
                if ($("li.current").length === 0) {
                    $(".comment li").text(star_none);
                } else {
                    //當滑鼠移開的時候,誰有current類名,那麼當前和之前所有的li前部是實心五角星,後面的所有li都是空心
                    $("li.current").text(star_sel).prevAll("li").text(star_sel).end().nextAll("li").text(star_none);
                }
            });


            //需求2:滑鼠點選那個li,當你前li和之前所有的li都變成實心五角星,其他變為空心。
            $(".comment li").on("click", function () {
                //點選哪個li給他加一個類名。清空其他所有的li的類名
                $(this).attr("class", "current").siblings("li").removeAttr("class");
            });


        });
    </script>
</head>
<body>
<ul class="comment">
    <li>☆</li>
    <li>☆</li>
    <li>☆</li>
    <li>☆</li>
    <li>☆</li>
</ul>
</body>
</html>

上方程式碼中,注意end的用法,很巧妙。

實現效果:

#each的用法

大部分情況下是不需要使用each方法的,因為jQuery的隱式迭代特性。

但是,如果要對每個元素做不同的處理,這時候就用到了each方法。

格式如下:

    $(selector).each(function(index,element){});

引數解釋:

  • 引數一:表示當前元素在所有匹配元素中的索引號

  • 引數二:引數二表示當前元素(是js 中的DOM物件,而不是jQuery物件)

舉例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        li {
            width: 100px;
            height: 100px;
            margin: 20px;
            float: left;
            list-style: none;
            text-align: center;
            font: 50px/100px "simsun";
            color: white;
            background-color: black;
        }
    </style>

    <script src="jquery-1.11.1.js"></script>
    <script>
        jQuery(function () {
            //設定每個不一樣的盒子透明度逐漸遞增
            $("ul li").each(function (index, element) {
                $(element).css("opacity", (index + 1) / 10);
                console.log(index+"---"+element.tagName);

            });
        });
    </script>
</head>
<body>
<ul>
    <li class="aaa1">1</li>
    <li class="aaa2">2</li>
    <li class="aaa3">3</li>
    <li class="aaa4">4</li>
    <li class="aaa5">5</li>
    <li class="aaa6">6</li>
    <li class="aaa7">7</li>
    <li class="aaa8">8</li>
    <li class="aaa9">9</li>
    <li class="aaa10">10</li>
</ul>

</body>
</html>

效果如下:

#多庫共存

多庫共存指的是:jQuery佔用了$jQuery這兩個變數。當在同一個頁面中引用了 jQuery 庫以及其他的庫(或者其他版本的jQuery庫),恰好其他的庫中也用到了$或者jQuery變數.那麼,要保證每個庫都能正常使用,就產生了多庫共存的問題。

溫馨提示:我們可以通過以下方式獲取 jQuery 庫的版本號。

    console.log($.fn.jquery);  //列印 jQuery 庫的版本號

辦法一:讓 jQuery 放棄對$的使用權:

    $.noConflict();

效果如下:

上圖中,程式碼中同時包含了兩個版本的庫。1.11.1版本放棄了對$的使用權,交給了1.8.2版本;但是1.11.1版本並沒有放棄對jQuery關鍵字的使用權。

辦法二:同時放棄放棄兩個符號的使用權,並定義一個新的使用權(如果有三個庫時,可以這樣用)

    $.noConflict(true);   //返回值是新的關鍵字

效果如下:

#jQuery 的外掛機制

jQuery 庫,雖然功能強大,但也不是面面俱到。jQuery 是通過外掛的方式,來擴充套件它的功能:

  • 當你需要某個外掛的時候,你可以“安裝”到jQuery上面,然後使用。

  • 當你不再需要這個外掛,那你就可以從jQuery上“解除安裝”它。

#外掛之改變顏色

jQuery的自定義動畫方法animate(),在執行動畫時,是不支援設定背景色這個屬性的。這個時候可以藉助jQuery.color.js這個外掛。

舉例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background-color: blue;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script src="jquery.color.js"></script>
    <script>
        $(function () {
            //點選按鈕,改變盒子的寬度和背景色
            $("button").on("click", function () {
                $("div").animate({"width": 200, "background-color": "red"}, 2000, function () {
                    alert("動畫結束");
                });
            });
        })
    </script>
</head>
<body>
<button>變色</button>
<div></div>
</body>
</html>

效果:

上方程式碼中,因為加入了一行外掛:(注意順序是放在jQuery外掛之後)

    <script src="jquery.color.js"></script>

否則的話,在動畫執行的過程中,是無法設定背景色的。

#外掛之懶載入

懶載入:當開啟一個網頁時,只有當我看到某個部分,再載入那個部分;而不是一下子全部載入完畢。這樣可以優化開啟的速度。

比如說,我可以設定一張圖片為懶載入,於是,這張圖片會等我寵幸到它的時候,它再開啟。

程式碼舉例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        div {
            height: 3000px;
            background-color: pink;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <!--懶載入的使用。第一步:導包(必須在jquery庫的下方)-->
    <script src="jquery.lazyload.js"></script>
    <script>
        $(function () {


            //第二步驟:呼叫懶載入的方法實現功能。引數的不同,功能也不同。
            $("img.lazy").lazyload();
        })
    </script>
</head>
<body>
<div></div>
<!--需要實現將圖片設定為懶載入模式-->
<img class="lazy" data-original="images/01.jpg" width="640" height="480">
</body>
</html>