- 浏览: 1172355 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zhizhen23:
LZ 提供的链接地址失效了
重写的isPlainObject方法 -
LovingBaby:
LovingBaby 写道function fun() {}f ...
读jq之二(两种扩展) -
LovingBaby:
说的很清楚!jQuery作者为了实现简洁调用的苦心!高超的编程 ...
读jq之一(jq对象的组成) -
hard_ly:
...
将伪数组转换成数组 -
zlxzlxzlxzlxzlx:
这不能算是任意进制之间的转换,例如二十六进制、十二进制又该如何 ...
用递归实现十进制数转换N进制
在写跨浏览器的js程序中,检测浏览器是一个很重要的工作。我们不时要为不同的浏览器写分支代码。如下是一种:
//添加事件工具函数 function addEvent(el,type,handle){ if(el.addEventListener){//for standard browses el.addEventListener(type,handle,false); }else if(el.attachEvent){//for IE el.attachEvent("on"+event,handle); }else{//other el["on"+type]=handle; } }
1,第一种检测浏览器方式称为 user-agent 检测方式。是最古老的,它检测目标浏览器的确切型号,包括浏览器的名称和版本。其实就是一个字符串,用navigator.userAgen或navigator.appName获取。如下:
function isIE(){ return navigator.appName.indexOf("Microsoft Internet Explorer")!=-1 && document.all; } function isIE6() { return navigator.userAgent.split(";")[1].toLowerCase().indexOf("msie 6.0")=="-1"?false:true; } function isIE7(){ return navigator.userAgent.split(";")[1].toLowerCase().indexOf("msie 7.0")=="-1"?false:true; } function isIE8(){ return navigator.userAgent.split(";")[1].toLowerCase().indexOf("msie 8.0")=="-1"?false:true; } function isNN(){ return navigator.userAgent.indexOf("Netscape")!=-1; } function isOpera(){ return navigator.appName.indexOf("Opera")!=-1; } function isFF(){ return navigator.userAgent.indexOf("Firefox")!=-1; } function isChrome(){ return navigator.userAgent.indexOf("Chrome") > -1; }
2,第二种称为 对象/特征 检测方式,这是一种判断浏览器能力的方式,也是目前流行的方式。即在使用一个对象之前检测它是否存在。上面提到的addEvent方法中就使用了该方式。.addEventListener是w3c dom标准方式,而IE使用自己特有attachEvent。以下列举几个:
a,talbe.cells只有IE/Opera支持。
b,innerText/insertAdjacentHTML除Firefox外,IE6/7/8/Safari/Chrome/Opera都支持。
c,window.external.AddFavorite用来在IE下添加到收藏夹。
d,window.sidebar.addPanel用来在FF下添加到收藏夹。
3,第三种很有趣,暂且称为 浏览器缺陷或bug 方式,即某些表现不是浏览器厂商刻意实现的。如下:
var isIE = !+"\v1"; var isIE = !-[1,]; var isIE = "\v"=="v"; isSafari=/a/.__proto__=='//'; isOpera=!!window.opera;
最经典的莫过于 !-[1,] 的判断方式,目前最少代码判断IE的方式,只需6个byte。这是个俄国人 发现的。利用了数组[1,]的length。还有来自英国的年轻 James Padolsey 利用IE条件注释
var ie = (function(){ var undef, v = 3, div = document.createElement('div'), all = div.getElementsByTagName('i'); while ( div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->', all[0] ); return v > 4 ? v : undef }());
被称为史上最有创意的IE判断。
注1:isIE = "\v" == "v" 方式IE9已经修复该bug,不能用此方式判断IE浏览器了(2010-6-29用IE9 pre3测试的)
评论
但是效果正如CSS hack,还是少用的好。
var ua = navigator.userAgent.toLowerCase(), check = function(r){ return r.test(ua); }, isOpera = check(/opera/), isChrome = check(/\bchrome\b/), isWebKit = check(/webkit/), isSafari = !isChrome && check(/safari/), isSafari2 = isSafari && check(/applewebkit\/4/), isSafari3 = isSafari && check(/version\/3/), isSafari4 = isSafari && check(/version\/4/), isIE = !isOpera && check(/msie/), isIE7 = isIE && check(/msie 7/), isIE8 = isIE && check(/msie 8/), isIE6 = isIE && !isIE7 && !isIE8, isGecko = !isWebKit && check(/gecko/), isGecko2 = isGecko && check(/rv:1\.8/), isGecko3 = isGecko && check(/rv:1\.9/), isBorderBox = isIE && !isStrict, isWindows = check(/windows|win32/), isMac = check(/macintosh|mac os x/), isAir = check(/adobeair/), isLinux = check(/linux/)
简洁,简单
Ext 的UA嗅探确实简洁明了。特性检测肯定是最无敌的招数。但是结果就是代码里充斥着各种If, Else.值不值得呢?是个问题。
这种情况用特性判断比较好,不管userAgent怎么变,浏览器的本质都是不变的
var ua = navigator.userAgent.toLowerCase(), check = function(r){ return r.test(ua); }, isOpera = check(/opera/), isChrome = check(/\bchrome\b/), isWebKit = check(/webkit/), isSafari = !isChrome && check(/safari/), isSafari2 = isSafari && check(/applewebkit\/4/), isSafari3 = isSafari && check(/version\/3/), isSafari4 = isSafari && check(/version\/4/), isIE = !isOpera && check(/msie/), isIE7 = isIE && check(/msie 7/), isIE8 = isIE && check(/msie 8/), isIE6 = isIE && !isIE7 && !isIE8, isGecko = !isWebKit && check(/gecko/), isGecko2 = isGecko && check(/rv:1\.8/), isGecko3 = isGecko && check(/rv:1\.9/), isBorderBox = isIE && !isStrict, isWindows = check(/windows|win32/), isMac = check(/macintosh|mac os x/), isAir = check(/adobeair/), isLinux = check(/linux/)
简洁,简单
还是进行嗅探后,统一到一个逻辑document对象上在调用比较方便吧
如果是在使用某一特性之前的检测,推荐做法是特性检测。
最后,特性检测并非浏览器检测。
var b = { msie: /msie/.test(ua) && !/opera/.test(ua), opera: /opera/.test(ua), safari: /webkit/.test(ua) && !/chrome/.test(ua), firefox: /firefox/.test(ua), chrome: /chrome/.test(ua) }; var vMark = ""; for (var i in b) { if (b[i]) { vMark = "safari" == i ? "version" : i; break; } } b.version = vMark && RegExp("(?:" + vMark + ")[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1 : "0";
发表评论
-
JavaScript获取图片的原始尺寸
2016-04-20 10:30 1644页面里的img元素,想要 ... -
JavaScript中奇葩的假值
2016-03-14 17:43 1215通常在以下语句结构中需要判断真假 if分支语句 whi ... -
世界上最短的数字判断代码
2016-03-14 16:21 1637我们知道JavaScript提供了typeof运算符,因此最 ... -
getBoundingClientRect在IE9/10里的bug
2015-01-12 08:30 1699getBoundingClientRect可以获得页面中某个 ... -
JavaScript中的直接量与初始器的区别
2014-11-08 06:09 1682很多代码优化及公司规范都会提到 写对象不应该 var ... -
JavaScript中的不可见数据类型
2014-11-02 11:08 1340JS提供了一些内置对象、函数和构造器供我们编程,如Math ... -
ES5严格模式
2014-10-08 18:20 1303严格模式(Strict mode)是由ECMA-262规范 ... -
JavaScript生成GUID的算法
2014-07-16 14:25 3045全局唯一标识符(GUID,Globally Unique ... -
JavaScript中点号“.”的多义性
2014-06-07 19:42 1691点号「.」在JavaScript中 ... -
冗余换性能-从Backbone的triggerEvents说开了去
2014-02-19 11:03 991Backbone是一个优秀的前端MVC库,它的代码质量必定 ... -
JavaScript中delete操作符不能删除的对象
2013-11-27 13:21 1340ES3 中,delete在8.6.2.5及11.4.1有介 ... -
JavaScript中instanceof对于不同的构造器可能都返回true
2013-11-19 11:13 1253我们知道 instanceof 运算符用来检查对象是否为某 ... -
JavaScript里模拟sleep
2013-10-16 07:52 1571有几种方式,但都不完美 一、不断循环,直到达到指定时间 ... -
参数有中包含空格且使用Post提交时须将空格转换成加号
2013-10-14 08:07 5238jQuery的serialize模块中有个r20正则 ... -
JavaScript中“基本类型”之争
2013-10-04 20:58 1156前端面试中常被问到的问题之一就是“JavaScript的基本 ... -
ES3和ES5关于计算顺序的问题(ES5先计算函数ES3则是参数)
2013-09-13 23:35 1333从cmc那看到的,分享给园友。以下是一个怪异的代码,谁 ... -
一道关于"/g"笔试题
2013-07-26 07:13 1073正则里“g”表示全局(global)的意思,比如当替换字符串 ... -
JavaScript原型继承的陷阱
2013-05-27 20:51 1415JavaScript默认采用原型 ... -
JavaScript中__proto__与prototype的关系
2013-05-21 10:38 1483这里讨论下对象的内 ... -
JavaScript中__proto__与prototype的关系
2013-05-21 10:01 3这里讨论下对象的内 ...
相关推荐
这段代码首先检测浏览器是否为Internet Explorer(IE),并检查其字符集编码。根据不同的情况加载相应的脚本资源,通常用于兼容性处理或根据不同浏览器特性加载特定的脚本库,例如在此案例中可能是为了加载搜狗拼音...
标题中的“对各个浏览器做了一个测试,发现了一有趣的现象”暗示了这可能是一个关于浏览器兼容性或特性测试的探讨。由于描述中没有提供具体信息,我们可以根据常见的浏览器测试经验来进行扩展。 在Web开发中,浏览器...
“寰宇浏览器星际版”可能内置了恶意软件检测、广告拦截和隐私保护机制,保护用户免受网络威胁。 4. **智能搜索**:智能搜索引擎能够理解用户的查询意图,提供准确的搜索结果。可能支持语音搜索和预测性输入,提高...
在实际开发过程中,可以通过编写一个通用的函数来封装浏览器检测的逻辑,以便在需要判断浏览器类型的地方直接调用。这样的函数可以接受一个回调函数作为参数,根据不同浏览器的类型执行不同的逻辑。这样的设计不仅能...
在“boomJS”项目中,我们看到了一个利用JavaScript实现的有趣图片爆炸动画效果。这个效果能够将一张图片在浏览器中分解成多个小块,然后这些小块以动态的方式散开,形成一种视觉上的“爆炸”效果。这种技术通常被...
网络扫描是基于浏览器的网络IP扫描程序和本地IP检测器。 它通过WebRTC侦听RTP数据通道并通过任何实时IP循环回到端口,并通过监视即时超时来发现有效子网中的所有实时IP地址,从而检测绑定到用户/受害者的IP(返回TCP...
在Android开发中,创建独特的用户体验往往需要...这不仅可以提升应用的趣味性,还能增加用户的交互深度,让图片浏览变得更加生动有趣。而实现这一效果的关键在于理解和巧妙地结合手势检测、3D变换以及视图的重绘机制。
- **实时检测**:在网页上,用户上传图片后,Kittydar会在浏览器中实时运行模型,标记出检测到的猫脸位置。 4. **Kittydar项目结构** "CatFaceDetect-master"这个文件夹很可能包含了项目的源代码、训练数据、示例...
在ESP8266上开发基于Python的Chrome离线恐龙游戏是一个有趣且具有挑战性的项目。ESP8266是一款低成本、高性能的Wi-Fi微控制器,它可以作为一个小型服务器,为本地设备提供网络服务。这个项目的目标是将谷歌Chrome...
此外,为了确保精确性和用户体验,系统还需要具备一定的错误检测和修正机制,以避免误解用户的动作。 在实际应用中,这样的系统可以广泛应用于多种场景。对于游戏领域,它增加了游戏的沉浸感和互动性,玩家不再只是...
为了更稳定地检测浏览器,可以考虑使用特性检测(feature detection)和现代库,如`Modernizr`,它能更准确地识别浏览器对HTML5和CSS3新特性的支持情况。 总的来说,虽然JavaScript提供了一种简单的方法来大致判断...
总结来说,使用CIFAR-10数据集和TensorFlow.js在浏览器中训练CNN是一项有趣且实用的技术,它允许开发者创建交互式应用,让用户可以直接在网页上体验深度学习模型的运行。这种技术的潜力在于它能够将机器学习带到更...
在这个项目中,`matter.js`被巧妙地应用来创建了一个生动有趣的元素掉落动画,模拟了浏览器窗口因故障而崩塌的场景。 `matter.js`库的核心特性包括: 1. **物理引擎**:`matter.js`内置了一个高效的物理引擎,能够...
总之,JavaScript WebGL库“JeelizWeboji”为Web开发者提供了一个强大而有趣的工具,让创建具有互动性和个性化的表情动画变得触手可及。结合现代Web技术,你可以在各种应用场景中实现类似Apple Animoji的功能,提升...
它提供了一套完整的工具集,包括精灵、精灵表、动画、物理引擎、碰撞检测、定时器和声音管理等,极大地简化了游戏开发流程。 1. **HTML5与Canvas** HTML5是超文本标记语言的最新版本,它引入了许多新特性,其中...
在这个特定的项目"Java Swing实现仿Chrome浏览器跳跳龙小游戏"中,开发者利用Java Swing来创建了一个类似Chrome浏览器上的经典小游戏——跳跳龙。这个游戏通常是一个简单的平台跳跃游戏,玩家需要控制一个小角色在...
- 为了适应移动设备,可能还采用了响应式设计,利用jQuery的`.width()`等方法检测屏幕尺寸,自动调整布局和切换效果。 4. **互动性和用户体验** - jQuery的事件处理能力使得TN3相册可以响应用户的点击、滚动等...
### 输入密码时检测大写是否锁定的JS代码详解 #### 一、背景介绍 在现代Web应用中,用户体验是至关重要的一个方面。特别是在涉及到账户...未来随着前端技术的发展,还可以探索更多有趣的方法来进一步优化这一功能。
自动-语音识别API会检测每个句子的开头和结尾,使您可以暂停说话,谈论其他事情并重读上一行。 错误将为您消除。 包括电池-支持纯文本,CommonMark和GFM。 没有设置,没有帐户,完全在浏览器中。 高性能-使用...
这主要涉及到Web浏览器的字体检测技术,它可以帮助开发者创建自适应的网页设计,根据用户的系统字体库提供最佳的视觉体验。以下是对"js获取电脑中所安装的所有字体"这一主题的详细解释。 首先,JavaScript本身并不...