JS检测浏览器插件

检测浏览器是否安装了特定的插件,对于非IE浏览器,可以使用plugins数组(navigator的属性)
plugins数组的每一项均包含有以下属性:
name:插件的描述
description:插件的描述
filename:插件的文件名
length:插件所处的MIME类型数量
PS:MIME:Multiple Internet Mail Extensions 多用途互联网邮件扩展类型
这里写图片描述

在IE中检测插件的唯一方式就是使用专用的ActiveXObject类型,并尝试创建一个特定插件的实例。IE是以COM对象使用唯一标识。因此,要想检查特定的插件,就必须知道其COM标识符。例如:Flash的标识符是ShockwaveFlash.ShockwaveFlash。知道唯一标识符之后,就可以编写函数检测IE中是否安装相应的插件了。
IE只能是逐个new ActiveXObject(name);既定的插件名,然后通过是否实例成功侧面检测指定的插件是否已安装。

这里写图片描述

原本是想通过检测浏览器类型去决定使用哪种方式去检测,但是由于IE浏览器中并非是简单的时候插件的名字,因此最好的方式还是针对每个插件分别创建检测函数。很遗憾,未找到一个更好的方式。

    //IE中无效
    function hasPlugin(name){
        name = name.toLowerCase();      
            for(var i = 0; i < navigator.plugins.length; i++){
                if(navigator.plugins[i].name.toLowerCase().indexOf(name) > -1){
                    return true;
                }
            }
            return false;               
    }
    //IE浏览器
    function hasIEPlugin(name){
        try{
            new ActiveXObject(name);
            return true;
        }catch (ex){
            return false;
        }
    }
//检测浏览器是否有Flash插件
    function hasFlash(name){
        var result = hasPlugin(name);
        if(!result){
            result = hasIEPlugin("ShockwaveFlash.ShockwaveFlash");
        }
        return result;
    }

当你的代码运行需要基于某插件才能看到效果时,检测浏览器中是否安装了此插件,并给出相应的提示信息,请看下面代码:

    if(!hasFlash("flash")){
        if(window.confirm("系统检测到您的电脑尚未安装该页面必须的Flash插件,
            需要您关闭浏览器后下载并按照提示安装该插件。
您确定继续下载安装Flash插件吗?")){
            var newWindow = window.open("http://wwww.baidu.com", "_blank", "");
            if(newWindow == null){
                //打开新窗口失败
                window.location = "http://wwww.baidu.com"; //在本窗口打开
            }
        }
    }

简单介绍一下window.open()函数
window.open(URL,name,features,replace)
URL参数要打开的url,如果省略该参数,或者传一个空字符串,那么窗口中不会显示任何内容。(可选)
Name参数是新窗口的名称,该名称可以用作<a><form>的属性的target值,如果该参数指定一个依旧存在的窗口,那么open()方法就不会再创建一个新窗口,而只是返回对指定窗口的引用,在这种情况下,features将被忽略。(可选)
features参数声明新窗口要显示的标准浏览器的特征,如果省略改参数,新窗口具有所有标准特征。(可选)
replace参数,是一个布尔值,规定装载到窗口的URL是在窗口的浏览历史中创建一个新条目,还是替换浏览历史中的当前条目
true:替换浏览历史中的当前条目,
false在浏览历史中创建新的条目。
对于最后一个参数replace,很遗憾,在火狐中试了好几次,并没有见到想见的效果,每次都是在浏览器历史中创建了新的条目。

name参数
_blank:在新窗口中打开url。
_self:在当前窗口中打开URL,覆盖当前文档。
_top:在所有框架之外的最顶层窗口中打开URL。假如当前窗口无框架结构,此参数值等同于_self。
_parent:在当前框架的父框架内打开。假如当前框架无父框架,此参数值等同于_self。
_search:IE5.0在浏览器左边的搜索面板内打开URL。
features参数
这里写图片描述

最后再说明一下window.location和window.location.href。
本质上来说window.location是一个对象(包括href ,host, hostname等属性),而window.location.href是一个属性。
但是在对window.location进行赋值操作时,就是赋值给了window.location.href。
因此使用window.location = "http://www.qq.com";或者是"window.location.href = "http://www.qq.com"效果是一样的

对于检测浏览器插件,如您有更好的方式,请给我留言,谢谢。

文章导航