浏览器检测

浏览器检测是通过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

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

  1. 推荐 14 个 GitHub 上优质的原创前端博客文章仓库

    大家好,我是你们的 猫哥,那个不喜欢吃鱼.又不喜欢喵 的超级猫 ~ 博客 下面的顺序是随机的,不分先后. SHERlocked93/blog 公众号:前端下午茶 作者:SHERlocked93 作者微 ...

  2. 创建hugo博客_如何创建您的第一个Hugo博客:实用指南

    创建hugo博客 Hugo is a great tool to use if you want to start a blog. 如果您想创建博客,Hugo是一个很好的工具. I use Hugo ...

  3. 利用Octopress搭建一个Github博客

    小引 Octopress是利用Jekyll博客引擎开发的一个博客系统,生成的静态页面能够很好的在github page上展现.号称是hacker专属的一个博客系统(A blogging framewo ...

  4. 如何从零搭建一个hexo博客网站01

    title: 如何从零搭建一个hexo博客网站01 #文章標題 categories: "Hexo教程" #文章分類目錄 可以省略 categories: "Hexo教程 ...

  5. rails官方指南--建一个简易博客

    写这篇博客的原因是国科大高级软件工程(罗老师的课)需要用ruby on rails,在rails入门时,rails官方指南(建一个简易博客)的英文读着吃力所以想一边翻译该指南,一边学习,中间因为有考试 ...

  6. 如何搭建一个独立博客——简明Github Pages与Hexo教程

    (?)[-] http://cnfeat.com/2014/05/10/2014-05-11-how-to-build-a-blog/ 摘要:这是一篇很详尽的独立博客搭建教程,里面介绍了域名注册.DN ...

  7. 如何创建一个个人博客

    说明  折腾了一个月的嵌入式web开发.从nodejs折腾到ajax再到boa,从事事坚持原创到ctrl+c .ctrl+v.学会了使用已有资源了,???.  刚开始的时候,是先用一个前端做了一个个人 ...

  8. 结合HTML5的语义化标签,运用DIV+CSS网页布局技术设计一个个人博客页面

    ** CSS+DIV页面布局 ** 结合HTML5的语义化标签,运用DIV+CSS网页布局技术设计一个个人博客页面.要求: (1)header标签定义页面头部区:nav标签定义导航区:div标签定义中 ...

  9. 收集优质的中文前端博客(不定期更新中)

    收集优质的中文前端博客(不定期更新中) 注:博主的公司信息来自网上公开资料,仅供参考,不保证准确性. 个人(控制在42个以内) 阮一峰的网络日志(蚂蚁金服) <读懂 ECMAScript 规格& ...

最新文章

  1. 疯狂捕鱼之路径解决方案的思考
  2. struts2:struts.xml配置文件详解
  3. 5.2 大间距分类器-机器学习笔记-斯坦福吴恩达教授
  4. php 大批量的删除图片,PHP批量删除记录同时删除图片文件
  5. python之matplotlib详解
  6. 洛谷T1967 货车运输 Kruskal最大生成树倍增LCA
  7. 工作流Activiti 6.x
  8. 默纳克主板c2图纸+底座图纸。维修利器
  9. 仿站和模板建站的区别_不懂建站、资金有限?外贸soho建站先看这几条建议
  10. 什么是域名(Domain Name ) ?
  11. JavaSwing也惊艳之一:水晶之恋
  12. 清华大学就光刻机发声,ASML立马加紧向中国出口光刻机
  13. 文石c67ml carta(firmware:1.8.2)如何全屏看pdf书籍
  14. Go 1.16中值得关注的几个变化
  15. 石墨烯的加入,新量子装置使人类离第二次量子革命真正又近一步
  16. 语言表达逻辑训练,让你说话更条理清晰
  17. 8684网站航班数据获取
  18. uni-app无法触发onReachBottom事件
  19. 利用matlab求点到直线距离和垂足坐标(开源,易使用修改)
  20. 完全竞争市场的含义和特征

热门文章

  1. git merge 的撤销
  2. java中的values函数_详解java 中valueOf方法实例
  3. 最不适合做数据分析的6种性格,看看你占了几个?
  4. matlab在图像处理中的应用论文,MATLAB在数字图像处理中的应用
  5. vue图片插入与设置夜间模式/动态过渡
  6. c语言枚举常量,浅述C语言中枚举enum的用法
  7. 聚集索引和非聚集索引的区别底层_数据库-索引相关
  8. c语言 前置声明,我这个C代码 为什么加了函数前置声明反而会出错,不加倒可以...
  9. 软件工程导论 05章总体设计
  10. Master of GCD 线段树区间更新