一个前端博客(9)——浏览器检测和加载

本文介绍了如何使用JavaScript检测浏览器类型及版本,并优化页面加载过程,确保用户体验。文章提供了具体实现方法,包括通过navigator.userAgent获取浏览器信息,以及针对不同浏览器采用合适的DOM加载策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浏览器检测

浏览器检测是通过JavaScript BOM的navigator对象实现的。

Navigator.userAgent W3C上:userAgent 属性是一个只读的字符串,声明了浏览器用于 HTTP 请求的用户代理头的值

通过下面的js代码,获得浏览器版本号:

var ua = navigator.userAgent.toLowerCase();

不过这里包含一些我们不需要的信息,通过观察不同浏览器获得的ua,使用正则,将版本号取出来。不过在这儿之前我们需要为全局设置一个sys对象和一个变量s。

window.sys = {};
var s;

sys对象用于存储浏览器信息,可以直接调用查看。而变量s是用来存储正则匹配出来的数组。s[1]就是版本号。

正则这里不详细说,代码如下:

    window.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\/.*version\/([\d.]+)/)) ? sys.opera = s[1] : 
    (s = ua.match(/version\/([\d.]+).*safari/)) ? sys.safari = s[1] : 0;

最后还有一点就是,我们要在一开始就检测,之后不再检测。这需要我们利用IIFE(立即调用的函数表达式),来在一开始执行。

完整代码如下:

(function(){
    window.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\/.*version\/([\d.]+)/)) ? sys.opera = s[1] : 
    (s = ua.match(/version\/([\d.]+).*safari/)) ? sys.safari = s[1] : 0;
})();

 加载

 我们通常会使用这种方式来加载网页:

window.onload = fuction() {
      //code.....
}

 window.onload是在dom文档树加载完和所有文件加载完之后执行一个函数,而这样会导致在长时间加载页面的情况下,js程序是不可用的状态。而js其实只需要HTML DOM

文档结构构造完毕后就可以使用了,没有必要等待注入图片音乐和外部内容加载。

不过又由于兼容性问题。所以就会有不同的方式。

对于现代非IE浏览器,通过DOMContentLoaded事件来实现。

addEvent(document,'DOMContentLoaded',function() {});

对于低版本的非IE浏览器,通过检查document, document.getElementById,document.getElementsByTagName, document.body可不可用来判断是否加载完。

对于IE9以下,通过document.documentElment.doScroll('left');如果没有加载完,则会发生异常。

综合上述:

    if((sys.opera && sys.opera < 9) || (sys.firefox && sys.firefox < 3) || (sys.webkit && webkit < 525)) {
        timer = setInterval(function() {
            if(document && document.getElementById && document.getElementsByTagName && document.body) {
                
            }
        }, 1);
    }else if(document.addEventListener) {
        addEvent(document, 'DOMContentLoaded', function() {
           
        });
    }else if(sys.ie && sys.ie < 9) {
        var timer = null;
        timer = setInterval(function() {
            try {
                document.documentElement.doScroll('left');
                
            }catch(e){};
        }, 1);
    }

这里我们用到了定时器,当我们加载成功后,应该执行函数,清楚定时器。把这个工作封装以下。

function doReady() {
        if(timer) clearInterval(timer);
        if(isReady) return;
        isReady = true;
        fn();
    }

最后完整代码如下:

function addDomLoaded(fn) {
    var isReady = false;
    var timer = null;
    function doReady() {
        if(timer) clearInterval(timer);
        if(isReady) return;
        isReady = true;
        fn();
    }

    if((sys.opera && sys.opera < 9) || (sys.firefox && sys.firefox < 3) || (sys.webkit && webkit < 525)) {
        timer = setInterval(function() {
            if(document && document.getElementById && document.getElementsByTagName && document.body) {
                doReady();
            }
        }, 1);
    }else if(document.addEventListener) {
        addEvent(document, 'DOMContentLoaded', function() {
            fn();
            removeEvent(document, 'DOMContentLoaded', arguments.callee);
        });
    }else if(sys.ie && sys.ie < 9) {
        var timer = null;
        timer = setInterval(function() {
            try {
                document.documentElement.doScroll('left');
                doReady();
            }catch(e){};
        }, 1);
    }
}

这些写在了我们的工具函数tool.js文件里。下面我们来修改Tar.js

我们希望能和jQuery以下,通过这种方式来加载:

$(function(){});

我们相当于传递了一个函数。所以修改构造函数部分:

function Tar(args) {
    //存储节点数组
    this.elements = [];
    if(typeof args == 'string') {
        //css模拟
        
    }else if(typeof args == 'object') {
        
    }else if(typeof args == 'function') {
        this.ready(args);
    }
};

判断如果参数是函数的话,直接调用ready方法。我们再写Tar的ready方法:

Tar.prototype.ready = function(fn) {
    addDomLoaded(fn);
};

待续。。。。

 

转载于:https://www.cnblogs.com/targeral/p/4931707.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、COSO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析模拟,揭示了生物质炉具在实际应用中的优点挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值