第三天:jQuery進(jìn)階

一.JQ對象與DOM對象區(qū)別

document.getElementById('test');:DOM對象
$("#test"):JQ對象
JQ對象包含DOM對象,

  • JQ對象想要使用原生JS里的方法,可以用取鍵方式現(xiàn)將其轉(zhuǎn)變?yōu)镈OM對象。
  • DOM對象想使用JQ對象方法,直接在外面加$()就行了。

二.遍歷jQuery對象

  • each(callback)以每一個匹配的元素作為上下文來執(zhí)行一個函數(shù)。

意味著,每次執(zhí)行傳遞進(jìn)來的函數(shù)時(shí),函數(shù)中的this關(guān)鍵字都指向一個不同的DOM元素(每次都是一個不同的匹配元素)。而且,在每次執(zhí)行函數(shù)時(shí),都會給函數(shù)傳遞一個表示作為執(zhí)行環(huán)境的元素在匹配的元素集合中所處位置的數(shù)字值作為參數(shù)(從零開始的整型)。 返回 'false' 將停止循環(huán) (就像在普通的循環(huán)中使用 'break')。返回 'true' 跳至下一個循環(huán)(就像在普通的循環(huán)中使用'continue')

HTML代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <script type="text/javascript" src="static/js/jquery.min.js"></script>
    <title>ajax</title>
</head>
<body>
    <h1>遍歷jQuery對象內(nèi)部的DOM對象</h1>
    <input type="button" value="反選" onclick="fan()">
    <p>選擇1:<input type="checkbox"></p>
    <p>選擇2:<input type="checkbox"></p>
    <p>選擇3:<input type="checkbox"></p>
    <p>選擇4:<input type="checkbox"></p>
    <p>選擇5:<input type="checkbox"></p>
</body>
</html>

jQuery代碼:

  1. 面向過程
<script type="text/javascript">
    function fan(){
        var inp = $("input:checkbox");
        for(var i=0;i<inp.length;i++){
            if($(inp[i]).prop("checked") == true){
                $(inp[i]).prop("checked",false);
            }else{
                $(inp[i]).prop("checked",true);
            }
        }
    }
</script>

面向?qū)ο?用each方法):

<script type="text/javascript">
    function fan(){
        var inp = $("input:checkbox");
        inp.each(function(){
            if($(this).prop("checked") == true){
                $(this).prop("checked",false);
            }else{
                $(this).prop("checked",true);
            }
        })
    }
</script>

簡單方法:

<script type="text/javascript">
    function fan(){
        $("input:checkbox").each(function(){
            this.checked = !this.checked;
        })
    }
</script>

效果:
image.png

點(diǎn)擊反選執(zhí)行反選操作:
image.png

三.獲取元素值

  • val([val|fn|arr])獲得匹配元素的當(dāng)前值。

在 jQuery 1.2 中,可以返回任意元素的值了。包括select。如果多選,將返回一個數(shù)組,其包含所選的值。

  • :focus匹配當(dāng)前獲取焦點(diǎn)的元素。

HTML代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <script type="text/javascript" src="static/js/jquery.min.js"></script>
    <title>ajax</title>
</head>
<body>
    <p><input type="text" name="inp1" value="請輸入用戶名"></p>
</body>
</html>

jQuery代碼:

<script type="text/javascript">
    $("input[name='inp1']").mouseover(function(){
        if($(this).val() == '請輸入用戶名'){
            $(this).val('');
            $(this).focus();
        }       
    })
</script>

效果:
image.png

當(dāng)鼠標(biāo)移上去,輸入框變空,焦點(diǎn)聚集:
image.png

四.ready事件

  • ready(fn)當(dāng)DOM載入就緒可以查詢及操縱時(shí)綁定一個要執(zhí)行的函數(shù)。

這是事件模塊中最重要的一個函數(shù),因?yàn)樗梢詷O大地提高web應(yīng)用程序的響應(yīng)速度

HTML代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="static/js/jquery.min.js"></script>
    <title>ajax</title>
</head>
<body>
    <img src="static/images/3.png">
</body>
</html>

jQuery代碼:

<script type="text/javascript">
    onload = function(){
        alert('頁面加載完畢');
    }
    $(document).ready(function(){
        alert('dom加載完畢');
    })
</script>

效果:


image.png
image.png

五.綁定事件

  • on(events,[selector],[data],fn)在選擇元素上綁定一個或多個事件的事件處理函數(shù)。on()方法綁定事件處理程序到當(dāng)前選定的jQuery對象中的元素,要刪除的.on()綁定的事件,用.off()。
  • off(events,[selector],[fn])在選擇元素上移除一個或多個事件的事件處理函數(shù)。off() 方法移除用.on()綁定的事件處理程序。

HTML代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="static/js/jquery.min.js"></script>
    <title>ajax</title>
</head>
<body>
    <input type="button" value="給div加點(diǎn)擊事件" onclick="jia();">
    <input type="button" value="給div取消點(diǎn)擊事件" onclick="jie();">
    <div style="width: 200px;height: 200px;background: gray;">
</body>
</html>

jQuery代碼:

<script type="text/javascript">
    function dong(){
        alert('冬天');
    }
    function jia(){
        $("div").on('click',function(){
            alert('你好');
        });
        $("div").on('click',dong);
    }
    function jie(){
        $("div").off('click');
    }
</script>

效果:

點(diǎn)擊給div加點(diǎn)擊事件按鈕,再點(diǎn)擊灰色方塊,alert出你好冬天
image.png

點(diǎn)擊給div取消點(diǎn)擊事件按鈕,再點(diǎn)擊灰色方塊,無反應(yīng)
image.png

六.一次向綁定

  • one(type,[data],fn)為每一個匹配元素的特定事件(像click)綁定一個一次性的事件處理函數(shù)。在每個對象上,這個事件處理函數(shù)只會被執(zhí)行一次。

HTML代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="static/js/jquery.min.js"></script>
    <title>ajax</title>
</head>
<body>
    <input type="button" value="有些話想對你說">
</body>
</html>

jQuery代碼:

<script type="text/javascript">
    $("input:button").one('click',function(){
        alert('今晚操場見!')
    })
</script>

效果:

點(diǎn)擊有些話想對你所按鈕
image.png
alert出今晚操場見
image.png

再次點(diǎn)擊有些話想對你所按鈕無反應(yīng)
image.png

七.事件委托

  • on(events,[selector],[data],fn)在選擇元素上綁定一個或多個事件的事件處理函數(shù)。
  • text([val|fn])取得所有匹配元素的內(nèi)容。結(jié)果是由所有匹配元素包含的文本內(nèi)容組合起來的文本。

HTML代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="static/js/jquery.min.js"></script>
    <title>ajax</title>
</head>
<body>
    <input type="button" value="添加li">
    <ul>
        <li>春</li>
        <li>夏</li>
        <li>秋</li>
    </ul>
</body>
</html>

jQuery代碼:

<script type="text/javascript">
    $("input:button").click(function(){
        $("ul").append("<li>冬</li>")
    })
    $("ul").on('click','li',function(){
        alert($(this).text());
    });
</script>

效果:

點(diǎn)擊li春,夏,秋分別alert出春,夏,秋

image.png
點(diǎn)擊添加li增加一個li
image.png
點(diǎn)擊li冬alert出冬
image.png

八.事件對象

  • event.which針對鍵盤和鼠標(biāo)事件,這個屬性能確定你到底按的是哪個鍵或按鈕。
  • keyup([[data],fn])當(dāng)按鈕被松開時(shí),發(fā)生 keyup 事件。它發(fā)生在當(dāng)前獲得焦點(diǎn)的元素上。
  • keydown([[data],fn])當(dāng)鍵盤或按鈕被按下時(shí),發(fā)生 keydown 事件。

HTML代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="static/js/jquery.min.js"></script>
    <title>ajax</title>
</head>
<body>
    <input type="text">
</body>
</html>

jQuery代碼:

<script type="text/javascript">
    $("input:text").keyup(function(ev){
        var test = ev.type + ':' + ev.which;
        console.log(test);
    });
</script>

效果:

在輸入框輸入abcdef后打印出其對應(yīng)ASCII碼值
image.png

九.動畫

  • fadeOut([speed],[easing],[fn])通過不透明度的變化來實(shí)現(xiàn)所有匹配元素的淡出效果,并在動畫完成后可選地觸發(fā)一個回調(diào)函數(shù)。
  • fadeIn([speed],[easing],[fn])通過不透明度的變化來實(shí)現(xiàn)所有匹配元素的淡入效果,并在動畫完成后可選地觸發(fā)一個回調(diào)函數(shù)。
  • slideUp([speed,[easing],[fn]])通過高度變化(向上減小)來動態(tài)地隱藏所有匹配的元素,在隱藏完成后可選地觸發(fā)一個回調(diào)函數(shù)。
  • slideDown([speed],[easing],[fn])通過高度變化(向下增大)來動態(tài)地顯示所有匹配的元素,在顯示完成后可選地觸發(fā)一個回調(diào)函數(shù)。
  • delay(duration,[queueName])設(shè)置一個延時(shí)來推遲執(zhí)行隊(duì)列中之后的項(xiàng)目。
  • jQuery.fx.off關(guān)閉頁面上所有的動畫。把這個屬性設(shè)置為true可以立即關(guān)閉所有動畫(所有效果會立即執(zhí)行完畢)。有些情況下可能需要這樣,比如:
    1.你在配置比較低的電腦上使用jQuery。
    2.你的一些用戶由于動畫效果而遇到了 可訪問性問題。
    當(dāng)把這個屬性設(shè)成false之后,可以重新開啟所有動畫。

HTML代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="static/js/jquery.min.js"></script>
    <title>ajax</title>
</head>
<style class="scr" media="screen">
    div{
        width: 1024px;
        height: 768px;
        background: gray;
    }
</style>
<body>
    <div class="scr">
        <img src="/static/images/4.png">
    </div>
</body>
</html>

jQuery代碼`:

<script type="text/javascript">
    //jQuery.fx.off = true; //取消所有動畫效果
    $("div").click(function(){
        $(this)
        .fadeOut(2000,function(){
            alert('div消失了!');
        })
        .delay(2000)
        .fadeIn(2000,function(){
            alert('div出現(xiàn)了!');
        })
        .delay(2000)
        .slideUp(2000,function(){
            alert('div向上滑!');
        })
        .delay(2000)
        .slideDown(2000,function(){
            alert('div向下滑!');
        });
    });
</script>

效果:點(diǎn)擊出現(xiàn)動畫效果
image.png

十.jQuery使用Ajax

(一)Ajax請求
  • jQuery.ajax(url,[settings])通過 HTTP 請求加載遠(yuǎn)程數(shù)據(jù)。
    jQuery 底層 AJAX 實(shí)現(xiàn)。$.ajax() 返回其創(chuàng)建的 XMLHttpRequest 對象。最簡單的情況下,$.ajax()可以不帶任何參數(shù)直接使用。
回調(diào)函數(shù)

如果要處理$.ajax()得到的數(shù)據(jù),則需要使用回調(diào)函數(shù)。beforeSend、error、dataFilter、success、complete。

  1. beforeSend 在發(fā)送請求之前調(diào)用,并且傳入一個XMLHttpRequest作為參數(shù)。
  2. error 在請求出錯時(shí)調(diào)用。傳入XMLHttpRequest對象,描述錯誤類型的字符串以及一個異常對象(如果有的話)
  3. dataFilter 在請求成功之后調(diào)用。傳入返回的數(shù)據(jù)以及"dataType"參數(shù)的值。并且必須返回新的數(shù)據(jù)(可能是處理過的)傳遞給success回調(diào)函數(shù)。
  4. success 當(dāng)請求之后調(diào)用。傳入返回后的數(shù)據(jù),以及包含成功代碼的字符串。
  5. complete 當(dāng)請求完成之后調(diào)用這個函數(shù),無論成功或失敗。傳入XMLHttpRequest對象,以及一個包含成功或錯誤代碼的字符串。
數(shù)據(jù)類型

$.ajax()函數(shù)依賴服務(wù)器提供的信息來處理返回的數(shù)據(jù)。

如果服務(wù)器報(bào)告說返回的數(shù)據(jù)是XML,那么返回的結(jié)果就可以用普通的XML方法或者jQuery的選擇器來遍歷。如果得到其他類型,比如HTML,則數(shù)據(jù)就以文本形式來對待。
通過dataType選項(xiàng)還可以指定其他不同數(shù)據(jù)處理方式。除了單純的XML,還可以指定 html、json、jsonp、script或者text。

發(fā)送數(shù)據(jù)到服務(wù)器

默認(rèn)情況下,Ajax請求使用GET方法。如果要使用POST方法,可以設(shè)定type參數(shù)值。這個選項(xiàng)也會影響data選項(xiàng)中的內(nèi)容如何發(fā)送到服務(wù)器。

參數(shù)

url: [類型: String]一個用來包含發(fā)送請求的URL字符串。
settings: [類型: PlainObject]AJAX 請求設(shè)置。所有選項(xiàng)都是可選的。

settings:選項(xiàng)
  1. url(默認(rèn): 當(dāng)前頁地址) [類型: String]
    發(fā)送請求的地址。
  2. type(默認(rèn): "GET") [類型: String]
    請求方式 ("POST" 或 "GET"), 默認(rèn)為 "GET"。
  3. data [類型: String,Array]
    發(fā)送到服務(wù)器的數(shù)據(jù)。將自動轉(zhuǎn)換為請求字符串格式。必須為 Key/Value 格式。如果為數(shù)組,jQuery 將自動為不同值對應(yīng)同一個名稱。如 {foo:["bar1", "bar2"]} 轉(zhuǎn)換為 "&foo=bar1&foo=bar2"。
  4. dataType[類型: String]
    預(yù)期服務(wù)器返回的數(shù)據(jù)類型。如果不指定,jQuery 將自動根據(jù) HTTP 包 MIME 信息來智能判斷,比如XML MIME類型就被識別為XML。在1.4中,JSON就會生成一個JavaScript對象,而script則會執(zhí)行這個腳本。隨后服務(wù)器端返回的數(shù)據(jù)會根據(jù)這個值解析后,傳遞給回調(diào)函數(shù)??捎弥?

xml: 返回 XML 文檔,可用 jQuery 處理。
html: 返回純文本 HTML 信息;包含的script標(biāo)簽會在插入dom時(shí)執(zhí)行。
script: 返回純文本 JavaScript 代碼。不會自動緩存結(jié)果。除非設(shè)置了"cache"參數(shù)。'''注意:'''在遠(yuǎn)程請求時(shí)(不在同一個域下),所有POST請求都將轉(zhuǎn)為GET請求。(因?yàn)閷⑹褂肈OM的script標(biāo)簽來加載)
json: 返回 JSON 數(shù)據(jù) 。
jsonp: JSONP 格式。
text: 返回純文本字符串

  1. statusCode(默認(rèn): {}) [類型: Map]
    一組數(shù)值的HTTP代碼和函數(shù)對象,當(dāng)響應(yīng)時(shí)調(diào)用了相應(yīng)的代碼。例如,如果響應(yīng)狀態(tài)是404,將觸發(fā)以下警告:
$.ajax({
  statusCode: {404: function() {
    alert('page not found');
  }
});
  1. context [類型: Object]
    這個對象用于設(shè)置Ajax相關(guān)回調(diào)函數(shù)的上下文。
    也就是說,讓回調(diào)函數(shù)內(nèi)this指向這個對象(如果不設(shè)定這個參數(shù),那么this就指向調(diào)用本次AJAX請求時(shí)傳遞的options參數(shù))。
    比如指定一個DOM元素作為context參數(shù),這樣就設(shè)置了success回調(diào)函數(shù)的上下文為這個DOM元素。就像這樣:
$.ajax({ 
    url: "test.html", context: document.body, success: function(){
    $(this).addClass("done");
    }
});
  1. success(data, textStatus, jqXHR) [類型: Function(Object data, String textStatus, jqXHR jqXHR)]
    請求成功后的回調(diào)函數(shù)。
    參數(shù):由服務(wù)器返回,并根據(jù)dataType參數(shù)進(jìn)行處理后的數(shù)據(jù);描述狀態(tài)的字符串。還有 jqXHR對象 。
    在jQuery 1.5, 成功設(shè)置可以接受一個函數(shù)數(shù)組。每個函數(shù)將被依次調(diào)用。
function (data, textStatus) {
    // data 可能是 xmlDoc, jsonObj, html, text, 等等...
    this; // 調(diào)用本次AJAX請求時(shí)傳遞的options參數(shù)
}
  1. error(默認(rèn): 自動判斷 xml 或 html) [類型: Function(jqXHR jqXHR, String textStatus,String errorThrown )]
    請求失敗時(shí)調(diào)用此函數(shù)。有以下三個參數(shù):
    XMLHttpRequest 對象、錯誤信息、(可選)捕獲的異常對象。
    如果發(fā)生了錯誤,錯誤信息(第二個參數(shù))除了得到null之外,還可能是timeout, error, notmodifiedparsererror
function (XMLHttpRequest, textStatus, errorThrown) {
    // 通常 textStatus 和 errorThrown 之中只有一個會包含信息
    this; // 調(diào)用本次AJAX請求時(shí)傳遞的options參數(shù)
}
  1. timeout [類型: Number]
    設(shè)置請求超時(shí)時(shí)間(毫秒)。此設(shè)置將覆蓋全局設(shè)置。
  2. async (默認(rèn): true) [類型: Boolean]
    默認(rèn)設(shè)置下,所有請求均為異步請求。如果需要發(fā)送同步請求,請將此選項(xiàng)設(shè)置為 false。注意,同步請求將鎖住瀏覽器,用戶其它操作必須等待請求完成才可以執(zhí)行。
  3. beforeSend(XHR) [類型: Function( jqXHR jqXHR,PlainObject settings )]
    發(fā)送請求前可修改 XMLHttpRequest 對象的函數(shù),如添加自定義 HTTP 頭。XMLHttpRequest 對象是唯一的參數(shù)。
  4. complete(XHR, TS) [類型: Function(jqXHR jqXHR, String textStatus)]
    請求完成后回調(diào)函數(shù) (請求成功或失敗之后均調(diào)用)。參數(shù): XMLHttpRequest 對象和一個描述成功請求類型的字符串。

PHP代碼:

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    public function index()
    {
        return $this->fetch('1');
    }
    public function pos()
    {   
        if(request()->isPost())
        {
            $data=input('post.');
        }
        echo json_encode($data);
    }
}

HTML代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="static/js/jquery.min.js"></script>
    <title>ajax</title>
</head>
<body>
    <form action="" method="post">
        <p>Name:<input type="text" name="username"></p>
        <p>Email:<input type="text" name="email"></p>
        <p><input type="submit" name="submit"></p>
    </form>
</body>
</html>

jQuery代碼:

<script type="text/javascript">
    $("form").submit(function(){
        var data = {
            'username':$("input[name='username']").val(),
            'email':$("input[name='email']").val(),
        };
        $.ajax({
            url:'{:url("index/pos")}',
            type:'POST',
            data:data,
            dataType:'json',
            success:function(res){
                alert(
                    'username:' + res['username']+
                    '\nemail:' + res['email']
                );
            },
        });
        return false;
    });
</script>

效果:

點(diǎn)擊提交alert出username,email鍵值
image.png
(二)Ajax之GET請求
  • jQuery.get(url, [data], [callback], [type])通過遠(yuǎn)程 HTTP GET 請求載入信息。
    這是一個簡單的 GET 請求功能以取代復(fù)雜$.ajax 。請求成功時(shí)可調(diào)用回調(diào)函數(shù)。如果需要在出錯時(shí)執(zhí)行函數(shù),請使用 $.ajax。
參數(shù)

url:待載入頁面的URL地址
data:待發(fā)送 Key/value 參數(shù)。
callback:載入成功時(shí)回調(diào)函數(shù)。
type:返回內(nèi)容格式,xml, html, script, json, text, _default。

PHP代碼:

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    public function index()
    {
        return $this->fetch('1');
    }
    public function se()
    {   
        if(request()->isGet())
        {
            $data=input('username');
        }
        $arr =[
            'lisi','zhaoliu','zhaosi'
        ];
        echo in_array($data,$arr)?1:0;
    }
}

HTML代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="static/js/jquery.min.js"></script>
    <title>ajax</title>
</head>
<body>
    <div class="scr">
        <p><input type="text" name="username"><span id="sp"></span></p>
    </div>
</body>
</html>

jQuery代碼:

<script type="text/javascript">
    $("input").blur(function(){
        var url = '{:url("index/se")}?username=' + $(this).val();
        $.get(url,function(res){
            if(res == 1){
                $("#sp").html('<font color="red">用戶名已存在!</font>');
            }else{
                $("#sp").html('<font color="green">用戶名可以使用!</font>');
            }
        });
    })
</script>

效果:

輸入lisi顯示用戶名已存在
image.png

輸入zhangsan顯示用戶名可以使用
image.png
(三)Ajax之POST請求
  • jQuery.post(url, [data], [callback], [type])通過遠(yuǎn)程 HTTP POST 請求載入信息。
    這是一個簡單的 POST 請求功能以取代復(fù)雜 $.ajax。請求成功時(shí)可調(diào)用回調(diào)函數(shù)。如果需要在出錯時(shí)執(zhí)行函數(shù),請使用$.ajax
參數(shù)

url:發(fā)送請求地址。
data:待發(fā)送 Key/value 參數(shù)。
callback:發(fā)送成功時(shí)回調(diào)函數(shù)。
type:返回內(nèi)容格式,xml, html, script, json, text, _default。

PHP代碼:

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    public function index()
    {
        return $this->fetch('1');
    }
    public function pos()
    {   
        if(request()->isPost())
        {
            $data=input('post.');
        }
        print_r($data);
    }
}

HTML代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="static/js/jquery.min.js"></script>
    <title>ajax</title>
</head>
<body>
    <form action="" method="post">
        <p>Name:<input type="text" name="username"></p>
        <p>Email:<input type="text" name="email"></p>
        <p><input type="submit" name="submit"></p>
    </form>
</body>
</html>

jQuery代碼:

<script type="text/javascript">
    $("form").submit(function(){
        var data = {
            'username':$("input[name='username']").val(),
            'email':$("input[name='email']").val(),
        };
        $.post(
            url = '{:url("index/pos")}',
            data = data,
            callback = function(res){
                console.log(res);
            }
        );
        return false;
    });
</script>

效果:

點(diǎn)擊提交alert出username,email鍵值
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容