Zepto откат к JQuery

Я использую ZeptoJS для своего веб-приложения, но я бы хотел вернуться к jQuery, если браузер не поддерживает Zepto. Поскольку IE является единственным крупным браузером, который не поддерживается на данный момент, я испытываю желание обнаружить IE:

if(navigator.appName == 'Microsoft Internet Explorer'){
    // load jquery
} else {
    // load zepto
}

но я бы предпочел специально определять поддержку Zepto и использовать jQuery в других случаях. Есть ли способ обнаружения функций, чтобы сделать это?

10 ответов

Решение

Это может быть сумасшедшей идеей (я не уверен, что Zepto даже загрузится в неподдерживаемом браузере), но как насчет использования собственного определения браузера Zepto, чтобы узнать, не в каком браузере он не поддерживается?

$.os.ios      // => true if running on Apple iOS
$.os.android  // => true if running on Android
$.os.webos    // => true if running on HP/Palm WebOS
$.os.touchpad // => true if running on a HP TouchPad
$.os.version  // => string with version number, "4.0", "3.1.1", "2.1", etc.
$.os.iphone   // => true if running on iPhone
$.os.ipad     // => true if running on iPad
$.os.blackberry // => true if running on BlackBerry

Может быть, вы могли бы сделать что-то вроде этого:

var isSupported = false;
for (os in $.os) {
    if ($.os[os] == true) { isSupported = true; }
}

Это не поймет chrome/firefox, который отлично работает с Zepto, но он действительно соответствует намерениям команды Zepto, что может быть или не быть лучше.

Вы также можете использовать трюк JS, описанный здесь, чтобы определить, является ли браузер IE, и использовать современную асинхронную библиотеку загрузки скриптов для загрузки требуемой библиотеки. Да, пример:

yepnope({
  test: !+"\v1", // IE?
  yep: 'jquery.js',
  nope: 'zepto.js'
});

Вместо того, чтобы делать это с Javascript, я бы сделал шаг вперед и использовал условные выражения. Это может выглядеть так:

<!--[if lt IE 8 ]>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.js"></script>
<![endif]-->

<!--[if !IE]>
    <script src="/js/zepto.js"></script>
<![endif]-->

Это идет прямо в ваши файлы HTML. Приведенный выше фрагмент загрузит jQuery, если браузер Internet Explorer 7 и ниже. В противном случае он будет включать zepto.js.

Как сказано в Zepto Documentation, если вам нужно обнаружить Internet Explorer, вы можете использовать этот код:

  if ('__proto__' in {}) {
    // IS NOT IE

  } else {
    // IS IE

  }

Zepto использует его, чтобы использовать jQuery, но я использую его и для обнаружения в браузере.

Не используйте условные комментарии, они не будут поддерживаться IE10. Это рекомендуемый подход из документации zepto:

Загрузите Zepto в современный браузер и jQuery в IE

<script>
document.write('<script src=' +
('__proto__' in {} ? 'zepto' : 'jquery') +
'.js><\/script>')
</script>

Zepto не работает в IE, потому что IE не поддерживает прототип, так что это абсолютно правильный способ проверки.

Сценарий выше выполняет динамическую загрузку, но логика

<script>
if ('__proto__' in {}) {
  // This is NOT IE

  } else {
    // This is IE

  }
</script>
<script>
  document.write('<script src=' + ('__proto__' in {} ? 'zepto' : 'jquery') + '.js><\/script>')
</script>

Это рекомендуемый метод на официальном сайте zepto.js. Смотрите http://zeptojs.com/

Хотя многие из существующих ответов работают нормально при загрузке Zepto.js через дополнительный запрос, у меня есть ситуация, когда я знаю, что Zepto будет достаточно в большинстве случаев, и я просто хочу объединить его со своими скриптами и лениво загрузить jQuery, если необходимо. Я собрал небольшую обертку для Zepto.

Работает "официальный" '__proto__' in ... тестировать и лениво загружать JQuery, если он не работает. Если это удается, то он продолжает загружать Zepto.

Я обнаружил, что IE8 взорвется, если Zepto даже загрузится. Это исправляет это, пропуская остальную часть модуля.

Для оптимистического случая никаких дополнительных запросов скрипта не существует. Что касается пути jQuery, ну, в любом случае, эти пользователи точно не получили быстрый опыт.

Это старая тема, но это то, что подошло мне, и я не был доволен решением в целом. Кто-то в комментарии выше упомянул, что официальный тест zepto приведет к переходу zepto на FireFix 3.6 вместо JQuery, которого я предпочел бы избежать, если это вообще возможно.

Итак, моя мысль была... проверить, поддерживает ли она некоторую функцию HTML5 И не IE. Это может означать, что больший jQuery пойдет на большее количество браузеров, чем следовало бы, но я бы предпочел "рабочий" раздутый код быстрой загрузке ничего. Так или иначе, взяв метод isCanvasSupported() из Modernizer и __proto__ тест, рекомендованный zepto, я думаю, что это может быть хорошим решением (у меня еще не было возможности протестировать):

   var isHtml5AndNotIE     = function() {
        var elem = document.createElement('canvas');
        return '__proto__' in {} && !!(elem.getContext && elem.getContext('2d'));
    };

Затем просто используйте этот метод в document.write(), как в приведенных выше примерах или там, где вы определяете путь к jquery/zepto.

Единственные две версии браузера, которые я видел в краткой перекрестной ссылке, которые поддерживают canvas, но не поддерживаются zepto: * IOS Safari 3.2 (4+ поддерживается Zepto) * Android 2.1 (2.2+ поддерживается Zepto)

http://zeptojs.com/

http://caniuse.com/

Вот как я это делаю:

<script type="text/javascript">
if(top.execScript){ // true only in IE
    document.write("<script src='/js/jquery.js'>\x3C/script>");
}
else{
    document.write("<script src='/js/zepto.min.js'>\x3C/script>");
}
</script>

Вам следует немного поднять планку, чтобы не только IE8 получал jQuery, но и другие старые браузеры. Zepto, например, требует таких функций, как Array.prototype.some.

Zepto требует практически тех же функций, что и picoQuery (который является альтернативой Zepto). В picoQuery они делают так:

if (Array.isArray) {
   // Modern browser
   // (FF4+, IE9+, Safari 5+, Opera 10.5+, Konq 4.9+, Chrome 5+, etc)
   document.write("<script src='/js/zepto.min.js'></script>");
}
else {
   document.write("<script src='/js/jquery.js'></script>");
}

Из таблиц совместимости мы видим, что любой браузер, который поддерживает Array.isArray, также поддерживает querySelectorAll(), addEventListener(), dispatchevent, Array.prototype.indexOf и Array.prototype.some - все это используется в Zepto

picoQuery описывает этот выбор здесь: http://picoquery.com/the_fallback

Другие вопросы по тегам