判断浏览器特性

浏览器类型判断

有时候为了判断浏览器对HTML5/CSS3支持情况,我们常常会首先选择判断浏览器类型,浏览器对象中有一个navigator 对象,具有的主要属性如下
appCodeName – 浏览器代码名的字符串表示
appName – 官方浏览器名的字符串表示
appVersion – 浏览器版本信息的字符串表示
cookieEnabled – 如果启用cookie返回true,否则返回false
javaEnabled – 如果启用java返回true,否则返回false
platform – 浏览器所在计算机平台的字符串表示
plugins – 安装在浏览器中的插件数组
taintEnabled – 如果启用了数据污点返回true,否则返回false
userAgent – 用户代理头的字符串表示

我们其中户代理头的字符串userAgent包含了浏览器的信息,包括操作系统以及版本,以及浏览器的内核信息,通过这个属性可以判断出当前页面所处的浏览器环境,帮助针对不同的浏览器实现兼容性。
在Chrome中用户代理头的字符串内容如下
“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36”
firefox中则为
“Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0”
通过正则表达式来匹配是否满足相对应的浏览器的特性

 var Sys = {}; 
var ua = navigator.userAgent.toLowerCase(); 
var s; 
(s = ua.match(/msie ([/d.]+)/)) ? Sys.ie = s[1] : 
(s = ua.match(/firefox//([/d.]+)/)) ? Sys.firefox = s[1] : 
(s = ua.match(/chrome//([/d.]+)/)) ? Sys.chrome = s[1] : 
(s = ua.match(/opera.([/d.]+)/)) ? Sys.opera = s[1] : 
(s = ua.match(/version//([/d.]+).*safari/)) ? Sys.safari = s[1] : 0;

测试代码

if (Sys.ie) document.write('IE: ' + Sys.ie); 
if (Sys.firefox) document.write('Firefox: ' + Sys.firefox); 
if (Sys.chrome) document.write('Chrome: ' + Sys.chrome); 
if (Sys.opera) document.write('Opera: ' + Sys.opera); 
if (Sys.safari) document.write('Safari: ' + Sys.safari);

在Jquery 1.9版本之前有个可以通过$.browser来判断浏览器的类型,但是之后版本中去掉了这个方法,但是可以通过 jQuery.migrate 插件来完成该功能,同时官网推荐Modernizr实现。

Modernizr是专门用来检测浏览器对HTML5和CSS3特性的JS库。

引入Modernizr库之后,很方便地检测浏览的特性

if (Modernizr.borderradius) {
      //do something
   }

   if (Modernizr.csstransforms) {
      //
   }

在某些不支持新特性的浏览器上,Modernizr不仅仅提供了上述方式告诉你,也提供了load功能允许你加载一些shim/polyfill脚本来达到支持的目的.

可以使用Modernizr的load()函数来动态加载脚本,该函数的test属性是表明要测试是否支持的新特性,如果测试成功支持的话,就加载yep属性设置的脚本,如果不支持就加载nope属性设置的脚本,不管是否支持,both属性里设置的脚本都会加载的。例子代码如下:

Modernizr.load({
    test: Modernizr.canvas,
    yep:  'html5CanvasAvailable.js’,
    nope: 'excanvas.js’, 
    both: 'myCustomScript.js' 
});

在该例子里,Modernizr会判断当前浏览器是否支持canvas特性,如果支持,那就会加载html5CanvasAvailable.js和myCustomScript.js这两个脚本,如果不支持,就会加载excanvas.js(用于IE9之前的版本)脚本文件以让该浏览器支持canvas功能,然后再加载myCustomScript.js脚本。

因为Modernizr可以加载脚本,所以你还可以用于其它的用途,比如,如果你引用的第三方脚本(例如提供CDN服务的Google和Microsoft提供jquery的托管)加载失败的情况下,可以加载备用的文件。下面的代码是Modernizr提供的一个加载jquery的示例:

Modernizr.load([
    {
        load: '//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.js',
        complete: function () {
            if (!window.jQuery) {
                Modernizr.load('js/libs/jquery-1.6.4.min.js');
            }
        }
    },
    {
        // This will wait for the fallback to load and
        // execute if it needs to.
        load: 'needs-jQuery.js'
    }
]);

参考资料 Detecting HTML5/CSS3 Features using Modernizr

Node.JS 究竟是什么?

Node旨在解决服务器能够处理的并发连接的最大数量的问题。

Node官网首页有一句话就是对Node是什么以及node解决什么问题做出了介绍,原文如下

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, 
scalable network applications. Node.js uses an event-driven, 
non-blocking I/O model that makes it lightweight and efficient,
perfect for data-intensive real-time applications that run across distributed devices.

大概意思是说Node是基于Chrome的javascript的引擎,旨在提供一种简单的构建可伸缩网络程序的方法,node特点是基于事件驱动,非阻塞I/O,同时还有一个特点没有直接提到就是单线程。

在 Java™ 和 PHP 这类语言中,每个连接都会生成一个新线程,每个新线程可能需要 2 MB 的配套内存。在一个拥有 8 GB RAM 的系统上,理论上最大的并发连接数量是 4,000 个用户。随着您的客户群的增长,如果希望您的 Web 应用程序支持更多用户,那么,您必须添加更多服务器。当然,这会增加服务器成本、流量成本和人工成本等成本。除这些成本上升外,还有一个潜在技术问题,即用户可能针对每个请求使用不同的服务器,因此,任何共享资源都必须在所有服务器之间共享。鉴于上述所有原因,整个 Web 应用
Node 解决这个问题的方法是:更改连接到服务器的方式。每个连接发射一个在 Node 引擎的进程中运行的事件,而不是为每个连接生成一个新的 OS 线程(并为其分配一些配套内存)。Node 声称它绝不会死锁,因为它根本不允许使用锁,它不会直接阻塞 I/O 调用。Node 还宣称,运行它的服务器能支持数万个并发连接。

为什么选择是Javascript 语言

  • V8 JavaScript 引擎是 Google 用于其 Chrome 浏览器的底层 JavaScript 引擎。很少有人考虑 JavaScript 在客户机上实际做了些什么?实际上,JavaScript 引擎负责解释并执行代码。Google 使用 V8 创建了一个用 C++ 编写的超快解释器,该解释器拥有另一个独特特征;可以下载该引擎并将其嵌入任何 应用程序。
  • JavaScript 是一种很棒的事件驱动编程语言,因为它允许使用匿名函数和闭包,更重要的是,任何写过代码的人都熟悉它的语法。事件发生时调用的回调函数可以在捕获事件处进行编写。这样可以使代码容易编写和维护,没有复杂的面向对象框架,没有接口,没有过度设计的可能性。只需监听事件,编写一个回调函数,其他事情都可以交给系统处理!
    由于V8正好可以满足上述提到Node几个特点,以及Javascript独特优势,以及Javascript的大量用户,所以NodeJS就这样地产生了。

Node适合做什么工作。实时 高并发I/O,弱密集逻辑计算

  • RESTful API
  • 新浪微博、twiter这样高并发的应用
  • 编写网络小工具。
  • 聊天程序
  • 游戏后台
  • 股票等实时信息展示网站。

同时Node有数万的计的第三方模块,Node 的一个特性是 Node Package Module,这是一个内置功能,用于安装和管理 Node 模块。它自动处理依赖项,因此您可以确定:您想要安装的任何模块都将正确安装并包含必要的依赖项。它还支持将您自己的模块发布到 Node 社区,假如您选择加入社区并编写自己的模块的话。您可以将 NPM 视为一种允许轻松扩展 Node 功能的方法,不必担心这会破坏您的 Node 安装。同样,如果您选择深入学习 Node,那么 NPM 将是您的 Node 解决方案的一个重要组成部分。

优秀的设计+众多开发者的支持,应该是Node平台火起来的原因吧。