--- tags: jQuery,javascript --- # jQuery中事件觸發之物件參數傳遞 這是一個演示如何在 jQuery 中安全地傳遞複雜物件參數的測試專案。 ## 專案概述 本專案展示了如何將 JavaScript 物件轉換為 JSON 字串,並透過 URI 編碼確保在 HTML 屬性中安全傳遞參數。這在動態生成 HTML 元素並需要傳遞複雜資料結構時特別有用。 - ✅ 物件到 JSON 字串的轉換 - ✅ URI 編碼確保 HTML 屬性安全性 ## 技術實現 ### 核心流程 1. **物件定義**:建立包含不同資料類型的參數物件 2. **JSON 序列化**:使用 `JSON.stringify()` 將物件轉為字串 3. **URI 編碼**:使用 `encodeURIComponent()` 確保字串在 HTML 屬性中安全 4. **HTML 生成**:動態建立包含編碼參數的按鈕元素 5. **參數解析**:在事件處理函數中解碼並還原原始物件 ### 程式碼說明 ```javascript const args = { a: 123, b: "456", c: [ 123, "456" ] } // 1. 物件轉成JSON字串 const argsString = JSON.stringify(args) // 2. 對JSON字串進行URI編碼, 以確保在HTML屬性中是安全的 const encodedArgString = encodeURIComponent(argsString) // 3. 產生html字串 // ps. onclick所使用的函數參數需要用單引號包裹, 以避免與JSON字串內部的雙引號衝突 const htmlString = `<button onclick="testFunction1('${encodedArgString}')">Click me 1!</button>` $("body").append(htmlString) function testFunction1(argString) { try { const decodeString = decodeURIComponent(argString) const parsedParams = JSON.parse(decodeString); console.log("成功解析參數物件:", parsedParams); } catch (e) { console.error("解析 JSON 字串失敗:", e); } } ``` ## 技術要點 ### 為什麼需要 URI 編碼? - JSON 字串包含雙引號,直接放在 HTML 屬性中會造成語法錯誤 - URI 編碼確保特殊字元不會破壞 HTML 結構 - 提供安全的資料傳遞機制 ### 引號使用注意事項 - onclick 屬性使用雙引號包裹 - 函數參數使用單引號包裹,避免與 JSON 內部雙引號衝突 - 這種搭配確保 HTML 語法正確性 ## 資料屬性 (Data Attributes) 方法 除了使用 onclick 事件外,我們也可以使用 HTML5 的 data attributes 配合 jQuery 事件監聽器來實現相同功能。 ### 實現方式 ```javascript // 1. 建立按鈕元素並設定 data attribute const $button2 = $('<button>Click me 2!</button>') .attr('data-params', argsString) // 直接使用JSON字串,不需要URI編碼 .addClass('data-button') $("body").append($button2) // 2. 使用 jQuery 事件監聽器 $(document).on('click', '.data-button', function() { testFunction2($(this)) }) function testFunction2($element) { try { const jsonString = $element.attr('data-params'); const parsedParams = JSON.parse(jsonString); console.log("方法2 (data attributes) - 成功解析參數物件:", parsedParams); } catch (e) { console.error("方法2 (data attributes) - 解析 JSON 字串失敗:", e); } } ``` ### Data Attributes 的優勢 - ✅ **不需要 URI 編碼**:data attributes 可以直接儲存 JSON 字串 - ✅ **更好的分離**:HTML 結構與 JavaScript 邏輯分離 - ✅ **事件委派**:支援動態添加的元素 - ✅ **更簡潔的 HTML**:避免內聯 JavaScript 代碼 ## 兩種方法比較 | 特性 | onclick 方法 | Data Attributes 方法 | |------|-------------|---------------------| | **編碼需求** | 需要 URI 編碼 | 不需要編碼 | | **HTML 複雜度** | 較複雜(內聯 JS) | 較簡潔 | | **程式碼分離** | HTML/JS 混合 | 完全分離 | | **事件委派** | 不支援 | 天然支援 | | **除錯難度** | 較困難 | 較容易 | | **效能** | 略快(直接調用) | 略慢(需查找元素) | | **維護性** | 較差 | 較好 | ### 建議使用場景 **使用 onclick 方法當:** - 需要最佳效能 - 簡單的靜態頁面 - 不需要事件委派 **使用 Data Attributes 方法當:** - 需要更好的程式碼組織 - 動態生成大量元素 - 需要事件委派功能 - 重視程式碼維護性 ## 總結 兩種方法都能有效地傳遞複雜物件參數,選擇哪種方法主要取決於專案需求和程式碼架構偏好。Data Attributes 方法在現代 Web 開發中更受推薦,因為它提供了更好的程式碼分離和維護性。