談談 jQuery 中的防衝突(noConflict)機制
許多的 JS 框架類庫都選擇使用 $ 符號作為函式或變數名,jQuery 是其中最為典型的一個。在 jQuery 中,$ 符號只是 window.jQuery 物件的一個引用,因此即使 $ 被刪除,window.jQuery 依然是保證整個類庫完整性的堅強後盾。jQuery 的 API 設計充分考慮了多框架之間的引用衝突,我們可以使用 jQuery.noConflict 方法來輕鬆實現控制權的移交。
jQuery.noConflict 方法包含一個可選的布林引數[1],用以決定移交 $ 引用的同時是否移交 jQuery 物件本身:
jQuery.noConflict([removeAll])
預設情況下,執行 noConflict 會將變數 $ 的控制權移交給第一個產生 $ 的庫;當 removeAll 設定為 true 時,執行 noConflict 則會將 $ 和 jQuery 物件本身的控制權全部移交給第一個產生他們的庫。
例如在 KISSY 和 jQuery 混用,並且慣用 $ = KISSY 來簡化 API 操作的時候,就能夠通過這個方法解決命名衝突的問題。
那麼這個機制是如何實現的呢?閱讀 jQuery 原始碼開頭[2],首先做的一件事情是這樣的:
// Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$,
容易理解的是,jQuery 通過兩個私有變數對映了 window 環境下的 jQuery 和 $ 兩個物件,以防止變數被強行覆蓋。一旦 noConflict 方法被呼叫,則通過 _jQuery, _$, jQuery, $ 四者之間的差異,來決定控制權的移交方式,具體的程式碼如下:
noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }
再來看上面所說的引數設定問題,如果 deep 沒有設定,_$ 覆蓋 window.$,此時 jQuery 別名 $ 失效,但 jQuery 本身完好無損。如果有其他類庫或程式碼重新定義了 $ 變數,它的控制權就完全交接出去了。反之如果 deep 設定為 true 的話,_jQuery 覆蓋 window.jQuery,此時 $ 和 jQuery 都將失效。
這種操作的好處是,不管是框架混用還是 jQuery 多版本共存這種高度衝突的執行環境,由於 noConflict 方法提供的移交機制,以及本身返回未被覆蓋的 jQuery 物件,完全能夠通過變數對映的方式解決衝突。
但無法避免的事實是可能導致的外掛失效等問題,當然通過簡單修改上下文引數即可恢復 $ 別名:
var query = jQuery.noConflict(true); (function ($) { // 外掛或其他形式的程式碼,也可以將引數設為 jQuery })(query);
[1] http://api.jquery.com/jQuery.noConflict/#jQuery-noConflict-removeAll
[2] https://github.com/jquery/jquery/blob/master/src/core.js
相關文章
- jQuery.noConflict()實現防衝突原理機制簡單介紹jQuery
- $.noConflict()方法實現防衝突原理介紹
- 談談JavaScript中的this機制JavaScript
- jQuery.noConflict() 方法—— jquery庫與其他庫衝突的問題解決jQuery
- 簡談專案的衝突的管理(轉)
- jQuery的$命名衝突jQuery
- 談談jQuery中Ajax那些事jQuery
- 談談 JVM 垃圾回收機制JVM
- 談談ConcurrentHashMap的擴容機制HashMap
- 淺談雜湊法及其解決衝突的方法
- jQuery多庫衝突jQuery
- 談談 Java 類載入機制Java
- 談談比特幣的機制及攻擊比特幣
- 談談 HTTP/2 的協議協商機制HTTP協議
- 談談我對Android安全機制的理解Android
- [譯]談談SpringBoot 事件機制Spring Boot事件
- 談談 Event Loop(事件迴圈)機制OOP事件
- 反射機制 小小談反射
- 淺談jQuery中的工具方法jQuery
- 淺談Android中的事件分發機制Android事件
- JVM探究(一)談談雙親委派機制和沙箱安全機制JVM
- 從JS的執行機制的角度談談作用域JS
- JQuery外掛定義&&談談jquery的實現jQuery
- jQuery.noConflict()jQuery
- 再談冪等機制
- Java 同步機制淺談Java
- 解決jquery和其他庫的衝突jQuery
- 談談戰雙的戰鬥機制設計趨同
- 淺談 LiveData 的通知機制LiveData
- Android 之 “只是想來談談 Handler 機制”Android
- [譯] 前端面試:談談 JS 垃圾回收機制前端面試JS
- 淺談jQuery中$.proxy()工具方法jQuery
- 淺談jquery中prop()和attr()jQuery
- Python併發程式設計之談談執行緒中的“鎖機制”(三)Python程式設計執行緒
- 淺談任務分發中的機制與併發
- 談談 Javascript 的執行機制及對同步非同步的理解JavaScript非同步
- 淺談JS事件機制與React事件機制JS事件React
- 使用SUI與JQuery衝突的解決方法UIjQuery