RequireJS другой jQuery

Я хотел бы использовать RequireJS для загрузки jQuery (модуль, который я разрабатываю, должен работать в неконтролируемой среде, где jQuery может быть уже инициализирован), но есть некоторые проблемы, когда требуются разные версии jQuery. Результаты неожиданны. Внутри требуемого функционального блока версия 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

person Alexander    schedule 17.08.2012    source источник
comment
Я предполагаю, что функция require() асинхронна? Если это так, нет никакой гарантии, что ваши операторы console.log будут выполняться в том же порядке, в котором они написаны.   -  person Anthony Grist    schedule 17.08.2012
comment
Да, требование является асинхронным, но одна из целей требования состоит в том, чтобы инкапсулировать блок кода внутри закрытия функции, и теоретически каждое требование должно содержать версию jQuery, которая передается в качестве первого параметра.   -  person Alexander    schedule 17.08.2012


Ответы (1)


Предполагая, что вы используете AMD (определение асинхронного модуля) совместимые версии jQuery, объект jQuery должен быть доступен в качестве первого аргумента функции:


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

Таким образом, объект jQuery, доступный внутри функции, определяется в локальной области видимости, а не в глобальной.

Если вы не используете версии, совместимые с AMD, вам придется использовать Требуется конфигурация оболочки JS.

person lorefnon    schedule 17.08.2012