2018-12-15

8.3 navigator 对象

每个浏览器中的navigator对象都有一套自己的属性:
下表列出了存在于所有浏览器中的属性和方法,以及支持它们的浏览器版本:


2018-12-15_第1张图片
image.png

2018-12-15_第2张图片
image.png

表中的这些navigator对象的属性通常用于检测显示网页的浏览器类型、

8.3.1 检测插件

检测浏览器中是否安装了特定的插件是一件最常见的检测历程。对于非IE浏览器,可以使用plugins数组来达到这个目的。该数组中的每一项都包含下列属性:
◆ name:插件的名字
◆ description:插件的描述
◆ filename:插件的文件名
◆ length:插件所处理的MIME类型数量

//检测插件(在IE中无效)
function hasPlugin(name){
    name=name.toLowerCase();//将传入的名称转换为小写形式,以便于比较
    for(var i=0;i-1){
            return true;
        }
    }//迭代plugins数组,检测name属性
    return false;
}
//检测Flash
alert(hasPlugin("Flash"));
//检测QuickTime
alert(hasPlugin("QuickTime"));

这个hasPlugin函数接受一个参数:要检测的插件名

在IE中检测插件的唯一方式就是使用专有的ActiveXObject类型,并尝试创建一个特定插件的实例。,IE是以COM对象的方式实现插件的,而COM对象使用唯一标识符来表示。因此想要检查特定的插件,就必须知道其COM标识符。

例如,Flash的标识符就是ShockwaveFlash.ShockwareFlash。知道唯一标识符之后,就可以编写类似下面的函数来检测IE中是否安装相应插件了。

//检测IE中的插件
function hasIEPlugin(name){
    try{
        new ActiveXObject(name);
        return true;
    }catch(ex){
          return false;
    }
}

//检测Flash
alert(hasIEPlugin("ShockwaveFlash.ShockwaveFlash"));

//检测QuickTime
alert(hasIEPlugin("QuickTime.QuickTime"))
;

函数hasIEPlugin只接收一个COM标识符作为参数。

鉴于检测这两种插件的方法差别太大,因此典型的做法是针对每个插件分别创建检测函数,而不是使用前面介绍的通用检测方法,例:

···
//检测所有浏览器中的Flash
function hasFlash(){
var result = hasPlugin("Flash");
if(!result){
result = hasIEPlugin("ShockwaveFlash.ShockwareFlash");
return result;
}

//检测所有浏览器中的QuickTime
function hasQuickTime(){
    var result = hasIEPlugin("QuickTime");
    if(!result){
         result = hasIEPlugin("QuickTime.QuickTime");
    }
    return result;
}

//检测Flash
alert(hasFlash());
//检测QuickTime
alert(hasQuickTime());

}
···
上面定义了两个函数:hasFlash()和hasQuickTime()。
每个函数都是先尝试使用不针对IE的插件检测方法。
如果返回了false(在IE中会这样),那么再使用针对IE的插件检测方法。
如果IE的插件检测方法再返回false,则整个方法也将返回false。
只要任何一次检测返回true,整个方法都会返回true。

plugins集合有一个名叫refresh()的方法,用于刷新plugins以反映最新安装的插件。这个方法接收一个参数:表示是否应该重新加载页面的一个布尔值。如果将这个值设置为true,则会重新加载包含插件的所有页面;否则,只更新plugins集合,不重新加载页面。

8.3.2 注册处理程序

Firefox2为navigator对象新增了registerContentHandler()和registerProtocolHandler()方法。
这两个方法可以让一个站点知名它可以处理特定类型的信息。

registerContentHandler()方法接收三个参数:
◆ 要处理的MIME类型
◆ 可以处理MIME类型的页面URL
◆ 应用程序的名称
举个例子:要将一个站点注册为处理RSS源的处理程序,可以如下:

navigator.registerContentHandler("application/rss+xml"
         "Http://www.somereader.com?feed=%s","Some Reader" );

//第一个参数是RSS源的MIME类型
//第二个参数是应该接收RSS源URL的URL,其中的%s表示RSS源URL,由浏览器自动插入。
//当下一个请求RSS源时,浏览器就会打开指定的URL,而相应的web应用程序将以适当方式来处理该请求。

registerProtocolHandler()方法,它也接收三个参数:
◆ 要处理协议(例如,mailto或ftp)
◆ 处理该协议的页面的URL
◆ 应用程序的名称

加入想将一个应用程序注册为默认的邮件客户端,可以使用如下代码:

navigator.registerProtocolHandler("mailto"
         "Http://www.somemailclient.com?cmd=%s","Some Mail Client" );
//这个例子注册了一个mailto协议的处理程序,该程序指向一个基于web的电子邮件客户端。
//同样的第二个参数仍然是处理相应程序的URL

Firefox2虽然实现了registerProtocolHandler(),但该方法还不能用,Firefox3完整实现了这个方法。

你可能感兴趣的:(2018-12-15)