# ⚙ jQuery 筆記 > [jQuery 官網](https://jquery.com/) :::info 可於「開發人員工具」的『Console』介面,進行 jQuery 測試及除錯 ::: - 動態改變 CSS 效果 - 支援各類型的瀏覽器,具兼容性 :smile: - 將程式碼簡化並包裝得非常漂亮,簡單的 code 就能觸發想要的效果 - 透過瀏覽器去跟資料庫要資料,再渲染到網頁上 - 底層是 JavaScript,設定完許多兼容 js 的語法及動畫效果,比如:CSS 屬性、HTML 屬性及插入、物件選取器、AJAX、jQery 核心、Plugin 加載、滑動效果、淡入淡出等… --- ```javascript // javascript const house = document.getElementById("house") 搖動(house) function 搖動(dom){ ... } ``` ```javascript // jQuery $(document).ready(function () { $("#house").搖動() }) ``` <br> - `$(document).ready(function () { ... })` 確保 jQuery 有正確載入到瀏覽器後才執行裡面的程式碼 - `$('選取器')` 為指定欲觸發的選取器,可用單引號 <kbd>' '</kbd> 或雙引號 <kbd>" "</kbd> 括起來 - `函式名稱(function () { })` 觸發事件 - `.函式名稱()` 動畫效果。小括號內可放**毫秒數**。表示:動畫持續時間 = 總花費時間 <br> > **小提醒:** 在 JavaScript 中,用單引號 `'` 或雙引號 `"` 包住字串沒有差異性 唯一要注意的是「雙引號裡面不能有重複的雙引號,單引號也是」 通常會比較建議使用單引號括起來,有巢狀時最外層再使用雙引號 > ```javascript > var str = "This is a "book"."; // 錯誤的寫法 > var str = 'This is a 'book'.'; // 錯誤的寫法 > var str = 'This is a "book".'; // 正確的寫法 > ``` <br> ## 引入方法 1. **CDN 載入** - 來源:https://releases.jquery.com/ - 來源:https://cdnjs.com/libraries/jquery 2. **至[官網下載整包檔案](https://jquery.com/download/),將檔案放到專案資料夾裡,再載入** ```html <script src="路徑/jquery.min.js"> ``` > 放在 </body> 前~ :cat2: <br> ## 其他附註 > [選擇器 (selector) 介紹](https://ithelp.ithome.com.tw/articles/10095237) - ### Event 事件處理器 Event 全名叫做「event handlers」也就是事件處理器,而它會記錄使用者的所有行為 講白話點就是,會 ==紀錄你點擊這個事件時的動作==,例如在哪裡點,點了什麼元素~ - ### 取消默認行為 `e.preventDefault()` 要先清除預設行為,才可增加其他功能到該標籤上~ 1. 點擊擁有 `href="#"` 的 a 連結,正常來說是會跳到網頁最上方,但在某些需求上,是希望點擊 a 連結為關閉的功能(比如:彈出視窗右上角的叉叉) 2. `<input type="submit">` 送出按鈕若需清除預設行為,要先確認該 input 是否有被包在 `<form>` 裡,且 `type` 屬性值不是 `button` 有被包在 form 標籤內且 `type="submit"`(沒寫 type 預設也是 submit)才會有預設的**傳統表單送出功能** <br> > 要取消觸發預設行爲,需將該 e.preventDefault() 擺在後續程式碼的執行之前 ```javascript $("a.close").click(function (e) { e.preventDefault() // 取消默認事件後的下一行擺替補的行為 }) ``` - ### `on` 監聽 ```javascript $('範圍').on('事件名稱', '範圍內欲監聽的選擇器', function () { }) ``` ```javascript $('選擇器').on('事件名稱(可多個,用逗號區隔)', function () { }) ``` #### 知識點: `onerror` 事件 當加載圖片發生錯誤、無法正常顯示圖片時,會觸發 `onerror` 事件 :dango: 例子:沒有 app.png 這張圖 ```html <img src="../document/app.png" onerror="this.src='../document/error.png'"> ``` - ### 鍊式寫法 > [CodePen 範例](https://codepen.io/PeiHan/pen/MWeqBxZ) 各函式間寫上點點 `.` 當作連接,依序寫出要呈現的連續動畫效果 ```javascript // 點擊按鈕時,會觸發 box 每次以 700 毫秒做收合、展開連續 2 round 的事件 $("button").click(function () { $(".box").slideUp(700).slideDown(700).slideUp(700).slideDown(700) }) ``` - ### 判斷元素是否存在 在 JavaScript 用 `querySelector` 等方式選取元素時,若該元素「不存在」會回傳 **`null`** 而 jQuery 則是可用 `.length` 查看,若回傳 **`0`** 表示沒有該元素! ```javascript $('.header').length // != 0 有存在 ; == 0 不存在 ``` > 僅返回 prevObject 也是表示該選擇器不存在於頁面ㄛ!但要用 length 才查得出來啦XD - ### 動態創建 HTML 元素 > [官方文件](https://api.jquery.com/jQuery/#entry-examples-1) 可以使用以下的方式,搭配 `append` 或 `appendTo` ...等創建 ```javascript $('<HTML tag/>', { attr1: 'value1', attr2: 'value2', ... }) ``` :arrow_right: [範例 CodePen](https://codepen.io/PeiHan/pen/OJxNZqE?editors=1011) 當然也可以直接把屬性寫在 HTML 標籤上,但屬性太多的話就會落落長,可讀性比較差一些 - ### 迴圈 `.each()` ```javascript // 用 jQuery 選取的元素專用 $(selector).each(function (index, element) { }) // 陣列、jQuery 選取的元素都能用 $.each(列表, function (index, element) { }) ``` > 第 1 個參數:索引 > 第 2 個參數:元素本身 :arrow_right: [範例 CodePen](https://codepen.io/PeiHan/pen/GRBNbmN?editors=0011) #### :maple_leaf: 脫離 each 迴圈: ```javascript $.each(data, function(index, obj){ if (index == 1) { return // 等於 continue } else { return false // 等於 break } }) ``` 1. **`return`** :arrow_right: 等於 `continue`,會中斷該次迴圈輪次,接續下個輪次 2. **`return false`** :arrow_right: 等於 `break`,直接中斷整個迴圈 <br> ## 各種 [jQuery](https://api.jquery.com/) 函式名稱 > [辭典官網](https://oscarotero.com/jquery/) - ### 動畫效果 Effects | 函式名稱 | 解釋 | Remark & Example | | -------- | -------- | -------- | | .animate() | 自訂動畫效果 | `.animate(properties [,duration] [,easing] [,complete] )` | | .hide() | 快速隱藏 | | .show() | 快速顯示 | | .fadeIn() | 淡入 | | .fadeOut() | 淡出 | | .slideUp() | 滑動式收合 | `$('a').slideUp(1000)` 收合時間持續一秒 | | .slideDown() | 滑動式展開 | | .toggle() | 可顯示及隱藏 | <font color="red">互動式</font> | | .slideToggle() | 可滑動式顯示及隱藏 | <font color="red">互動式</font> | | .fadeToggle() | 淡入顯示及淡出隱藏 | <font color="red">互動式</font> | | .delay() | 延遲 | [CodePen 範例](https://codepen.io/PeiHan/pen/pobqRgb) | | .stop() | 中斷目前動畫,進行下一個動畫 | [CodePen 範例](https://codepen.io/PeiHan/pen/QWEzqQR)| - ### 屬性 Attributes |  函式名稱  | 解釋 | Remark & Example | | -------- | -------- | -------- | | .css() | 可新增、修改 CSS 屬性值 | `.css('屬性','屬性值')` <br> 會以 *inline-style* 的方式加上樣式 [CodePen 範例](https://codepen.io/PeiHan/pen/abZPmXz) | | .attr() | 取得/增加/修改 HTML 標籤屬性 | `$('a').attr('href', 'http://google.com')`,若沒有第二個參數,就是取得該屬性 value <br><br> <font color="red">可以用**物件**寫法一次設定多個屬性。[CodePen 範例](https://codepen.io/PeiHan/pen/ZEvWbzW?editors=1010)</font> | | .removeAttr() | 移除屬性 | | [.data()](https://api.jquery.com/data/) | 取得「初始的有值」的 data-* 資料,括號內可放 * 名稱 <br> 若後來動它的值,則只會秀出原始的 | `<p data-id="0912">測試</p>` <br><br> `$('p').data('id');` 回傳 `'0912'` | | .hasClass() | 檢查元素是否包含指定 class 名稱 | 回傳布林值 | | .addClass() | 加入 class | class 前不需加 `.` 點點 <br> 例如:`.addClass('active')` 加入 active 樣式| | .removeClass() | 移除 class | class 前不需加 `.` 點點 | | .toggleClass() | 可切換 class | 動態載入 class 樣式| | .val() | 取得、設置表單元素 value | | .text() | 清空原始內容,再載入**新內容** | 插入、取出「純文字字串」 | | .html() | 清空原始內容,再載入**新內容** | 可載入「HTML 元素」,跟 JS 的 `innerHTML` 相同 | | .remove() | 移除元素本身 | `.remove()` 是完全移除;<br>`.hide()` 則是暫時隱藏,還是會存在於瀏覽器內 | .empty() | 清空元素**內容** | 無法清空表單元素,表單需使用 `.val('')` 方法 | | .prop() | 取得/增加/修改 HTML 標籤屬性 | 注意:應用在具有 checked 屬性的元素時,若是勾選的狀態會回傳 `true` 反之則是 `false` <br><br> 假若使用 `.attr()` 取得勾選狀態,則會回傳 `checked` 或 `undefined` | | .is(":hidden") | 元素是否不可見 | | .is(":visible") | 元素是否可見 | - #### 移除表單元素的 checked 狀態 :warning: 首先,checked 屬性區分值的部分,是只要寫有 checked 字眼就是就一定會打勾 如果要取消打勾狀態,是不能寫成 `checked="false"` 的,這樣也會被視為 checked,只能把 checked 完全移除掉 所以若要用 jQuery 移除 checked 狀態,有以下幾個寫法<font color="gray">(第一個寫法是錯誤的!)</font> 1. :x: `.attr('checked', false)` 2. :o: `.prop('checked', false)` 3. :o: `.removeAttr('checked')` - #### 可以用 `.prop('innerHTML')` 或 `.prop('outerHTML')` 獲取 HTML ```html <div id="test" class="bg-dark"> <span>(ˊ_ˋ)</span>測試 </div> ``` - ##### `outerHTML` 包含元素本身 ```html <div id="test" class="bg-dark"><span>(ˊ_ˋ)</span>測試</div> ``` - ##### `innerHTML` 「不」包含元素本身 ```html <span>(ˊ_ˋ)</span>測試 ``` - ### 篩選元素 Traversing > [CodePen 範例(結合 this, siblings, parent, find)](https://codepen.io/PeiHan/pen/VwjgQaK) | 函式名稱 | 解釋 | Remark & Example | | -------- | -------- | -------- | | $(this) | 選取器本身 | | .closest(selector) | 往父階層尋找,只要找到符合條件的就停止 | | .parent(selector) | 尋找上一層父階層元素 | 僅爸爸,不包含祖字輩 | | .parent**s**(selector) | 尋找所有父階層元素 | 含祖字輩 | | .siblings(selector) | 尋找同階層元素 | 朋友 | | .children(selector) | 尋找下一層子元素內容 | 僅兒子,不包含孫字輩 | | .find(selector) | 尋找所有子元素內容 | 含孫字輩 | | .next() | 尋找指定元素的「下一個」鄰元素 | | .prev() | 尋找指定元素的「前一個」鄰元素 | | [:eq(index)](https://api.jquery.com/eq/) | 回傳第 index 個元素,也可以寫成`$(selector:eq(index))` | - ### 其他函式 | 函式名稱 | 解釋 | Remark & Example | | -------- | -------- | -------- | | [.on()](https://blog.wu-boy.com/2012/04/use-on-api-to-attach-event-handlers-on-jquery/) | 綁定事件 | 可即時性<font color="red">監聽 </font>jQuery 動態載入 HTML 的效果。 [CodePen 範例](https://codepen.io/PeiHan/pen/LYZKjEy) | | .off('事件名稱') | 移除綁定 | | $(selector).append(content) | 於元素**尾端**++追加++內容或元素 | 在 selector 最尾端插入 content。 [CodePen 範例](https://dotblogs.com.tw/topcat/2009/12/28/12702)| | $(content).append**To**(selector) | 於元素**尾端**++追加++內容或元素 | 把 content 加入在 selector 最尾端 | | $(selector).prepend(content) | 於元素**開頭**++追加++內容或元素 | 在 selector 開頭插入 content | | $(content).prepend**To**(selector) | 於元素**開頭**++追加++內容或元素 | 把 content 加入在 selector 開頭 | | $(selector).clone(includeEvents) | 複製 selector | `includeEvents`:是否也複製元素的所有事件處理,預設 `false` | | $(selector).before(content) | 在元素**前面**插入指定內容1 | | $(content).insertBefore(selector) | 在元素**前面**插入指定內容2 | | $(selector).after(content) | 在元素**後方**插入指定內容1 | | $(content).insertAfter(selector) | 在元素**後方**插入指定內容2 | | .parseHTML() | 將 HTML 字符串或 jQuery 選擇的元素,解析為對應的 DOM 節點數組 | <br> ## 第三方 Plugin(插件) <img src="https://i.imgur.com/ax5lu8v.png" width="80%"> ### 須知 1. 確認熱門瀏覽器有無支援 2. 確保載入的套件 CSS、JS、img 都有正確載入 3. 若發現出錯,打開 Console 確認是否有錯誤 4. 查詢插件的 JS 設定 5. 修改 CSS 成自己要的樣式 ### 套件 - #### [Swiper 輪播](https://swiperjs.com/) 可支援手機用戶的使用體驗,是兼容性最讚的一個插件 - #### [Lightbox 燈箱](https://lokeshdhakar.com/projects/lightbox2/) <br> <br> ###### tags: `jQ 筆記`