问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JS中怎样避免特性与浏览器推断

发布网友 发布时间:2023-10-06 15:08

我来回答

1个回答

热心网友 时间:2024-03-10 22:04


这次给大家带来JS中怎样避免特性与浏览器推断,JS避免特性与浏览器推断的注意事项有哪些,下面就是实战案例,一起来看一下。
一种不当的使用特性检测的情况是“特性推断”(Feature Inference)。特性推断尝试使用多个特性但仅验证了其中之一。根据一个特性的存在推断另一个特性是否存在。问题是,推断是假设并非事实,而且可能会导致维护性的问题。例如,如下是一些使用特性推断的旧代码:
// 不好的写法 - 使用特性推断function getById (id) { var el = null; if (
document
.
getElementsByTagName
) { // DOM
el = document.getElementById(id);
} else if (window.ActiveX
Object
) { // IE
el = document.all[id];
} else { // Netscape <= 4
el = document.layers[id];
} return el;
}该函数是最糟糕的特性推断,其中做出了如下几个推断:
如果document.getElementsByTagName()存在,则document.getElementById也存在。实际上,这个假设是从一个DOM方法的存在推断出所有方法都存在。
如果window.ActiveXObject存在,则document.all也存在。这个推断基本上断定window.ActiveXObject仅仅存在于IE,且document.all也仅存在于IE,所以如果你判断一个存在,其他的也必定存在。实际上,Opera的一些版本也支持document.all。
如果这些推断都不成立,则一定是Netscape Navigator 4或者更早的版本。这看似正确,但及其不严格。
你不能从一个特性的存在推断出另一个特性是否存在。最好的情况下两者有薄弱的联系,最坏的情况下两者根本没有直接关系。也就好比说是,“如果它看起来像一个鸭子,就必定像鸭子一样嘎嘎地叫。”
2.8.4 避免浏览器推断
在某些时候,用户代理检测和特性检测让许多Web开发人员很困惑。于是写出来的代码就变成了这样:
// 不好的写法if (document.all) {
id = document.uniqueID;
} else {
id = Math.random();
}这段代码的问题是,通过检测document.all,间接地判断浏览器是否为IE。一旦确定了浏览器是IE,便假设可以安全地使用IE所特有的document.uniqueID。然而,你所做的所有探测仅仅说明document.all是否存在,而并不能用于判断浏览器是否是IE。正因为document.all的存在并不意味着document.uniqueID也是可用的,因此这是一个错误的隐式推断,可能会导致代码不能正常运行。
为了更清楚地表述该问题,代码被修改成这样:
var isIE = navigator.userAgent.indexOf("MSIE") > -1;修改为如下这样:
// 不好的写法var isIE = !!document.all;这种转变体现了一种对“不要使用用户代理检测”的误解。虽然不是直接检测特定的浏览器,但是通过特性检测从而推断出是某个浏览器同样是很糟糕的做法。这叫做浏览器推断,是一种错误的实践。
到了某个阶段,开发者意识到document.all实际上并不是判断浏览器是否为IE的最佳方法。之前的代码加上了更多的特性检测,如下所示:
var isIE = !!document.all && document.uniqueID;这种方法属于“自作聪明”型的。尝试通过越来越多的已知特性推断某些事情太困难了。更糟糕的是,你没办法阻止其他浏览器实现相同的功能,最终导致这段代码返回不可靠的结果。
相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!
推荐阅读:
JS中Polyfill注解与阻止修改的使用

JS门面模式使用案例详解
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果手机微信怎么换漂亮字体(苹果手机微信怎么换行输入) 有什么好用的app转换字体 手写转文字的软件 erp可以看评论地址吗 淘宝评论url是什么意思? 揭秘:码牌支付风控升级,背后真相揭秘 电脑电视直播软件哪个好用什么软件好电脑看电视直播 潼南子同街学区是哪些 三极管BU406价格和参数? 火锅料放在冰柜忘了插电一个星期给会坏了吗 火锅的设备有哪些 化字开头的成语 这几道英语题怎么做????请说明理由。 iphone开启Wi-Fi要不要关闭蜂窝数据?如果同时开启是...2 凌肯摩托车LK150-11(省油王)怎么样?28 凌肯125T—2A踏板摩托车点火器下面那根红线接哪里1 这道英语题怎么做,请说明理由。 这种凌肯摩托车好不好4 这道英语题请说明理由 七星伴月来是什么生肖45 我姓马 从小到大 同学 朋友 同事 为什么都喜欢叫我 老马 ... 在一起的同事都爱叫我马哥,因为我姓马,年龄也不是最大的,他们... IE浏览器不能运行js JS代码失效不能运行了如何解决 这几道英语题怎么做,请说明理由 七星伴月是啥动物生肖76 (七星伴月空中舞)打一个生肖11 七星伴月,猜什么生肖?2 七星伴月在圈中打一生肖9 怎么样能买到好的智能手机,买时应该看手机的什么?推荐几款价格... 苹果手机怎么关闭wifi自动打开2 我苹果手机,下载应用后我允许使用WLAN与蜂窝移动网,但他还...96 iphone5s蜂窝移动数据下面的程序打开后 退出设置又自动...524 这道英语题怎么做,说明理由 26岁的女人离婚后还好找老公吗?72 我26岁离婚了,以后还好找女朋友吗?是找离婚的还是未婚的25 女子因为什么事离婚让离婚调解员也很无奈?1 离婚了,女26岁,好找对象吗8 26岁的女子离婚了,没有孩子,再婚应该不会困难吧. 和同一个小区的离婚阿姨发生了不该发生的事,主要是她太诱惑了,...11 离婚申请有什么要求?14 2500~3000左右行货手机求推荐!要质量好和兼容性好的!... 我是女生,想买笔记本,价钱大概在3500~3999。主要用于... 介绍下3000-3500左右的笔记本吧,本人主要玩游戏.最好... 我想配置一台台式电脑,价格在3000到3500左右,能玩大型...1 求推荐一款手机,主要要求如下:有按键,能上QQ,能上网看小说...1 推荐一款400-500元的手机。要求很低,能上网,能登QQ,... 预算3500左右,求推荐华硕笔记本电脑。。。一般就看电影,听...3 准备换个智能手机,1000以下,触屏的,能支持wifi,主要... 我爱打篮球,可手太小,怎么让它变大?52 打篮球手小有什么好处?61 打篮球手这样问题大不大