2012-08-17 61 views
0

我想使用RequireJS來加載jQuery(我開發的模塊應該在jQuery可能已經初始化的非受控環境中工作),但是在需要不同版本的jQuery時會出現一些問題。結果是不可預測的。內部需要功能塊jQuery版本是隨機的。哪裏不對? 這裏是代碼來說明問題: RequireJS不同的jQuery

<!DOCTYPE html> 
<html> 
<head> 
    <script data-main="scripts/main" src="http://ajax.cdnjs.com/ajax/libs/require.js/0.24.0/require.min.js"></script> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script> 
</head> 
<body> 

<script> 
    console.log(jQuery.fn.jquery); 

    setTimeout(function(){ 
     require(["http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"], function() { 
     console.log($.fn.jquery); 
     }); 
    },1000); 
    setTimeout(function(){ 
     require(["http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js"], function() { 
     console.log($.fn.jquery); 
     }); 
    },2000); 

    setTimeout(function(){ 
     require(["http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.js"], function() { 
     console.log($.fn.jquery); 
     }); 
    },3000); 

    setTimeout(function(){ 
     require(["http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js"], function() { 
     console.log($.fn.jquery); 
     }); 
    },4000); 

    setTimeout(function(){ 
     require(["http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"], function() { 
     console.log($.fn.jquery); 
     }); 
    },5000); 

    setTimeout(function(){ 
     require(["http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"], function() { 
     console.log($.fn.jquery); 
     }); 
    },6000); 

    setTimeout(function(){ 
     require(["http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js"], function() { 
     console.log($.fn.jquery); 
     }); 
    },7000); 

    setTimeout(function(){ 
     require(["http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.js"], function() { 
     console.log($.fn.jquery); 
     }); 
    },8000); 

    setTimeout(function(){ 
     require(["http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"], function() { 
     console.log($.fn.jquery); 
     }); 
    },9000); 
</script> 
</body> 
</html> 

結果是:

1.6.2 
1.8.0 
1.4.4 
1.8.0 
1.8.0 
1.6.2 
1.6.2 
1.6.2 
1.6.2 
1.6.2 
+1

我假設'需要()'函數是異步的?如果是這樣,則不能保證您的console.log語句將按照它們寫入的順序執行。 – 2012-08-17 08:11:24

+0

是的,require是異步的,但require的目的之一是在封閉函數內部封裝了代碼塊,理論上每個require都應該包含作爲第一個參數傳遞的jQuery版本。 – Alexander 2012-08-17 08:52:48

回答

0

假設你使用jQuery的AMD (Asynchronous Module Definition)兼容版本,jQuery對象應該可作爲函數的第一個參數:


require(["some_version_of_jquery.js"], function(jQuery) { 
     console.log(jQuery.fn.jquery); 
     }); 

因此,函數內可用的jQuery對象在本地範圍rath而不是全球定義的。

如果你不使用AMD兼容的版本,那麼你將不得不使用RequireJS Shim config.