Выбор jQuery 1.9 или 2.0 с использованием JavaScript и Require.JS
jQuery 2.0 становится все более зрелым: http://blog.jquery.com/2013/03/01/jquery-2-0-beta-2-released/
jQuery 2.0 нарушает совместимость со старыми браузерами, поэтому нужно знать, когда стоит с jQuery 1.9. Рекомендуемый подход заключается в использовании условных комментариев IE:
<!--[if lt IE 9]>
<script src="jquery-1.9.1.js"></script>
<![endif]-->
<!--[if gte IE 9]><!-->
<script src="jquery-2.0.0b2.js"></script>
<!--<![endif]-->
-
Современная передовая практика веб-разработки подсказывает, что нам следует избегать анализа синтаксического анализа браузером или пользовательского агента, но разве это не такие условные комментарии?
-
работает ли jQuery 2.0 только для совместимости со старым Internet Explorer? или есть ли другие браузеры, которые будут хуже в 2.0?
-
Если это влияет не только на Internet Explorer (это единственное место, где работают условные комментарии), то какую стратегию мы должны использовать для выбора лучшего jQuery?
-
существует ли глобально доступное значение/объект/функция/etc в среде JavaScript, чье присутствие может использоваться для сигнализации совместимости с jQuery 2.0 (например, с функцией обнаружения)?
главный вопрос
Мои проекты в настоящее время используют Require.JS для модульного кода. Мой код загружает jQuery только тогда, когда он встречает первый раздел, который требует его.
Каков наилучший способ загрузки правильной версии jQuery с помощью Require.JS?
Я сейчас рассматриваю:
-
с использованием условных комментариев IE до того, как я загружу Require.JS, а затем "определение" jQuery вручную
-
с использованием функции обнаружения JS в коде, который устанавливает пути Require.JS(прежде чем что-либо потребует jQuery), установив путь к 1.9 или 2.0 (мой предпочтительный метод)
-
всегда использует 1.9 независимо от того, что (самый безопасный и самый скучный подход)
Ответы
Ответ 1
Адаптация niaccurshi отвечает спецификации AMD.
// Do this before your first use of jQuery.
var pathToJQuery
if('querySelector' in document
&& 'localStorage' in window
&& 'addEventListener' in window) {
pathToJQuery = '//cdn/jQuery2.0'
} else {
pathToJQuery = '//cdn/jQuery1.9'
}
require.configure({'paths':{
'jquery': pathToJQuery
}})
require(['jquery'], function($){ /* you get the one you need here */ })
Ответ 2
На самом деле есть более элегантное решение, которое используется BBC
для своего отзывчивого новостного сайта.
Он по существу определяет браузеры, которые считаются new
, и, следовательно, будет совместим с jQuery 2.0+
и, следовательно, оставляет все остальное в качестве браузера old
. Вы можете воспроизвести это с помощью Require.js
, но на самом деле вам не нужно...
if(querySelector in document
&& localStorage in window
&& addEventListener in window) {
//Add jQuery 2.0+
} else {
//Add jQuery 1.9.0+
}
//This is intended to be a flag that can be checked against to see if the jQuery library has been loaded into the browser.
var jQueryVersion = 0;
function jQueryRunning(ver) {
//This could be "true", or could be a version number, it largely down to your own system needs!
jQueryVersion = ver;
}
Источник: ссылка
Вы должны добавить функцию обратного вызова для каждого из сценариев для jQuery
, которая вызывает jQueryRunning
с параметром, равным номеру версии, это может помочь вам решить, какие дополнительные функции будут выполняться по линии, и полезно сообщить, когда внедрен код jQuery (just in case the connection is slow and it takes a while to download)
.
Если вы используете Require.js
, это может быть не то, о чем вы хотите беспокоиться!
Я говорю, что это элегантное решение, потому что вы совершенно правы, проблема заключается не только в старых версиях IE
, но и в старых версиях Firefox (before 3.5)
и старых мобильных браузерах (если они даже имеют дело с javascript! )