Zepto fall back to jQuery

j'utilise ZeptoJS pour mon application web, mais j'aimerais revenir à jQuery si le navigateur ne supporte pas Zepto. Comme IE est le seul navigateur important non pris en charge en ce moment, je suis tenté de détecter IE:

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

mais je préfère spécifiquement détecter le support de Zepto et utiliser jQuery dans d'autres cas. Y a-t-il une méthode de détection des caractéristiques pour faire cela?

26
demandé sur jos3000 2012-01-04 15:14:51

10 réponses

cela pourrait être une idée folle (Je ne suis pas sûr que Zepto va même charger sur un navigateur non pris en charge), mais qu'en est-il de l'utilisation de la propre détection de navigateur de Zepto pour voir si elle est sur un navigateur non pris en charge?

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

peut-être pourriez-vous faire quelque chose comme ceci:

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

cela ne va pas attraper chrome / firefox, qui fonctionne très bien avec Zepto, mais il ne correspond aux intentions de L'équipe de Zepto pour la chose, qui peut ou ne peut pas être mieux.

8
répondu SimplGy 2012-02-17 16:09:10

Vous pouvez aussi utiliser JS trick described ici pour détecter si le navigateur est IE, et utiliser une bibliothèque de chargement de script asynchrone moderne pour charger la lib requise. Yepnope exemple:

yepnope({
  test: !+"\v1", // IE?
  yep: 'jquery.js',
  nope: 'zepto.js'
});
21
répondu phil pirozhkov 2012-01-04 21:13:15

au lieu de faire cela avec Javascript, je prendrais une longueur d'avance et utiliserais des déclarations conditionnelles. Cela pourrait ressembler à:

<!--[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]-->

cela va directement dans vos fichiers HTML. L'extrait ci-dessus chargera jQuery, si le navigateur est Internet Explorer 7 et inférieur. Sinon, ça inclut zepto.js.

17
répondu jAndy 2012-01-04 11:20:04

comme le dit la Documentation de Zepto, si vous avez besoin de pour détecter Internet Explorer vous pouvez utiliser ce code:

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

  } else {
    // IS IE

  }

Zepto l'utiliser pour retomber sur jQuery, mais je l'ai utilisé comme détection de navigateur aussi.

13
répondu Jaime Fernandez 2012-05-24 10:31:22

N'utilisez pas les commentaires conditionnels, il ne va pas être pris en charge par IE10. Cette approche est recommandée à partir de l' documentation zepto:

Charge Zepto sur navigateur moderne et jQuery sur IE

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

Zepto ne fonctionne pas dans IE parce que IE ne supporte pas prototype, c'est exactement la bonne façon de vérifier.

le script ci-dessus fait une charge dynamique mais la logique est

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

  } else {
    // This is IE

  }
</script>
8
répondu gagarine 2014-07-23 11:56:30
<script>
  document.write('<script src=' + ('__proto__' in {} ? 'zepto' : 'jquery') + '.js><\/script>')
</script>

C'est la méthode recommandée sur zepto.site officiel de js. Voir http://zeptojs.com/#download

5
répondu Ale 2012-06-29 08:52:50

alors que beaucoup de réponses existantes fonctionnent bien lors du chargement de Zepto.js via une requête supplémentaire, j'ai une situation où je sais que Zepto suffira la plupart du temps et je veux juste le fusionner avec mes scripts et charger jQuery paresseusement si nécessaire. J'ai préparé un petit emballage pour Zepto.

Il fonctionne "officiel" '__proto__' in ... test et paresseux charge jQuery si elle échoue. S'il réussit, il continue à charger Zepto.

j'ai découvert que IE8 exploserait si Zepto était même chargé. Ceci corrige cela en sautant le reste du module.

pour le cas optimiste, il n'y a pas de requêtes de script supplémentaires. Pour le chemin de jQuery, Eh bien, ces utilisateurs n'ont pas exactement l'expérience rapide de toute façon.

1
répondu mckamey 2013-03-29 20:16:45

C'est un vieux sujet, mais c'est ce qui arriva pour moi, et je n'étais pas heureux avec la solution globale. Quelqu'un dans un commentaire ci-dessus mentionné, que le fonctionnaire zepto test entraînera zepto va FireFix 3.6 au lieu de JQuery, je préfère éviter si possible.

alors, c'est ce que je pensais...test pour voir si elle supporte certaines fonctionnalités HTML5 et si ce n'est pas IE. Cela peut signifier que le plus grand jQuery ira à plus de navigateurs qu'il ne devrait, mais je voudrais préfèrent "travailler" gonflée code pour un téléchargement rapide de rien. Donc, de toute façon, prendre la méthode isCanvasSupported () de Modernizer et le __proto__ test recommandé par zepto, je pense que cela pourrait être une bonne solution (je n'ai pas encore eu la chance de tester):

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

alors, il suffit d'utiliser cette méthode dans le document.write () comme dans les exemples ci-dessus ou partout où vous définissez le chemin vers jquery/zepto.

les deux seules versions de navigateur que j'ai pu voir dans un rapide les références croisées qui supportent canvas mais ne sont pas supportées par zepto sont: * IOS Safari 3.2 (4+ est supporté par Zepto) * Android 2.1 (2.2 + est supporté par Zepto)

http://zeptojs.com/#platforms

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

1
répondu Kevin Nelson 2013-08-12 14:32:44

C'est la façon dont je le fais:

<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>
0
répondu Timbo White 2012-03-07 18:53:27

Vous devriez élever la barre un peu pour que non seulement IE8 obtienne jQuery, mais aussi d'autres navigateurs plus anciens. Zepto par exemple nécessite des fonctionnalités telles que la Matrice.prototype.quelque.

Zepto nécessite à peu près les mêmes fonctionnalités que picoQuery (ce qui est une alternative au Zepto). Dans picoQuery, ils font comme ceci:

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>");
}

des tables de compatibilité nous avons que n'importe quel navigateur qui soutient le tableau.isArray supporte également querySelectorAll (), addEventListener (), dispatchevent, Tableau.prototype.indexOf et Array.prototype.certains-tous qui sont utilisés dans Zepto

picoQuery décrit ce choix ici: http://picoquery.com/the_fallback

0
répondu rosell.dk 2016-12-07 12:26:58