我正在使用ZeptoJS开发我的网页应用,但是如果浏览器不支持Zepto,我希望可以回退到jQuery。由于目前IE是唯一不支持Zepto的主要浏览器,所以我想检测它:
if(navigator.appName == 'Microsoft Internet Explorer'){
// load jquery
} else {
// load zepto
}
但我更希望能够特别检测Zepto的支持并在其他情况下使用jQuery。 有没有一种特性检测的方法来实现这一点?
我正在使用ZeptoJS开发我的网页应用,但是如果浏览器不支持Zepto,我希望可以回退到jQuery。由于目前IE是唯一不支持Zepto的主要浏览器,所以我想检测它:
if(navigator.appName == 'Microsoft Internet Explorer'){
// load jquery
} else {
// load zepto
}
但我更希望能够特别检测Zepto的支持并在其他情况下使用jQuery。 有没有一种特性检测的方法来实现这一点?
不要使用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文件中。上面的代码片段会在用户使用Internet Explorer 7及以下版本浏览器时加载jQuery,否则将加载zepto.js。
<![if !IE]>
,否则 Zepto 将被解析为注释。 - Brian Nickel根据Zepto文档所说,如果你需要检测Internet Explorer,可以使用以下代码:
if ('__proto__' in {}) {
// IS NOT IE
} else {
// IS IE
}
我使用Zepto进行浏览器检测,它也可以用来作为jQuery的备选方案。
__prototype__
,所以这正是检查的正确方式。 - nilskp__proto__
,而IE没有__proto__
,所以这实际上是检查它的正确方式。从navigator中查看任何内容都是荒谬的,因为你基本上只是猜测库是否在该浏览器中工作,而不是确切地知道它是否能够工作。例如,在像Opera这样的浏览器上,它也会回退到jQuery,并且在(显然)IE11中不会回退。 - Travis Kaufman$.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; }
}
<script>
document.write('<script src=' +
('__proto__' in {} ? 'zepto' : 'jquery') +
'.js><\/script>')
</script>
<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时运行良好,但我有一个情况,我知道大多数情况下Zepto就足够了,我只想将其与我的脚本合并,并在需要时延迟加载jQuery。我为Zepto编写了一个小包装器,可以实现这一点。
它运行"官方"'__proto__' in ...
测试,如果失败,则延迟加载jQuery。如果成功,则继续加载Zepto。
我发现即使加载了Zepto,IE8也会崩溃。这通过跳过模块的其余部分来解决了这个问题。
对于乐观情况,没有任何其他脚本请求。对于jQuery路径,那些用户也没有得到快速体验。
所以,我的想法是...测试一下它是否支持某些HTML5特性,并且检查一下它是否不是IE。这可能意味着更大的jQuery会进入比应有的更多的浏览器,但与快速下载空白相比,我更喜欢“可工作”的臃肿代码。所以,无论如何,从Modernizer中取出isCanvasSupported()方法和zepto推荐的__proto__
测试,我认为这可能是一个好的解决方案(还没有机会实际测试):
var isHtml5AndNotIE = function() {
var elem = document.createElement('canvas');
return '__proto__' in {} && !!(elem.getContext && elem.getContext('2d'));
};
<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>");
}
__proto__
:) - alex