使用JavaScript检测浏览器的相关特性

简介:
一、检测浏览器的名称
问题:
    不同的浏览器对JavaScript的标准支持也有不同,有时希望脚本能够在不同的浏览器上都能运行良好,这时需要对浏览器进行检测,确定其名称,以针对不同的浏览器编写相应的脚本。
解决方案:
    使用navigator对象的appName属性。
    比如,要检测浏览器是否为IE,可以这么做:
     var  isIE  =  (navigator.appName  ==   " Microsoft Internet Explorer " );
    document.write(
" is IE? "   +  isIE);

    对于FireFox,navigator对象的appName属性值为"Netscape";Opera9.02的appName属性值为"Opera"(其更早版本可能不同);

二、检测浏览器的版本号:
问题:
    随着浏览器的版本的更迭,浏览器所支持的脚本特性也在变化,有时候就需要针对不同的版本编写相应的脚本,那么如何获得浏览器的版本号?
解决方案:
    通过解析navigator对象的userAgent属性来获得浏览器的完整版本号。
    IE将自己标识为MSIE,后面带一个空格,版本号以及分号。所以我们只要取空格和分号之间的部分即可。如Windows XP SP2所带的IE的userAgent属性值为"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",可以看到其版本为6.0。可以用如下的函数来获取IE浏览器的版本号:
     function  getIEVersonNumber()
    {
        
var  ua  =  navigator.userAgent;
        
var  msieOffset  =  ua.indexOf( " MSIE  " );
        
if (msieOffset  <   0 )
        {
            
return   0 ;
        }
        
return  parseFloat(ua.substring(msieOffset  +   5 , ua.indexOf( " ; " , msieOffset)));
    }

假设我们要为IE5及以上版本编写脚本,可以这么写:
     var  isIE5Min  =  (getIEVersonNumber()  >=   5 );
    
if (isIE5Min)
    {
        
//  perform statements for IE 5 or later
    }

    对于FireFox和Opera等浏览器,也可以用navigator.userAgent属性来获取其版本号,只不过其形式与IE有所不同,如FireFox:
    Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7
    Opera:Opera/9.02 (Windows NT 5.1; U; en)根据这些形式,我们不难获得其版本号。但这些浏览器的其它版本没有测试过,其具体值不明确,如果要使用这种方法检测,请自行验证。

    下面讨论下,上面的那段为IE5及以上版本浏览器编写的脚本,使用这种写法要注意:要用>=而不是==,一般情况下,我们可以假定浏览器是向后兼容的,所以使用==显然不能适应新版本;另一方面,我们上面的假定也仅仅是假定,不能确保是这样,如果浏览器的某些对象或属性不能向后兼容,我们的代码也会产生问题,所以建议,少用浏览器版本的比较,更多情况下,应检测是要用的对象或属性是否得到支持。

三、检测客户端的操作系统类型
根据上面的讨论可以看到,navigator.userAgent属性通常含有操作系统的基本信息,但很不幸,没有统一的规则去根据userAgent获取准确的操作系统信息,因为这些值与浏览器的种类、浏览器的版本甚至浏览器的OEM版本都有关系。
通常我们能做的是,检测一些更为通用的信息,比如操作系统是Windows还是Mac,而不是去看是Windows 98还是Windows XP。其规则是所有的Windows版本都会含有"Win",所有的Macintosh版本都含有"Mac",所有的Unix则含有"X11",而在Linux下则同时包含"X11"和"Linux"。如:
     var  isWin  =  (navigator.userAgent.indexOf( " Win " !=   - 1 );
    
var  isMac  =  (navigator.userAgent.indexOf( " Mac " !=   - 1 );
    
var  isUnix  =  (navigator.userAgent.indexOf( " X11 " !=   - 1 );

通常用在为不同的操作系统设置不同的字体或位置等样式。

四、检测浏览器对特定对象的支持
问题:
    如果需要编写对多种浏览器或浏览器的多个版本都能适用的脚本,就要进行检测一下,浏览器是否支持某个对象。当然这种检测主要是针对那些潜在的不兼容对象的语句。
解决方案:
    早期的浏览器对于img元素的支持差别很大,所以要在脚本中操作img元素,需要检测浏览器是否支持。这时我们不需要对所有可能的浏览器一一检测,只需在必要的地方用下面的方式检测:
     function  rollover(imgName, imgSrc)
    {
        
//  如果支持images对象
         if (document.images)
        {
            
//  statements go here
        }
    }

    这种方法能够生效是基于一个事实:如果document.images对象不存在,那么if求值的结果为false。

    使用这种方法,使得对对象的检测变得简单易行,但是我们要注意,对于那些不支持该对象的浏览器要如何较好得处理。看下面的代码:
     function  getImgAreas()
    {
        
var  result  =   0 ;
        
for ( var  i  =   0 ; i  <  document.images.length; i ++ )
        {
            result 
+=  (document.images[i].width  *  document.images[i].height);
        }
        
return  result;
    }
   
    
function  reportImageArea()
    {
        document.form1.imgData.value 
=  getImgAreas();
    }

    这里没用对象支持的检测。如果浏览器支持document.images,这两个函数运行正常;否则就会抛出异常。下面是改进的脚本:
     function  getImgAreas()
    {
        
var  result;
        
//  检测浏览器是否支持对象
         if  (document.images)
        {
            result 
=   0 ;
            
for  ( var  i  =   0 ; i  <  document.images.length; i ++ )
            {
                result 
+=  (document.images[i].width  *  document.images[i].height);
            }
        }
        
//  返回值为一个数字或null
         return  result;
    }
    
function  reportImageArea()
    {
        
//  现在可以判断返回值
         var  imgArea  =  getImgAreas();
        
var  output;
        
if  (imgArea  ==   null )
        {
            
//  对于不支持images对象的浏览器也要给出相应信息
            output  =   " Unknown " ;
        } 
else  {
            output 
=  imgArea;
        }
        document.reportForm.imgData.value 
=  output;
    }

这样,不管浏览器是否支持该对象,都能给用户比较合理的信息,而不会跳出突兀的错误信息。

五、检测浏览器对特定属性和方法的支持
问题:
    检测一个对象是否含有某个特定的属性或方法。
解决方案:
    大多数情况下,可以用类似于下面的代码来判断:
     if (objectTest  &&  objectPropertyTest)
    {
        
//  OK to work with property
    }

    先检测对象是否存在,然后再检测对象的属性是否存在。如果对象确实不存在,该方法有效;如果属性存在,但其值为null, 0, false,if语句求值的结果也将是false!所以这种方法并不安全,最好的方法是这样:
     if  (objectReference  &&   typeof (objectReference.propertyName)  !=   " undefined " )
    {
        
//  OK to work with property
    }

    对于方法的检测也可用类似的方法:
     function  myFunction()
    {
        
if  (document.getElementById)
        {
            
//  这里可以使用getElementById方法
        }
    }

 


本文转自一个程序员的自省博客园博客,原文链接:http://www.cnblogs.com/anderslly/archive/2006/10/25/browserfeature.html,如需转载请自行联系原作者。

目录
相关文章
|
10月前
|
数据采集 前端开发 JavaScript
深挖navigator.webdriver浏览器自动化检测的底层分析
本文详细讲解了如何通过技术手段破解浏览器 `navigator.webdriver` 检测,结合爬虫代理、多线程等策略,在豆瓣图书页面批量采集数据。具体包括:隐藏 Selenium 特征、配置代理突破 IP 限制、设置伪装用户、利用多线程提升效率。文章面向初学者,提供分步教程与示例代码,同时设有「陷阱警告」帮助规避常见问题。目标是从底层实现反检测,高效采集图书评分、简介、作者等信息,适合具备 Python 和 Selenium 基础的读者实践学习。
416 12
深挖navigator.webdriver浏览器自动化检测的底层分析
|
11月前
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
345 23
|
算法 开发者
Moment.js库是如何处理不同浏览器的时间戳格式差异的?
总的来说,Moment.js 通过一系列的技术手段和策略,有效地处理了不同浏览器的时间戳格式差异,为开发者提供了一个稳定、可靠且易于使用的时间处理工具。
749 156
|
11月前
|
数据采集 JavaScript 前端开发
浏览器自动化检测对抗:修改navigator.webdriver属性的底层实现
本文介绍了如何构建一个反检测爬虫以爬取Amazon商品信息。通过使用`undetected-chromedriver`规避自动化检测,修改`navigator.webdriver`属性隐藏痕迹,并结合代理、Cookie和User-Agent技术,实现稳定的数据采集。代码包含浏览器配置、无痕设置、关键词搜索及数据提取等功能,同时提供常见问题解决方法,助你高效应对反爬策略。
1029 1
|
Web App开发 前端开发 JavaScript
折腾之王:JavaScript之父Brave浏览器与BAT的诞生
2015年,JavaScript之父Brendan Eich再次创业,推出Brave浏览器和加密货币Basic Attention Token(BAT),旨在颠覆传统广告行业。Brave屏蔽广告、保护隐私,加载速度快;BAT则通过奖励机制让用户、内容创作者和广告主三方受益。尽管面临用户习惯和巨头竞争的挑战,Brave已拥有超4000万月活跃用户,成为全球增长最快的隐私浏览器,引领Web3生态发展。
505 22
折腾之王:JavaScript之父Brave浏览器与BAT的诞生
|
移动开发 JavaScript 前端开发
一些处理浏览器兼容性问题的JavaScript库
这些库在处理浏览器兼容性问题方面都有着各自的特点和优势,可以根据具体的需求和项目情况选择合适的库来使用,从而提高代码的兼容性和稳定性,为用户提供更好的体验。同时,随着浏览器技术的不断发展,还需要持续关注和学习新的兼容性解决方案。
443 58
|
JavaScript 前端开发 容器
盘点JavaScript中所有声明变量的方式及特性
本文详细介绍了JavaScript中变量定义的多种方式,包括传统的`var`、`let`和`const`,以及通过`this`、`window`、`top`等对象定义变量的方法。每种方式都有其独特的语法和特性,并附有代码示例说明。推荐使用`let`和`const`以避免作用域和提升问题,谨慎使用`window`和`top`定义全局变量,不建议使用隐式全局变量。掌握这些定义方式有助于编写更健壮的JS代码。
383 11
|
JavaScript 前端开发 安全
JavaScript与TypeScript的对比,分析了两者的特性及在实际项目中的应用选择
本文深入探讨了JavaScript与TypeScript的对比,分析了两者的特性及在实际项目中的应用选择。JavaScript以其灵活性和广泛的生态支持著称,而TypeScript通过引入静态类型系统,提高了代码的可靠性和可维护性,特别适合大型项目。文章还讨论了结合使用两种语言的优势,以及如何根据项目需求和技术背景做出最佳选择。
1808 4
|
JavaScript 前端开发
JavaScript DOM 操作:如何检测浏览器是否支持某个特性?
JavaScript DOM 操作:如何检测浏览器是否支持某个特性?
177 0