www.91084.com

GVKun编程网logo

js执行引擎与浏览器内核分析(js 执行引擎)

11

本文将带您了解关于js执行引擎与浏览器内核分析的新内容,同时我们还将为您解释js执行引擎的相关知识,另外,我们还将为您提供关于1.浏览器内核分类、360浏览器:中国为什么没有自主研发的浏览器内核?、J

本文将带您了解关于js执行引擎与浏览器内核分析的新内容,同时我们还将为您解释js 执行引擎的相关知识,另外,我们还将为您提供关于1.浏览器内核分类、360 浏览器:中国为什么没有自主研发的浏览器内核?、JS 判断客户浏览器是否是 IE8 浏览器、jQuery 判断浏览器内核、js_判断浏览器内核是否是safari浏览器的实用信息。

本文目录一览:

js执行引擎与浏览器内核分析(js 执行引擎)

js执行引擎与浏览器内核分析(js 执行引擎)

 js的引擎是单线程执行的,也就是说在js的进程时间线中同一时间只有一个线程在执行,PS:如果不了解单线程与多线程的区别建议看看《现代操作系统》里面有很好的说明。很多人会有疑问,如果是单线程的那么js中是怎么实现onclick、onload、onreadstatechange、setTimeOut等事件的,答案就是浏览器提供。请看下面关于浏览器内核的图:

可以看到浏览器把js执行引擎做为浏览器内核里面的一个线程,当用户在浏览器单击,如果我们添加了onclick时间,那么浏览器帮助我们侦听了这个事件,因为我们(o代表DOM或者BOM对象)o.onclick=function(){};指定对o对象执行onclick时候(即用户点击页面中的元素),浏览器事件触发线程会为我们把指定的事件处理程序添加到js引擎当中。···········细心的人会想,就这样完了么???其实,还涉及到比较复杂的过程,就是js的进程时间线,把指定的事件处理程序(如刚刚的function(){}这代码),实际上我们单击页面中的元素对象(此例子中的o),相当于这样子o.onclick()调用,调用的代码就是执行的那段(function(){.....z这里面的代码······});然后点击o,其实只是把这段代码添加到了js的代码队列里面,其实可能还没有执行。当js进程时间线为空闲的时候,这段代码才会真正的执行。

关于js的进程时间线,我特意画了下面这个图,希望有助于各位理解:

注:handleClick()为我们指定的onclick()事件处理程序代码

从而我们可以得出一个结论:js事件处理机制是异步的,即添加进代码队列里面的时刻与代码实际执行时间可能存在一定时间差。

其实,返观定时器、HTTP异步,其实也就是这么一种处理的模式。

1.浏览器内核分类

1.浏览器内核分类

1.五大浏览器:IE、Firefox、Chrome、Safari和Opera。

2.浏览器内核:渲染引擎和 JS 引擎。
渲染引擎 它负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入 CSS 等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。
JS 引擎 则是解析 Javascript 语言,执行 javascript语言来实现网页的动态效果。

最开始渲染引擎和 JS 引擎并没有区分的很明确,后来 JS 引擎越来越独立,内核就倾向于只指渲染引擎。但是常见的浏览器内核可以分这四种:Trident、Gecko、Blink、Webkit。

(1)Trident(IE内核)

国内很多的双核浏览器的其中一核便是 Trident,美其名曰 "兼容模式"。

代表: IE、傲游、世界之窗浏览器、Avant、腾讯TT、猎豹安全浏览器、360极速浏览器、百度浏览器等。

Window10 发布后,IE 将其内置浏览器命名为 Edge,Edge 最显著的特点就是新内核 EdgeHTML。

(2)Gecko(firefox)

Gecko(Firefox 内核): Mozilla FireFox(火狐浏览器) 采用该内核,Gecko 的特点是代码完全公开,因此,其可开发程度很高,全世界的程序员都可以为其编写代码,增加功能。 可惜这几年已经没落了, 比如 打开速度慢、升级频繁、猪一样的队友flash、神一样的对手chrome。

(3) webkit(Safari)  

 Safari 是苹果公司开发的浏览器,所用浏览器内核的名称是大名鼎鼎的 WebKit。

 现在很多人错误地把 webkit 叫做 chrome内核(即使 chrome内核已经是 blink 了),苹果感觉像被别人抢了媳妇,都哭晕再厕所里面了。

 代表浏览器:傲游浏览器3、 Apple Safari (Win/Mac/iPhone/iPad)、Symbian手机浏览器、Android 默认浏览器,

(4) Chromium/Bink(chrome)

   在 Chromium 项目中研发 Blink 渲染引擎(即浏览器核心),内置于 Chrome 浏览器之中。Blink 其实是 WebKit 的分支。

​     大部分国产浏览器最新版都采用Blink内核。

(5) Presto(Opera)

  Presto 是挪威产浏览器 opera 的 "前任" 内核,为何说是 "前任",因为最新的 opera 浏览器早已将之抛弃从而投入到了谷歌怀抱了。

移动端的浏览器内核主要说的是系统内置浏览器的内核。

目前移动设备浏览器上常用的内核有 Webkit,Blink,Trident,Gecko 等,其中 iPhone 和 iPad 等苹果 iOS 平台主要是 WebKit,Android 4.4 之前的 Android 系统浏览器内核是 WebKit,Android4.4 系统浏览器切换到了Chromium,内核是 Webkit 的分支 Blink,Windows Phone 8 系统浏览器内核是 Trident。

360 浏览器:中国为什么没有自主研发的浏览器内核?

360 浏览器:中国为什么没有自主研发的浏览器内核?

360公司发表了题为《中国为什么没有自主研发的浏览器内核?》的文章,文章中写道:从0到1,从无到有,这是很多人理解的自主研发,按这个标准,国内确实没有自主研发的浏览器内核。360认为,没有自主研发的浏览器内核主要有几个原因:国家发展晚,错过HTML4制定标准的时代;成本太高;以及今天Chromium和Firefox本就是一个开源项目,产品由社区驱动,从授权协议上,它们也鼓励基于已有的技术去做技术创新,而不是重复发明轮子。

以下为全文:

关于浏览器内核自主研发的事情,最近一直闹得沸沸扬扬,口水战很多,但作为国内用户量最大的360浏览器,我们希望能从实战的角度分析下这个事情。

什么是自主研发?很显然,从0到1,从无到有,这是很多人理解的自主研发,按这个标准,国内确实没有自主研发的浏览器内核。

为什么没有?

首先,审视我们的情况,我们国家发展晚,错过HTML4制定标准的时代,很多标准在99年以前就已经定下来,而浏览器又是一个特别需要大家遵守公开开放标准的一个产品,大家想入局,就得基于已有的技术和标准去做事情,在通迅行业的2G/3G标准也是这样,这是既定事实造成的第一个门槛。

其次,成本太高。以目前市场占有率最大的Chrome为例子,Google最多时候调动超过1000个硅谷的程序员集中力量去开发出Chromium内核的浏览,从2008年算,至今也花了10年。按湾区程序员25万美金年薪算,一年研发工资近3亿美金,10年就是30亿美金的研发成本。推广成本更是数倍于研发成本,也就是上百亿。一个浏览器代码接近2400万行,从项目规模来说,已经接近半个操作系统了。Web /Javascript 的标准发展了二十几年,有PB级别的Web文档数据和Javascript脚本被生产出来。Google、微软、苹果作为行业先行者,能够制定规则已经是个无可避免的事实,而国内,没有同等实力的公司有这样的资源,可以投入30亿美金去做自主研发,花上百亿美金去推广。

此外,今天Chromium和Firefox本就是一个开源项目,产品由社区驱动,从授权协议上,它们也鼓励基于已有的技术去做技术创新,而不是重复发明轮子。

基于开源项目遵守开源授权协议,遵守开放式标准去做一个浏览器并不可耻。即使强如Google,Chromium也基于大量开源项目,包括Webkit / Javascript v8 / Zlib / Openssl等等。没有这些开源项目,也不会有Chromium。一个封闭、强调私有标准的自主研发的浏览器,比一个开源,遵守开放式标准的浏览器更危险。从Microsoft Edge的浏览器可以看到,虽然Edge比IE性能更好,比Chrome更省电,Smooth Scroll技术简直吊打Chrome\Firefox\Safari,就算内置到Windows10的系统中去,但是代码不开放,接口不开放,不支持扩展,不兼容老网页等多个原因,导致强如微软都无法把它推起来。

从Chromium/Firefox的项目机制判断,一个开源授权协议就是一个项目的精神。靠开源方式做起来的项目是无法以闭源方式运作下去的,比起开源项目被美国人控制,更应该担心的是标准本身缺少话语权。毕竟浏览器的每行代码,都要受W3C协会,CABForum组织,RFC协议规范。引擎里每一行代码的逻辑,是要受对应的行业标准所约束。2014年的时候,国内浏览器做的跑分大战,就是在比拼谁对W3C的h5标准支持得最好。

以360为例,我们是W3C组织成员,也是CABForum组织的管理成员之一。 360 Hackteam汇报Chromiium\IE\Edge浏览器内核 的0day漏洞。多次获得google / 微软 等公开的致谢。在国际标准制定上,像PKI证书体系的Baseline Requirement的标准制定,我们有1/5的投票权,面对用户需求的时候,我们能够因地制宜的扩展内核,修复漏洞,我们对产品的发展主动权、创新主动权都牢牢掌握在自己手中。面对闭源的IE内核 或者Flash插件,我们也能够以内存钩子、热补丁、第三方接口等方式做功能的扩展和功能增强。这一切都是建立在10年持续的开发和运营经验的结果上。

庞大的用户群体提炼出的需求创新,让我们拥有了创新的主动权,每周发布的版本能够迅速升级到全国4亿台电脑上,是我们的发展的主动权。可以说,就是用户帮我们争取了在国际上的话语权,让我们有能力去影响行业标准,从而惠及我们的用户。浏览器内核只是实现html标准的一个客户端。标准本身能被中国人影响,按照规则投票,比客户端本身更重要。

从内心讲,我们也很希望能够自主研发,但事实是,全球化的今天工程上并不要求产品必须是净室开发的流程,今天有能力实现关键核心技术自主可控的公司,如华为对4G\5G,360对浏览器,都是因为有了巨大的市场份额,基于市场分额折换回来的话语权和主动权。我们希望能够利用这种话语权和主动权,更好地服务用户,服务国产操作系统。

来自:新浪科技

JS 判断客户浏览器是否是 IE8 浏览器、jQuery 判断浏览器内核

JS 判断客户浏览器是否是 IE8 浏览器、jQuery 判断浏览器内核

  今天在使用 encharts 的时候由于要兼容 IE8,所以最终决定在非 IE8 浏览器使用 encharts,在 IE8 使用 amcharts。于是需要使用 JS 判断使用的浏览器版本:

function IEVersion() {
            var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串  
            var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1; //判断是否IE<11浏览器  
            var isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判断是否IE的Edge浏览器  
            var isIE11 = userAgent.indexOf(''Trident'') > -1 && userAgent.indexOf("rv:11.0") > -1;
            if(isIE) {
                var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
                reIE.test(userAgent);
                var fIEVersion = parseFloat(RegExp["$1"]);
                if(fIEVersion == 7) {
                    return 7;
                } else if(fIEVersion == 8) {
                    return 8;
                } else if(fIEVersion == 9) {
                    return 9;
                } else if(fIEVersion == 10) {
                    return 10;
                } else {
                    return 6;//IE版本<=7
                }   
            } else if(isEdge) {
                return ''edge'';//edge
            } else if(isIE11) {
                return 11; //IE11  
            }else{
                return -1;//不是ie浏览器
            }
        }

 

 

返回值类型:

值 值类型 值说明 -1 Number  不是 ie 浏览器 6 Number ie 版本 <=6 7 Number ie7 8 Number ie8 9 Number ie9 10 Number ie10 11 Number ie11 ''edge'' String ie 的 edge 浏览器

 

 

 

 

 

 

 

 

 

通过进一步的封装可以返回 boolean 值类型是否是 IE8 以下浏览器:

function IEVersion() {
        var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串  
        var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1; //判断是否IE<11浏览器  
        var isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判断是否IE的Edge浏览器  
        var isIE11 = userAgent.indexOf(''Trident'') > -1 && userAgent.indexOf("rv:11.0") > -1;
        if (isIE) {
            var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
            reIE.test(userAgent);
            var fIEVersion = parseFloat(RegExp["$1"]);
            if (fIEVersion == 7) {
                return 7;
            } else if (fIEVersion == 8) {
                return 8;
            } else if (fIEVersion == 9) {
                return 9;
            } else if (fIEVersion == 10) {
                return 10;
            } else {
                return 6; //IE版本<=7
            }
        } else if (isEdge) {
            return ''edge''; //edge
        } else if (isIE11) {
            return 11; //IE11  
        } else {
            return -1; //不是ie浏览器
        }
    }
    var sureIsIEAndLower8 = function() {
        var version = IEVersion();
        if (-1 == version) {
            return false;
        } else if (8 < version || "edge" == version) {
            return false;
        }else{
            return true;
        }
    }

 

返回 true 表示是 IE8 以及 IE8 以下浏览器,返回 false 表示不是 IE 或者是 IE8 以上。

 

 

 

补充今天在翻阅 jQueryAPI 的时候发现 jQuery 自带检测浏览器内核的方法:

例如我的测试:

        alert( JSON.stringify($.browser));
        alert( $.browser.version );

 

结果:

chrome:

 

 

IE11:WC--IE11 用的火狐的引擎

 

:

IE10:(microsoft internet explorer

 

 

 

火狐:

 

js_判断浏览器内核是否是safari浏览器

js_判断浏览器内核是否是safari浏览器

/Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent);
<script type="text/javascript">
var 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.([\d.]+)/)) ? Sys.opera = s[1] :
(s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;
//以下进行测试
if (Sys.ie) document.write(''IE: '' + Sys.ie);
if (Sys.firefox) document.write(''Firefox: '' + Sys.firefox);
if (Sys.chrome) document.write(''Chrome: '' + Sys.chrome);
if (Sys.opera) document.write(''Opera: '' + Sys.opera);
if (Sys.safari) document.write(''Safari: '' + Sys.safari);
</script>

PC端只有Chrome有Safari字段吗?为什么不需要判断其他浏览器?
其实360,QQ等浏览器的userAgent字段也会带有Safari字段,但是由于他们基于Chrome二次开发的,所有也会携带有Chrome字段。
所以「匹配规则:拥有Safari字段,并且没有Chrome字段」就可以了。

参考地址

关于js执行引擎与浏览器内核分析js 执行引擎的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于1.浏览器内核分类、360 浏览器:中国为什么没有自主研发的浏览器内核?、JS 判断客户浏览器是否是 IE8 浏览器、jQuery 判断浏览器内核、js_判断浏览器内核是否是safari浏览器的相关信息,请在本站寻找。

本文标签: