Подтвердить что ты не робот

Замедленный возврат к jQuery

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

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

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

4b9b3361

Ответ 1

Это может быть сумасшедшая идея (я не уверен, что 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; }
}

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

Ответ 2

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

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

Ответ 3

Вместо того, чтобы делать это с помощью 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.

Ответ 4

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

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

  } else {
    // IS IE

  }

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

Ответ 5

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

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

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

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

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

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

  } else {
    // This is IE

  }
</script>

Ответ 6

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

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

Ответ 7

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

Он запускает "offical" '__proto__' in ... test и ленивые загрузки jQuery, если он терпит неудачу. Если он преуспеет, он продолжает загрузку Zepto.

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

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

Ответ 8

Это старая тема, но это то, что придумало для меня, и я не был доволен решением в целом. Кто-то из вышеприведенного комментария отметил, что официальный тест zepto приведет к тому, что ZEPO будет отправляться в 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.

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

http://zeptojs.com/#platforms

http://caniuse.com/#feat=canvas

Ответ 9

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

<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>

Ответ 10

Вы должны немного поднять планку, чтобы не только 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