2010-02-06 82 views
2

讓我給我一些問題的背景。我有一個JavaScript小部件。該小部件包含來自我的網站的jQuery副本。此小部件放置在第三方網站上。小部件解析JSON供稿並將內容注入DOM。很簡單的東西。我可以重置jQuery全局對象的名稱嗎?

如果第三方頁面已經引用了jQuery並依賴於jQuery插件,則可能會出現衝突。尤其是當第三方網站引用不同版本的jQuery時。 $ .noConflict()很有用,但是插件的存在使得它不可靠。從$.noConflict() documentation

如果有必要,我們可以通過一個參數傳遞true作爲 的方法騰出 jQuery的名稱爲好。這是 很少需要,如果我們必須做 本(例如,如果我們需要使用jQuery的 庫 多個版本在同一頁面上),我們需要 考慮到大多數插件依靠 的jQuery變量 的存在,並且在此 的情況下可能無法正確運行。

爲了解決這個問題,我的想法是重置jQuery全局對象的名稱。在jQuery的源的底部,有這些行:

// Expose jQuery to the global object 
window.jQuery = window.$ = jQuery; 

我可以重構行:

// Expose jQuery to the global object 
window.myjQuery = jQuery; 

我已經刪除了速記$變量,我已經改變了jQuery myjQuery。現在我的代碼看起來像這樣:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <title>myjQuery</title> 
    <script type="text/javascript" src="myjquery-1.4.js" /> 
    <script type="text/javascript"> 
     // .ready() can alias the jQuery object 
     // I can pass $ and write code as normal 
     myjQuery(document).ready(function($) { 
     $('p').css('color', 'red'); 
     }); 

     // Fails 
     jQuery(document).ready(function($) { 
     $('p').css('color', 'blue'); 
     }) 

     // Fails 
     $(document).ready(function() { 
     $('p').css('color', 'green'); 
     }) 

    </script> 
</head> 
<body> 
    <p>myjQuery changed my color to red.</p> 
</body> 
</html> 

這是個好主意嗎?我不知道圖書館的內部可以肯定地說。我知道這個庫基本上是一個閉包,所以我猜這種方法是可以的。思考?

編輯:我接受了Doug的回答,因爲他提供的代碼幾乎與$ .noConflict()文檔頁面上的示例相同。我沒有注意到它。這裏是例子:

// Completely move jQuery to a new namespace in another object. 
var dom = {}; 
dom.query = jQuery.noConflict(true); 

// Do something with the new jQuery 
dom.query("div p").hide(); 

// Do something with another library's $() 
$("content").style.display = 'none'; 

// Do something with another version of jQuery 
jQuery("div > p").hide(); 

回答

4

如果你不需要編輯一個已發佈的文件通常不是一個好主意。我讀了你的問題,這個解決方案可以滿足你的需求。根本不要編輯jQuery核心。這樣做:

<script type="text/javascript" src="jquery-1.4.js"></script> 
<script type="text/javascript"> 
    // Revert $ and jQuery to their original values: 
    window.myjQuery = jQuery.noConflict(true); 
    (function($){ 
    // Inside here, $ = myjQuery 

    $(document).ready(function(){ 

    }); 
    })(window.myjQuery); 
</script> 

重要的是你的小工具,包括jQuery的,然後立即呼叫noConflict(true)並將其存儲在一個變量。

如果您完全按照這些步驟操作,它不會影響頁面上現有的jQuery實例或插件。它只會爲您自己的插件在變量myjQuery中爲您提供jQuery的私有版本。

其次,使用自動執行的匿名函數,您可以爲您的小部件創建一個專用作用域,其中$等於您包含的jQuery文件。

+0

發表了一篇文章,說如果他們需要的話就可以了;像這個解決方案更好。 – Matchu 2010-02-06 01:45:12

+0

Doug,感謝您的解釋和例子! – simeonwillbanks 2010-02-06 02:21:53

+0

@simeonwillbanks樂意幫忙!我只注意到一件事。您的腳本標記使用了空標記語法:''代替。祝你好運與你的部件! – 2010-02-06 02:27:50

相關問題