萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網頁製作 >> 互動設計

從零開始學習 jQuery (三):jQuery 包裝集管理 —— 動態創建、篩選、切片與鏈式操作

動態創建元素:摒棄 innerHTML,擁抱標準

錯誤示範

// 錯誤:頁面載入時修改 innerHTML,易導致 IE「終止操作」、違反 DOM 標準、事件綁定丟失
document.getElementById("container").innerHTML = "
新內容
";

正確方式一:原生 DOM API

var div = document.createElement("div");
div.textContent = "新內容";
document.getElementById("container").appendChild(div);

正確方式二:jQuery 工廠函數 $()

// 1. 簡單標籤 (內部用 createElement,效能最佳)
$("
").text("新內容").appendTo("#container"); // 2. 複雜 HTML 字串 (內部用 innerHTML) $("
內容
").appendTo("#container"); // 3. 指定屬性建立 (1.4+) $("", { href: "https://example.com", target: "_blank", text: "連結", class: "btn", click: function(e) { track("click"); } }).appendTo("#nav");

頁面就緒時機:$(document).ready()

// 標準寫法
$(document).ready(function() { /* DOM 就緒,圖片未必載入完 */ });

// 簡寫 (推薦)
$(function() { /* 同上 */ });

// 多個 ready 會依序執行,優於 window.onload (需等圖片/資源)
window.onload = function() { /* 所有資源載入完 */ };

包裝集管理核心 API 分類

1. 存取與轉換

方法說明回傳
.get()取得原生陣列Array
.get(index)取得單個 DOM 元素Element / undefined
[index]直接索引取得 DOM 元素Element
.toArray()同 .get()Array
.index()元素在包裝集/同輩中的索引Number

2. 篩選 Filtering (最常用)

方法說明範例
.eq(index)取得第 N 個 (負數從後)$("li").eq(0) 第一個
.first() / .last()首/尾元素$("li").first()
.slice(start, end)切片 [start, end)$("li").slice(1,3) 第2,3個
.filter(selector|fn)保留符合條件者$("li").filter(".active") / .filter(function(){ return $(this).text().length>5; })
.not(selector|fn|element)移除符合條件者 (反 filter)$("li").not(".active")
.has(selector|element)保留包含特定後代的元素$("li").has("ul")
.is(selector|fn|element)檢查是否符合,**回傳布林**if ($(this).is(".active")) ...
.map(fn)映射轉換,回傳新包裝集$("input").map(function(){ return this.value; })

3. 尋找後代/祖先/同輩 (遍歷)

方法方向說明
.find(selector)後代**最常用**,深度搜尋後代
.children(selector)子代僅直接子元素
.parent(selector)父代單層父元素
.parents(selector)祖先所有祖先至 html,可篩選
.parentsUntil(selector)祖先直到符合選擇器為止
.closest(selector)祖先**從自身向上找第一個符合** (含自身),極常用於委派事件中找容器
.siblings(selector)同輩所有兄弟元素
.next() / .nextAll() / .nextUntil()後同輩下一個/所有後面/直到
.prev() / .prevAll() / .prevUntil()前同輩上一個/所有前面/直到

4. 添加與合併

  • .add(selector|elements|html):將新元素加入包裝集 (去重)。
  • .addBack() (1.8+):加入前一次操作前的包裝集 (舊 .andSelf() 棄用)。
  • .contents():取得子節點 (含文字節點),iframe 可取得文檔。

5. 迭代與鏈式控制

.each(function(index, element) {
  // this === element (原生 DOM)
  // return false 終止迴圈 (break)
  // return true 繼續下一個 (continue)
});

// 終結鏈式,回傳上一個包裝集
$("div").find("span").addClass("hi").end().addClass("container");

實戰範例:動態產生表格並綁定事件委派

function renderUserTable(users) {
  var $tbody = $("#userTable tbody").empty();
  var $frag = $(document.createDocumentFragment()); // 文檔片段,批量掛載後一次重繪

  $.each(users, function(i, user) {
    var $tr = $("", { "data-id": user.id }).append(
      $("").text(user.name),
      $("").text(user.email),
      $("").append(
        $("

效能與最佳實踐

  • **批量 DOM 操作用 DocumentFragment** 或先組字串最後 .html()。
  • **快取選擇器結果**:var $list = $("#list"); 避免重複查詢。
  • **優先用 .find() 而非完整選擇器**:$container.find(".item") 比 $("#container .item") 快。
  • **事件委派代替大量綁定**:動態列表必須委派。
  • **釋放記憶體**:移除元素前 .off() 解綁事件、.removeData() 清資料。

精通包裝集管理,能讓你像操作陣列一樣靈活控制 DOM 集合,配合鏈式呼叫寫出流暢、高效的代碼。

copyright © 萬盛學電腦網 all rights reserved