功能检测技术 typeOf

Javascript与很多编程语言不同,它不能够控制其运行环境。再写php代码时,只要在服务器端部署了正确的版本,那么程序就绝对能够运行,对于其他python或ruby后端语言来说,也不存在什么灰色区域。Javascript就不同了,它与所有的前端语言一样,都需要各大浏览器的支持。

前端语言必须通过浏览器渲染页面时才能被运行和执行,服务器与客户端的浏览器通过HTTP请求进行通信,接受资源后的浏览器再进行渲染。有很多因素,诸如浏览器对各项功能的支持程度、网络连接速度、屏幕大小、渲染效率等,都是完全不受开发者的控制。

所以,我们通过功能检测技术对那些不确定因素进行逐一排除,为了避免让浏览器报错和性能原因。在原生中这是一种非常重要的开发方式。

1.    判断是否开启javascript功能

检测用户浏览器是否开启了javascript功能,给予用户友好的提示,以免于用户对网站的抱怨。

1 <noscript>为了您的浏览体验,请在浏览器设置中开启javascript功能!</noscript>

如果检测浏览器为IE及之前的旧版本,则给予不同的提示(HTML5 boilerplate):

1 <pclass="chromeframe">您正在使用<strong>过时的</strong>浏览器。请<a
2 href="http://browsehappy.com/">升级您的浏览器</a>或者<a
3 href="http://www.google.com/chromeframe/?redirect=true">开启并更新GoogleChromeFrame插件</a>以改善您的浏览体验!</p>

2.    在使用for循环操作时,有必要检测循环的值

For()运算会占用大量的运算性能,所以开始前有必要检测一下:

 1                 count = fruit.length,
 2                     i;
 3                 //阻止默认行为
 4                 event.preventDefault();
 5
 6                 target.innerHTML = "";
 7                 if(count > 0 || searchValue !==""){
 8                     for(i = 0;i < count;i++){
 9                         var obj = fruit[i],
10                             //将name与searchvalue值相匹配,如果值不等于 -1,那么就与之相匹配
11                             inItfount = obj.name.indexOf(searchValue);
12
13                         //将JSON中匹配的数据写入到DOM
14                         if(isItfount != -1){
15                             target.innerHTML += ‘<p>‘+obj.name+‘<a href="mailto:" ‘+obj.color+‘>‘+obj.color+‘</a></p>‘
16                         }
17                     }
18                 }

3.    判断HTML5版本本地存储API

Cookies是一种即难处理,又不安全的一种技术,它总是和隐私追踪程序、恶意软件等东西绑在一起。所以,W3C在HTML5新版本中定义了localStorage和sessionStorage网络存储方案。对于此类HTML5新API,你得考虑浏览器对该功能的支持情况。如果只关注高端设备及浏览器,那也许这就不是问题,但对于剩下的浏览器来说,可就要小心了(http://www.w3school.com.cn/html5/html_5_webstorage.asp):

 1 //判断HTML5版本本地存储API
 2 if(typeof (localStorage) === "undefined"){
 3     //新版API不支持,需要考虑cookies方案
 4 } else{
 5     //使用JSON.stringObject保存字符串数据
 6     var stringObject = JSON.stringify(favoriteSandwiches);
 7     var localStorage = setItem("favoriteSandwiches",stringObject);
 8     //使用JSON.parse提取为JSON数据
 9     var storedItem = localStorage.getItem("favoriteSandwiches");
10     var convertObject = JSON.parse(storedItem);
11 }

4.    在IE浏览器中添加事件监听器的所需备用代码

在使用addEventListener()方法时要稍微留心一下浏览器是否支持它。IE 8及更早的版本都不支持addEventListener()方法,但它支持功能相似的attachEvent()方法;这两种方法的支持情况不存在交叠:

 1 // IE浏览器中添加事件监听器的备用代码
 2 var btn = document.getElementById("btn");
 3
 4 if(btn.addEventListener){
 5     btn.addEventListener("click",function(){
 6         alert("click the button");
 7     },false)
 8 }else {
 9     btn.attachEvent("click", function () {
10         alert("for IE8 AND below");
11     });
12 }

5.    选取定位DOM节点的方法

随着HTML5标准的发布,javascript根据需求随即进行标准化,将getElementByClassName()、querySelector()、querySelectorAll()方法加入其中。针对新旧浏览器,需要进行支持度检测。如果你嫌麻烦,可以损失一丁点性能选用程序库的"$()"选择器:

 1 //选取定位DOM节点的方法
 2 if(document.querySelector){
 3     document.querySelector(".btn");
 4
 5 } else if(document.getElementsByClassName()){
 6     document.getElementsByClassName("btn");
 7
 8 } else{
 9     document.getElementById("subtn");
10 }

6.    创建Ajax通信服务器对象的方法

XMLHttpRequest对象是所有Ajax调用的核心。执行Ajax调用的第一步就是创建XMLHttpRequest对象,这一步非常容易,但是为了适配IE6等老版浏览器,我们需要进行检测:

 1 function getHTTPObject(){
 2     "use strict";
 3     var xhr;
 4     if(window.XMLHttpRequest){
 5         xhr = new window.XMLHttpRequest();
 6     } else if(window.ActiveXObject){
 7         xhr = new window.ActiveXObject("Msxml2.XMLHTTP");
 8     }
 9     //将通信服务器对象返回
10     return xhr;
11 }

7.    在获取DOM属性时有必要看看它存不存在

1 if(document.getElementsByTagName("a").length > 0){
2     //可以执行for()循环代码
3 }
4
5 if(document.getElementById("btn").hasAttribute){
6     document.getElementById("btn").setAttribute("class","subtn");
7 }

合理的使用功能检测技术能够让我们避开那些本不该踩到的雷区,当然还有更多的功能检测等着我们在实操中去发现。另外,我推荐使用火狐浏览器的firebug开发人员工具进行调试代码,总结经验和不足;欢迎大家相互交流!!

时间: 2024-10-10 09:45:31

功能检测技术 typeOf的相关文章

D语言超强的编译时检测技术,强类型技术

D语言引入了static if , static assert , template , is 等一些语句,使得D语言可以使用编译时执行逻辑处理,同时也能进行编译时测试,这使得编译器在编译时就可以对自定义的类,结构,参数进行动态检测,这样让定义的东西有了强类型功能,牛B之作. import std.stdio; import std.range; int main(string[] argv) { int[] a = [0,1,2]; int[] b = [4,5,6]; auto c = ch

JavaScript学习--Item36 客户端检测技术

JavaScript 客户端检测 JavaScript 客户端检测是指通过javascript,判断客户端的环境,诸如使用的浏览器和操作系统.客户端检测是一种行之有效的开发策略.但不到万不得已,就不要使用客户端检测.先设计通用的方案,然后根据浏览器之间的差异和各自的怪癖quirky,再使用特定于浏览器的技术增强该方案. user-agent字符串检测法是最原始的浏览器检测方式,每个访问网站的程序都必须提供一个user-agent字符来向服务器确定他的身份.navigator对象包含一些浏览器信息

客户端检测技术

客户端检测是javascript开发中最具争议的一个话题,由于浏览器之间存在差别,通常需要根据不同的浏览器能力分别编写不同的代码. 能力检测: 在编写代码之前先检测浏览器的能力.例如,脚本在调用某个函数之前,可能先检测该函数是否存在.这种检测方法将开发人员从考虑具体的浏览器类型和版本中解放出来,让它们把注意力集中到相应的能力是否存在上.能力无法精确地检测特定的浏览器和版本. 怪癖检测: 怪癖实际上是浏览器实际中存在的bug,例如早期的Webkit中就存在一个怪癖,即它会在for-in循环中返回被

入侵检测技术考点

第一章.入侵检测概述 入侵检测定义:入侵是指在非授权得情况下,试图存取信息.处理信息或破坏以使系统不可靠.不可用的故意行为. 入侵检测的基本原理:主要分为四个阶段: 1.      数据收集:数据收集是入侵检测的基础,采用不同的方法进行分析. 2.      数据处理:从原始数据中除去冗余.杂声,并且进行格式化以及标准化处理. 3.      数据分析:检查数据是否正常,或者显示是否存在入侵. 4.      响应处理:发现入侵,采取措施进行保护,保留入侵证据并且通知管理员. 1.4 入侵检测的

伪AP检测技术研究

转载自:http://www.whitecell-club.org/?p=310 随着城市无线局域网热点在公共场所大规模的部署,无线局域网安全变得尤为突出和重要,其中伪AP钓鱼攻击是无线网络中严重的安全威胁之一. 受到各种客观因素的限制,很多数据在WiFi网络上传输时都是明文的,如一般的网页.图片等:甚至还有很多网站或邮件系统在手机用户进行登陆时,将帐号和密码也进行了明文传输或只是简单加密传输(加密过程可逆).因此,一旦有手机接入攻击者架设的伪AP,那么通过该伪AP传输的各种信息,包括帐号和密码

六:入侵检测技术实战

入侵检测技术可实时监控网络传输,自动检测可疑行为,分析来自网络外部入侵信号和内部的非法活动,在系统受到危害前发出警告,对攻击做出实时的响应,并提供补救措施,最大程度地保障系统安全. 6.1 入侵检测概述 所谓入侵检测是指试图监视和尽可能阻止有害信息的入侵,或其他能够对用户的系统和网络资源产生危害的行为.简单地 说,它是这样工作的:用户有一个计算机系统,它与网络连接着,也许也同互联网连接.由于一些原因,允许网络上的授权用户访问该计算机.比如说,有一个连接 着互联网的Web服务器,允许自己的客户.员

浅谈非法外联检测技术的演变

针对隔离内网,非法外联因其危害巨大,一直都是网络边界完整性防护的重中之重. 早期非法外联主要是指以电话拨号为主的私自连接互联网的行为,早期电话拨号还是非常方便的,如163拨号,263拨号等,只要有电话线,就可以随时拨号上网,缺点就是网速慢,收费高.针对早期电话拨号的检测技术是"双机"检测,即一台部署在内网做为扫描端,另一台部署在互联网做为接收端,技术原理大家可以在网上搜,技术实现相对简单,目前已是过时的技术了. 对非法外联的硬性监管要求,加上"双机"检测模式的过时,

DPI (Deep Packet Inspection) 深度包检测技术

详解DPI与网络回溯分析技术 随着网络通讯技术进步与发展,网络通讯已跨入大数据时代,如何监控各类业务系统的通讯数据在大数据流量中传输质量,以及针对海量的网络通讯数据的范畴中存在少量的恶意流量的检测,避免恶意通讯对主机.网络设备的root权限的安全威胁,和通讯内容的窃取.是网络管理必须面对的一个难题. 有攻击的矛,自有防御的盾,这是自然发展的规律.针对大数据的来临,传统的实时检测与防御已不能胜任对海量数据中存在细微异常的甄别.为此,对原始通讯数据的实时备份逐渐彰显出其必要性,而基于时间窗口的回溯分

10 行Python 代码,实现 AI 目标检测技术,真给力!

只需10行Python代码,我们就能实现计算机视觉中目标检测. from imageai.Detection import ObjectDetection import os execution_path = os.getcwd() detector = ObjectDetection() detector.setModelTypeAsRetinaNet() detector.setModelPath( os.path.join(execution_path , "resnet50_coco_b