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

这次给大家带来JS中怎样避免特性与浏览器推断,JS避免特性与浏览器推断的注意事项有哪些,下面就是实战案例,一起来看一下。

一种不当的使用特性检测的情况是“特性推断”(Feature Inference)。特性推断尝试使用多个特性但仅验证了其中之一。根据一个特性的存在推断另一个特性是否存在。问题是,推断是假设并非事实,而且可能会导致维护性的问题。例如,如下是一些使用特性推断的旧代码:

// 不好的写法 - 使用特性推断function getById (id) {  var el = null;  if (document.getElementsByTagName) { // DOM    el = document.getElementById(id);  } else if (window.ActiveXObject) { // IE    el = document.all[id];  } else { // Netscape 

该函数是最糟糕的特性推断,其中做出了如下几个推断:

如果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;

登录后复制

这种方法属于“自作聪明”型的。尝试通过越来越多的已知特性推断某些事情太困难了。更糟糕的是,你没办法阻止其他浏览器实现相同的功能,最终导致这段代码返回不可靠的结果。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

JS中Polyfill注解与阻止修改的使用

JS门面模式使用案例详解

以上就是JS中怎样避免特性与浏览器推断的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2750102.html

(0)
上一篇 2025年3月8日 05:31:17
下一篇 2025年3月6日 07:55:48

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 通俗易懂解析JS原型与原型链

    这次给大家带来通俗易懂解析js原型与原型链,解析js原型与原型链的注意事项有哪些,下面就是实战案例,一起来看一下。 Browser中的对象 浏览器中有哪些对象?ES中规定全局对象为global,而浏览器中规定全局对象为window。 在ch…

    编程技术 2025年3月8日
    200
  • 如何访问JS的对象属性与方法

    这次给大家带来如何访问JS的对象属性与方法,访问JS对象属性与方法的注意事项有哪些,下面就是实战案例,一起来看一下。 定义一个对象,然后用点运算符(.)来访问属性和方法。今天突然看见还有另外一种方法中括号运算符([]),就认真看了下。 va…

    2025年3月8日 编程技术
    200
  • 在AngularJS中如何动态添加数据并删除?

    下面我就为大家分享一篇angularjs动态添加数据并删除的实例,具有很好的参考价值,希望对大家有所帮助。 如下所示: nbsp;html>TodoListbody {padding: 0;margin: 0;}.todo {widt…

    编程技术 2025年3月8日
    200
  • 详细讲解JS严格模式知识点有哪些?

    本篇文章给大家整理了js严格模式下的相关知识点以及代码实例分享,感兴趣的一起学习下吧。 所谓严格模式其实就是一个不会赋值给任何变量的字符串 “use strict” 如果在全局作用域下 给出这个提示,那整个脚本将采用严格模式。也可以只在函数…

    编程技术 2025年3月8日
    200
  • 详细解读在js函数相关内容

    本篇文章给大家简要分析了js中函数相关的重要知识点,对此有兴趣的朋友可以参考学习下。 要知道,在js中,引用类型是一种数据结构,包含5种引用类型,分别是Object,data,Array,re请输入代码gExp,Function。今天我们就…

    编程技术 2025年3月8日
    200
  • 在Vue2.5中通过json文件读取数据的方法

    本文通过实例代码给大家详细介绍了vue2.5通过json文件读取数据的方法,非常不错,具有参考借鉴价值,需要的朋友参考下吧 1.准备工作 1.1 webpack.dev.conf.js 在 const portfinder = requir…

    编程技术 2025年3月8日
    200
  • JS基础函数使用简介

    这次给大家带来js基础函数使用简介,js基础函数使用的注意事项有哪些,下面就是实战案例,一起来看一下。 /** 函数*  – 函数也是一个对象*  – 函数中可以分钟一些功能(功能),在需要时可以执行这些功能(代码)*  – 函数中可以保存…

    编程技术 2025年3月8日
    200
  • js基础提升教学之变量

    这次给大家带来js基础提升教学之变量,js变量使用的注意事项有哪些,下面就是实战案例,一起来看一下。 一门正常的语言,函数前都属于基础部分 格式:var  变量名称=变量值;(在135版本,必须加声明,即严格模式) —&#821…

    编程技术 2025年3月8日
    200
  • js基础提升学习之基本数据类型

    这次给大家带来js基础提升学习之基本数据类型,使用js基本数据类型的注意事项有哪些,下面就是实战案例,一起来看一下。 javascript的数据类型分为两大类型: 1、基本数据类型:       字符串(String)       数字(N…

    编程技术 2025年3月8日
    200
  • 在Angular.js中使用Swiper插件如何解决不能滑动的问题

    下面我就为大家分享一篇解决angular.js中使用swiper插件不能滑动的问题,具有很好的参考价值,希望对大家有所帮助。 我们都知道swiper是交互体验十分好的轮播插件 但是通过angular(ng-repeat)循环出来的swipe…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论