Использование Javascript Loader с jQuery "undefined" - PullRequest
1 голос
/ 27 июня 2011

Я использую Javascript Loader [requireJS], который загружает скрипты параллельно с контентом - однако у меня есть проблема.то есть

require('http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js');

Обычно - в качестве «резервной копии» - я использовал

<script type="text/javascript">
  if (typeof jQuery == 'undefined') {
    document.write(unescape("%3Cscript src='/scripts/jquery-1.4.4.min.js' type='text/javascript'%3E%3C/script%3E"));
  }
</script>

Однако при использовании загрузчика java-скриптов - это ВСЕГДА будет отображать jQuery «неопределенным» -потому что JS и контент загружаются параллельно.

Эффект в основном заключается в том, что вы загружаете jQuery 2x - т.е. 1x через загрузчик javascript и 1 - через "jquery == undefined".

Как можноЯ заставляю "резервную копию" работать с загрузчиком javascript?

1 Ответ

1 голос
/ 27 июня 2011

Насколько я знаю, requirejs обычно используется так:

require(['http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js'],
    function() {
        // Code that depends on jQuery here.
    }
);

Функция, зависящая от jQuery, будет вызываться только при загрузке jQuery. Но если jQuery не загружается, код, который зависит от него, никогда не будет выполнен.

Поскольку в этом случае вы хотите попробовать использовать локальный jQuery, вам, вероятно, следует отследить ошибку тайм-аута загрузки скрипта и попытаться загрузить jQuery из другого источника. (Но учтите, что ошибки тайм-аута медленные.)

В документах :

мало информации об обработке ошибок

Чтобы обнаружить ошибки, вы можете переопределить require.onError(), чтобы получить ошибки. Объект ошибки, переданный в функцию onerror, будет содержать два свойства, если это проблема тайм-аута:

  • requireType : значение будет "timeout"
  • requireModules : массив имен модулей / URL, время которых истекло.

Я думаю, код может выглядеть так (не проверено):

var functionThatDependsOnJquery = function() {
    // Code that depends on jQuery here.
};

require.onError = function(err) {
    # If we have Google jQuery load timeout...
    if (err.requireType = "timeout" &&
        err.requireModules.indexOf('http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js') != -1
        ) {
        # ...we'll try to load it from another source.
        require(['/scripts/localJquery'], functionThatDependsOnJquery);
    }
    # We have another script load timeout, so we just throw an error
    # as requirejs normally does.
    else { throw err; }
};

# Try to load Google jQuery.
require(['http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js'],
    functionThatDependsOnJquery);
...