[初探]

jQuery 怎麼用來「快速選取元素」並且「做一些事情」呢?請看看程式碼:

$("div").addClass("special");

錢記號 $ 是 jQuery 的物件,使用 $("div") 就是用 jQuery 來選取元素,這個範例可以選取文件內所有的 <div> 元素。後面接著的 .addClass("special") 就是用來做一些事情,這個範例是將先前所選取到的所有元素都加上一個名為 "special" 的 class。也就是透過 $("div").addClass("special") 的語法,可以讓你一次幫文件上有的 <div> 元素都加入 special 的 class。

請注意喔,剛剛的例子可以針對已選取的多個元素做批次的操作,也就是說如果文件上有三個 <div>,那就會一次找出三個 <div> 並且全部套用後續的動作。這和你原本自己使用 JavaScript 來寫程式有很大的差異,原本自己寫可能會需要用到迴圈之類的語法,而 jQuery 的函數大多具有批次處理的功能,光是這點就可以讓你的程式更簡潔了。

關於錢記號 $ 將會是你學習及使用 jQuery 的過程中最重要的物件(或者你要把 $ 當成一個函數也可以,事實上也是這樣),使用方式就像剛剛你看到的,用來找元素用的,把參數帶入即可。或許你不習慣錢記號也可以當成函數名稱,那麼你也可以用 jQuery 這個名字,錢記號其實是被當成 jQuery 的縮寫,讓你的函數看起來更簡潔一些,如果你要自己設定另外一個縮寫,例如 $j,也是可以的,這部份後續再解釋,先看看已下的範例,結果將會和上面的範例是一模一樣的:

jQuery("div").addClass("special");

[選取元素]

前面的例子使用 $("div") 來選取元素,帶入的參數 div 是表示你要找的元素,這是 CSS 選擇器(CSS Selector) 的語法,就如同 CSS 在做排版和外觀所使用的選擇器語法一樣。jQuery 所支援的 CSS Selector 包含了 CSS 1、CSS2 以及仍未正式發佈的 CSS3,此外透過 plugin 還可支援常用的 XPath 語法,善用這些 CSS、XPath 語法就可以很容易地找到你要處理的網頁元素,底下來看看更多的範例。

這是一段原始的 HTML:

  1. <div id="body">
  2. <h2>Some Header</h2>
  3. <div class="contents">
  4. <p>...</p>
  5. <p>...</p>
  6. </div>
  7. </div>
<div id="body"><h2>Some Header</h2><div class="contents"><p>...</p><p>...</p></div>
</div>

以下用一連串的範例,以藍色字體展示一些基本的語法並且以深色字顯示文件中會被選取的元素。

$("div")
<div id="body">
  <h2>Some Header</h2>
  <div class="contents">
    <p>...</p>
    <p>...</p>
  </div>
</div>
解釋:選取所有 <div>

$("#body")
<div id="body">
  <h2>Some Header</h2>
  <div class="contents">
    <p>...</p>
    <p>...</p>
  </div>
</div>
解釋:選取 id 為 body 的元素

$("div#body")
<div id="body">
  <h2>Some Header</h2>
  <div class="contents">
    <p>...</p>
    <p>...</p>
  </div>
</div>
解釋:選取 id 為 body 的 <div>

$("div.contents p")
<div id="body">
  <h2>Some Header</h2>
  <div class="contents">
    <p>...</p>
    <p>...</p>
  </div>
</div>
解釋:選取 class 為 contents 的 <div> 所包住的所有下層的 <p>

$("div > div")
<div id="body">
  <h2>Some Header</h2>
  <div class="contents">
    <p>...</p>
    <p>...</p>
  </div>
</div>
解釋:選取被 <div> 包住的下一層 <div>

$("div:has(div)")
<div id="body">
  <h2>Some Header</h2>
  <div class="contents">
    <p>...</p>
    <p>...</p>
  </div>
</div>
解釋:和前一個範例相反,這邊是選取至少有包住一個 <div> 的 <div>

[做一些事情]

前一段的教學中介紹了如何使用 jQuery 來選取元素,其中大部份的語法都是可以讓你快速地一次選取多個元素,接下來當然就是要來對這些選取到的元素做些改變囉。透過 jQuery 內建的函數,你可以:

  • 對 DOM 進行操作,例如對文件節點的新增或修改
  • 添加事件處理
  • 做一些基本的視覺效果,例如隱藏、顯示、下拉顯示、淡出淡入等等
  • 使用 AJAX 傳送表單內容或取得遠端文件

[範例1] 選取所有有 target 屬性的 <a>,並且在其節點下加入一段文字。

$("a[target]").append(" (Opens in New Window)");

這是一段原始的 HTML :

  1. <a href="http://jsgears.com">jsGears</a>
  2. <a href="http://google.com" target="_blank">Google</a>
  3. <a href="http://amazon.com" target="_blank">Amazon</a>
<a href="http://jsgears.com">jsGears</a>
<a href="http://google.com" target="_blank">Google</a>
<a href="http://amazon.com" target="_blank">Amazon</a>

選取有 target 屬性並加入文字後的結果:

  1. <a href="http://jsgears.com">jsGears</a>
  2. <a href="http://google.com" target="_blank">Google (Opens in New Window)</a>
  3. <a href="http://amazon.com" target="_blank">Amazon (Opens in New Window)</a>
<a href="http://jsgears.com">jsGears</a>
<a href="http://google.com" target="_blank">Google (Opens in New Window)</a>
<a href="http://amazon.com" target="_blank">Amazon (Opens in New Window)</a>

[範例2] 選取 id 為 body 的元素,並且修改兩個 css 屬性。

$("#body").css({border: "1px solid green",height: "40px"
});

這是一段原始的 HTML :

  1. <div id="body">
  2. ...
  3. </div>
<div id="body">...
</div>

選取 id 為 body 的元素並修改 css 後的結果(示意):

  1. <div id="body" style="border: 1px solid green; height: 40px">
  2. ...
  3. </div>
<div id="body" style="border: 1px solid green; height: 40px">...
</div>

[範例3] 在網頁上的表單送出時加入一個判斷,如果 username 這個欄位是空值的話,就顯示 help 這個區塊內的文字。

$("form").submit(function() {if ($("input#username").val() == "")$("span.help").show();
});

可作用在類似以下的 HTML,一開始 span.help 是隱藏的,如果沒有輸入 username,才會顯示:

  1. <style type="text/css">
  2. .help {display: none}
  3. </style>
  4. <form>
  5. <label for="username">請輸入大名</label>
  6. <input type="text" id="username" name="username" />
  7. <span class="help">這個欄位必填喔</span>
  8. </form>
<style type="text/css">.help {display: none}
</style>
<form><label for="username">請輸入大名</label><input type="text" id="username" name="username" /><span class="help">這個欄位必填喔</span>
</form>

[範例4] 當 user 點選 id 為 open 的連結時,顯示 id 為 menu 的區塊,並回傳 false 避免瀏覽器真的換頁。

$("a#open").click(function() {$("#menu").show();return false;
});

可作用在類似以下的 HTML:

  1. <style type="text/css">
  2. #menu {display: none}
  3. </style>
  4. <a id="open" href="#">控制面板</a>
  5. <ul id="menu">
  6. <li><a href="#1">控制面板首頁</a></li>
  7. <li><a href="#2">編輯個人資料</a></li>
  8. <li><a href="#3">個人空間管理</a></li>
  9. </ul>
<style type="text/css">#menu {display: none}
</style>
<a id="open" href="#">控制面板</a>
<ul id="menu"><li><a href="#1">控制面板首頁</a></li><li><a href="#2">編輯個人資料</a></li><li><a href="#3">個人空間管理</a></li>
</ul>

[範例5] 將 id 為 menu 的區塊以下拉布幕的動態效果快速顯示:

$("#menu").slideDown("fast");

可作用在類似以下的 HTML,原本隱藏的選單會以動態下拉的方式顯示出來:

  1. <style type="text/css">
  2. #menu {display: none}
  3. </style>
  4. <ul id="menu">
  5. <li><a href="#1">控制面板首頁</a></li>
  6. <li><a href="#2">編輯個人資料</a></li>
  7. <li><a href="#3">個人空間管理</a></li>
  8. </ul>
<style type="text/css">#menu {display: none}
</style>
<ul id="menu"><li><a href="#1">控制面板首頁</a></li><li><a href="#2">編輯個人資料</a></li><li><a href="#3">個人空間管理</a></li>
</ul>

[範例6] 將所有的 <div> 漸變為寬 300px、文字與邊界寬 20px

$("div").animate({width: '300px',padding: '20px'}, 'slow');

可作用在類似以下的 HTML:

  1. <div style="width: 100px; border: solid 1px red;">
  2. Hello world!
  3. </div>
<div style="width: 100px; border: solid 1px red;">Hello world!
</div>

PS. jQuery 核心程式的 animate 函數能改變的元素屬性並不多,但是可以透過其他 plugin 提供更多的動態效果。

[範例7] 動態效果的 callback 的範例,將所有的 <div> 以 0.5 秒的動態效果隱藏後,再以 0.5 秒的動態效果顯示。hide() 的第二個參數就是一個 callback 函數,其中 $(this) 是原本程式所處理的各個元素。

$("div").hide(500, function(){// $(this) 是每一個各別的 <div>$(this).show(500);
});

可作用在類似以下的 HTML:

  1. <div style="width: 100px; border: solid 1px red;">
  2. Hello world!
  3. </div>
  4. <div style="width: 100px; border: solid 1px red;">
  5. jsGears.com!
  6. </div>
<div style="width: 100px; border: solid 1px red;">Hello world!
</div>
<div style="width: 100px; border: solid 1px red;">jsGears.com!
</div>

[範例8] 取得 sample.html 並將找出文件內所有 <div> 下一層的 <h1> 填入原本文件 id 為 body 的元素內

$("#body").load("sample.html div > h1");

這是一段原始的 HTML :

  1. <div id="body"></div>
<div id="body"></div>

sample.html 的片段:

  1. <div>
  2. <h1>Hello world!</h1>
  3. <h2>This is H2</h2>
  4. <h1>jsGears.com!</h1>
  5. </div>
<div><h1>Hello world!</h1><h2>This is H2</h2><h1>jsGears.com!</h1>
</div>

執行程式碼之後的結果:

  1. <div id="body">
  2. <h1>Hello world!</h1>
  3. <h1>jsGears.com!</h1>
  4. </div>
<div id="body"><h1>Hello world!</h1><h1>jsGears.com!</h1>
</div>

[範例9] 透過 getJSON() 取得 JSON 格式的資料,並透過 callback 函數處理資料

$.getJSON("test.json", function(data){for (var idx in data)$("#menu").append("<li>" + data[idx] + "</li>");
});

這是一段原始的 HTML:

  1. <ul id="menu">
  2. <li>項目1</li>
  3. </ul>
<ul id="menu"><li>項目1</li>
</ul>

test.json 的內容:

["Hello world!","jsGears.com!"
]

執行程式碼之後的結果:

  1. <ul id="menu">
  2. <li>項目1</li>
  3. <li>Hello world!</li>
  4. <li>jsGears.com!</li>
  5. </ul>
<ul id="menu"><li>項目1</li><li>Hello world!</li><li>jsGears.com!</li>
</ul>

[連續使用函數]

jQuery 很重要的一個特性是可以連續地使用函數(Chaining),當你選取了一個或一組的元素後,可以連續對這些元素進行多個處理。以下範例會將所有的 <div> 隱藏,修改文字顏色為藍色,再將 <div> 以下拉布幕的效果顯示出來:

$("div").hide();
$("div").css("color", "blue");
$("div").slideDown();

這樣的三行程式碼可以用以下一行的程式碼取代,結果會是完全相同的:

$("div").hide().css("color", "blue").slideDown();

是否感到很神奇呢?在 jQuery 的架構設計上,大部分的函數都會在處理完該做的事情後,再將原本傳入的元素給回傳回去,因此函數都可以連續這樣一個接著一個的使用。還記得一開始所說的 jQuery 可以讓你的程式碼更精簡嗎?看了上面的一些範例後,現在應該有點感覺了吧。

講到 jQuery 的函數連續使用,有兩個很重要的函數必須在此介紹一下。第一個是 end(),這個函數執行後,會回傳「前一組找到的元素」。另一個是 find(),這個函數的用法如同使用 $() 找文件內的元素一樣是帶入 CSS 選擇器,執行後回傳找到的元素,不同的是 $() 是找整個文件,而 find() 是根據先前找到的元素再找其底下的元素,像是一個再過濾的功能。

$("ul.open")                // [ ul, ul, ul ].children("li")           // [ li, li, li ].addClass("open")         // [ li, li, li].end()                    // [ ul, ul, ul ].find("a")                // [ a, a, a ].click(function(){$(this).next().toggle();return false;})                        // [ a, a, a ].end();                   // [ ul, ul, ul ]

上面這一段程式碼連續使用多個函數,且透過 end() 和 find() 來分別對不同的元素進行操作,詳細的步驟解釋如下:

  • 找出文件內所有 class 為 open 的 <ul>
  • 過濾出下一層的所有 <li>
  • 對這些 <li> 新增一個 class
  • 回前一次搜尋的結果,也就是所有的 <ul>
  • 再找出底下所有的 <a>
  • 對 <a> 新增事件處理
  • 回前一次搜尋的結果

[document ready 事件]

有些時候,我們必須在網頁下載完成之後立即執行一些程式,可能是想要把游標放在預設的輸入框,或是馬上顯示一些歡迎訊息等等。過去你可能用過 window.onload 來處理,或是直接在 <body> 標籤上加入 onload 的事件處理函數,但是 jQuery 提供了另一種選擇,請參考下面的範例:

$(document).ready(function() {alert('您好,歡迎來到 jsGears.com ~');
});

先透過 $() 取得 document 物件,接著使用 ready() 帶入一個函數,就可以在網頁下載完成後立即執行。jQuery 的 document ready 事件是模擬 W3C DOM 標準的 DOMContentLoaded 事件,DOMContentLoaded 和 window.onlad 的差異在於前者是在 DOM 文件下載完成後觸發,而後者是文件和所有文件內的元件,包含圖檔等等全部下載完成後才會觸發,因此通常 window.onload 的發生時間要比 DOMContentLoaded 晚一點(如果你的網頁內確實有用到一些圖檔),有時候你所需要執行的程式並不需要等所有圖檔都下載完成,因此,放到 DOMContentLoaded 事件內處理是比較合適的。但是,IE 目前的版本 6 和 7 並不支援 DOMContentLoaded 事件,所以 jQuery 用了一些技巧來達到模擬 DOMContentLoaded 的事件,而成果就是上面看到的這個例子的用法。

DOMContentLoaded 和 window.onlad 的另一個差異在於 window.onload 並沒有辦法多次指定不同的函數來執行,最後指定的那個函數會複寫掉先前的,例如以下範例:

window.onload = function() {alert('Hello world!');
};
window.onload = function() {alert('您好,歡迎來到 jsGears.com ~');
};

上面的例子在同一個頁面上用了兩次 window.onload,結果將會是後面的函數會被執行到,前面的函數將消失無影蹤,當然,只要你稍具 JavaScript 處理 Event 的技巧,真要連續指定兩個函數來執行也不是太困難,不過用 jQuery 會更容易,看看以下相同的範例:

$(document).ready(function() {alert('Hello world!');
});
$(document).ready(function() {alert('您好,歡迎來到 jsGears.com ~');
});

相同的例子使用 jQuery 的 document ready 函數,則帶入的兩個函數都會被執行到,很簡單吧,完全不需用到什麼技巧。再提供一個精簡的語法, document ready 函數也可以這樣用:

$(function() {alert('您好,歡迎來到 jsGears.com ~');
});

直接把函數放到 $() 裡面就可以了,是不是超精簡啊。

[$() 別名]

前面用到了很多 $(),包含剛介紹的 document ready 及先前的選取功能,都是透過這個簡短的錢記號來達成,其實這個錢記號是 「jQuery」這個物件的縮寫,也就是剛剛所有你看到用 $() 的地方,都可以改寫成用 jQuery(),例如:

jQuery(document).ready(function() {jQuery("div").addClass("special");
});

沒事應該不會有人想用比較長的名稱來寫程式,簡短的 $ 不是挺好的。但是,某些情況可能你無法使用 $(),例如你進行中的專案已經使用了其他的 JavaScript Library,而 $ 這個名稱已經被使用了,例如另一套知名的 prototype,也使用了 $() 這樣的函數名稱,這時如果你需要再搭配使用 jQuery 的話,jQuery 本身有提供一個方式來避免 $() 的衝突:

jQuery.noConflict();
jQuery(document).ready(function() {jQuery("div").addClass("special");
});

使用 jQuery 前,先下達 jQuery.noConflict() 這樣就可以避免掉 $() 衝突的問題,接著再用 jQuery 物件來進行操作即可。此外,你也可以自行幫 jQuery 這個物件設定另一個別名,例如:

var $j = jQuery.noConflict();
$j(document).ready(function() {$j("div").addClass("special");
});

使用一個變數來接 jQuery.noConflict() 的回傳值,這個變數就可以做為 jQuery 的一個別名,透過這個別名不但避免了和其他 Library 錢記號的衝突,也可以將函數名稱縮短,算是 jQuery 一個蠻貼心的設計。

(转)jQuery 基础相关推荐

  1. 【Java Web开发指南】JQuery基础笔记

    文章目录 JQuery 基础: 1. JQuery 基础:1. 概念2. 快速入门3. JQuery对象和JS对象区别与转换4. 选择器5. DOM操作6. 案例 JQuery 基础: 1. 概念: ...

  2. Jquery基础之DOM操作

    Jquery基础之DOM操作 Dom是Document Object Model的缩写,意思是文档对象模型.DOM是一种与浏览器.平台.语言无关的接口,使用该接口可以轻松访问页面中所有的标准组件.DO ...

  3. Ajax、jQuery基础入门视频教程

    关注公众号,免费获取资料 本视频是Ajax和jQuery基础入门视频,该视频针对接触过javaScript基础的学员录制,授课讲究通俗易懂.通过该视频的学习,相信您能够轻轻松松地掌握Ajax和jQue ...

  4. jQuery小测试系列之jQuery基础知识

    日期:2012-4-17  来源:GBin1.com 这是jQuery小测试系列第一部分:基础知识. 来源:jQuery小测试系列之jQuery基础知识

  5. JQuery-学习笔记04【基础——JQuery基础案例】

    Java后端 学习路线 笔记汇总表[黑马程序员] JQuery-学习笔记01[基础--JQuery基础]--[day01] JQuery-学习笔记02[基础--JQuery选择器] JQuery-学习 ...

  6. JQuery-学习笔记01【基础——JQuery基础】

    Java后端 学习路线 笔记汇总表[黑马程序员] JQuery-学习笔记01[基础--JQuery基础]--[day01] JQuery-学习笔记02[基础--JQuery选择器] JQuery-学习 ...

  7. 06 Jquery 基础

    06 Jquery 基础 前端学习之jquery: jQuery:一个库 Jquery的基础语法: $(selector).action() 基本选择器: <script>//基本选择器/ ...

  8. java与jquery的选择器区别_java day44【JQuery 基础:概念,快速入门,JQuery对象和JS对象区别与转换,选择器,DOM操作,案例】...

    第一章JQuery 基础 1. 概念: 一个JavaScript框架.简化JS开发 * jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScrip ...

  9. java jquery基础_day20:JQuery基础(超系统的JavaWEB全套教程)

    今日内容 1.JQuery 基础: 概念 快速入门 JQuery对象和JS对象区别与转换 选择器 DOM操作 案例 JQuery 基础: 1.概念: 一个JavaScript框架.简化JS开发 jQu ...

  10. 《jQuery基础》总结

    目前,互联网上最好的jQuery入门教材,是Rebecca Murphey写的<jQuery基础>(jQuery Fundamentals).这本书虽然是入门教材,但也足足有100多页.我 ...

最新文章

  1. FlashDevelop Android开发.md
  2. 升级php7_PHP5.9 升级到PHP7 遇到的一些坑(phpfpm 图解)
  3. 供应商主数据屏幕增强
  4. javascript链式语法
  5. 关于0xFFFFFFFF和alpha,温故而知新
  6. 前瞻科技,引领未来!Microsoft Connect(); 2018即将重磅来袭!
  7. ActiveMQ性能测试
  8. Web浏览器端通过https 使用mqtt通讯
  9. 不结婚不生孩子,离婚率15连涨,中国正在步入“低欲望社会”吗?
  10. 如何迅速分析出系统CPU的瓶颈在哪里?
  11. Java 并发系列之十三:安全发布
  12. oracle数据库出错0095,一种ORACLE数据库优化配置的方法及系统专利_专利查询 - 天眼查...
  13. python 字节字符串_Python字符串转换为字节,字节转换为字符串
  14. mongodb 扩展 libmongoc ssl_扩展面板
  15. TensorRT | 入门篇
  16. S参数三要素无源性(Passive),互易性(Reciprocoty)和因果性(Causality)
  17. c语言循环的三个要素是什么意思,什么是循环结构知识点详解
  18. Java基础知识Day08---Scaner类
  19. FOC控制笔记 -基本术语概念
  20. 微信群很多怎么管理?针对这个问题,今天教你几招。

热门文章

  1. VTK:几何对象之EllipticalCylinderDemo
  2. OpenCV基于均值漂移的跟踪的实例(附完整代码)
  3. QT实现太阳系系统八大行星
  4. linux虚拟网桥配置nat,使用NAT在Proxmox VE 6上创建专用网桥的方法
  5. Minimum supported Gradle version is 6.5. Current version is 6.1.1. If using the gradle wrapper, try
  6. Ambari2.7.4+HDP3.1.4.0中配置fair-scheduler
  7. 项目质量管理知识点整理和习题整理
  8. spring+cxf调用webservice接口
  9. python画车辆轨迹图,在python中绘制轨道轨迹
  10. python读取.nii.gz文件并展示医学图片