Откат Zepto к jQuery

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

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

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


person jos3000    schedule 04.01.2012    source источник
comment
У меня есть несколько хороших ответов об обнаружении IE здесь, но я был бы действительно заинтересован в обнаружении, которое более точно соответствует браузерам zepto.   -  person jos3000    schedule 05.01.2012
comment
что вы в итоге использовали. Я вижу их пример для обнаружения IE: «скрипт» ‹\/сценарий›') ‹/сценарий›   -  person GnrlBzik    schedule 26.04.2012
comment
@GnrlBzik Это __proto__ :)   -  person alex    schedule 29.05.2012
comment
да, это @alex, спасибо, не знаю, почему я этого не заметил.   -  person GnrlBzik    schedule 29.05.2012


Ответы (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 в отношении этой вещи, что может быть лучше, а может и нет.

person SimplGy    schedule 17.02.2012
comment
Это не тот путь, так как вам придется загружать zepto, даже если вы не собираетесь его использовать. - person gagarine; 02.04.2013
comment
@gagarine Думаю, это не будет большой проблемой, так как библиотека очень легкая. В любом случае, ответ ниже, о котором вы говорите, имеет гораздо больше голосов. Я думаю, это должен быть принятый ответ. - person Ravindranath Akila; 31.07.2013
comment
Я думаю, что обратная сторона загрузки Zepto, когда она не нужна, реальна, но использование isIE в качестве переключателя для jquery не идеально - другие браузеры, отличные от ie, не поддерживают Zepto. Вероятно, в наши дни лучше загружать Zepto только на Modernizr.isTouch. - person SimplGy; 01.08.2013
comment
@SimpleAsCouldBe Modernizr.isTouch, безусловно, установлен на мобильном устройстве IE (телефон с Windows) - person gagarine; 02.09.2013
comment
Хороший вопрос, @gagarine. Я пытаюсь придумать, какой метод будет лучшим сейчас, я использовал jQuery для своих последних нескольких проектов. Обнаружение действительной возможности отсутствует. Я полагаю, что лучше всего попытаться сопоставить ваше условие с намерением библиотеки. Библиотека намерена поддерживать webkit, поэтому тестирование UA (вздох) для webkit может быть здесь допустимым подходом. - person SimplGy; 02.09.2013

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

yepnope({
  test: !+"\v1", // IE?
  yep: 'jquery.js',
  nope: 'zepto.js'
});
person phil pirozhkov    schedule 04.01.2012
comment
@Rocket: Плохие новости. Тогда следует использовать условные операторы. - person phil pirozhkov; 07.01.2012
comment
Я использую test: navigator.appName.match(/Explorer/) сейчас. - person phil pirozhkov; 10.01.2012

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

person jAndy    schedule 04.01.2012
comment
Также убедитесь, что zep загружается только в блок if not IE. - person Raynos; 04.01.2012
comment
Спасибо - я тестировал Zepto 0.8 в IE9, и он не работал, поэтому я думаю, что мне придется иметь общий IE -> jQuery - person jos3000; 04.01.2012
comment
Должно быть <![if !IE]>, иначе Zepto будет удален как комментарий. - person Brian Nickel♦; 16.01.2012
comment
Согласно комментарию на сайте Zepto, условные комментарии не поддерживаются в IE 10, поэтому лучше этого избегать. У них есть решение, подробно описанное на их домашней странице для IE. zeptojs.com - person Josh Gallagher; 20.08.2012

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

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

  } else {
    // IS IE

  }

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

person Jaime Fernandez    schedule 24.05.2012
comment
Это ужасный способ обнаружения для IE (и он есть в документации Zepto). - person alex; 20.08.2012
comment
Это действительно работает для IE, однако Firefox 3.6 дает истину для этой проверки (и определенно не совместим с Zepto). - person Husky; 19.10.2012
comment
@alex, почему ты говоришь, что это ужасный способ? - person esp; 26.01.2013
comment
@esp Потому что это ненадежно как и все остальное. Он также будет существовать в будущем IE (хотя, возможно, к тому времени этот IE будет достаточно хорош). - person alex; 27.01.2013
comment
+1. Если это их рекомендуемый код, у них есть свои причины. Как заявил ОП, он скорее обнаружит поддержку Zepto, чем напрямую IE, и похоже, что это предпочтительный способ Zepto сделать это. Будущий IE, вероятно, будет работать, что, я уверен, хорошо. - person Zach Lysobey; 27.03.2013
comment
Zepto не работает в IE, потому что IE не поддерживает __prototype__, так что это правильный способ проверить. - person nilskp; 02.04.2013
comment
Дело не в том, чтобы определить, является ли это IE или нет; дело в том, что Zepto полагается на __proto__, а IE не имеет __proto__, так что на самом деле это правильный способ проверить это. Смотреть на что-либо из навигатора смешно, потому что вы, по сути, просто делаете предположение о том, будет ли библиотека работать в этом браузере, а не знаете точно, будет ли она работать. Например, он также будет использовать jQuery в таких браузерах, как Opera, и не будет использовать (очевидно) IE11 - person Travis Kaufman; 13.09.2013

Не используйте условные комментарии, они не будут поддерживаться 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>
person gagarine    schedule 04.04.2012
comment
В вашем примере с условным комментарием и IE9, и IE10 вообще не получают скрипт. - person Zach Lysobey; 27.03.2013
comment
@ZachL спасибо. Я удалил пример с условным комментарием, потому что он все равно не поддерживается IE10. - person gagarine; 29.03.2013

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

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

person Ale    schedule 29.06.2012

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

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

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

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

person mckamey    schedule 29.03.2013

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

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

http://zeptojs.com/#platforms

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

person Kevin Nelson    schedule 12.08.2013
comment
Я создал скелет с открытым исходным кодом, который использует RequireJS, Bootstrap 3 и Zepto с запасным вариантом JQuery, используя описанный выше метод, который вы можете использовать в качестве примера, если вы случайно столкнетесь с этим сайтом и ищете решение RequireJS для этой проблемы. как я был изначально: github.com/kevinknelson/bootstrap-mobile - person Kevin Nelson; 12.12.2013

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

<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>
person Timbo White    schedule 07.03.2012
comment
Спасибо, Тимбо, но мне было бы очень интересно что-то, что специально ищет совместимость с Zepto, а не улучшает мой хак «обнаружение IE». - person jos3000; 13.03.2012

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

person rosell.dk    schedule 07.12.2016