浏览器内核

今天面试碰到了一个浏览器内核的问题。
当时自己懵的状态,我没有进行联想,其实现在想想应该是跟css兼容和js兼容相关的问题。
浏览器厂商不同,内核不同。
所谓的“浏览器内核”无非指的是一个浏览器最核心的部分——“Rendering Engine”,直译这个词汇叫做“渲染引擎”,不过我们也常称其为“排版引擎”、“解释引擎”。这个引擎的作用是帮助浏览器来渲染网页的内容,将页面内容和排版代码转换为用户所见的视图。

注:有时候我们所说的“浏览器内核”甚至“渲染引擎”,其实除了渲染引擎,也悄悄包含了javascript引擎,如WebKit,它由渲染引擎WebCore和javascript引擎JSCore组成。

常见的浏览器内核(或者说渲染引擎)有很多个,如Trident、Gecko、WebKit等等,不同的内核对网页编写语法的解释也有不同,进而导致同一个页面在不同内核的浏览器下显示出来的效果也会有所出入,这也是前端工程师需要让作品兼容各种浏览器的原因。

我们常常喜欢把浏览器内核与某浏览器名称直接挂钩起来,如IE内核、Chrome内核,其实是不全面的说法。比如Opera在7.0版本到12.16版本中采用的是独立研发的Presto引擎,但在后续跟随了Chrome的脚步加入了WebKit大本营,放弃了Presto;另外即使名称相同,但版本不同的引擎也可能存在较大差别。比如IE6使用的是Trident早期版本,存在许多bug,性能也较低。而最新的IE11所使用的Trident7.0版本已经可以支持WebGL(3D绘图标准)以及HTML5大部分标准。

下面按照各个主流浏览器,介绍下它们所使用的浏览器内核的历程。

Internet Explorer:
IE开发计划开始于1994年夏天,微软为抵抗当时主流的网景Netscape Navigator,要在Windows中开发适合自己的浏览器,但微软并没有时间从零开始。因此和Spyglass合作,于是IE从早期一款商业性的专利网页浏览器Spyglass Mosaic派生出来,虽然Spyglass Mosaic与NCSA Mosaic(首款应用得最广泛的网页浏览器)甚为相似,但Spyglass Mosaic则相对地较不出名并使用了NCSA Mosaic少量的源代码。

1996年,微软通过给予季度费用和部分收入从Spyglass中取得了Spyglass Mosaic的源代码和授权。从而使IE逐渐成为微软专属软件。它采用的排版引擎(俗称内核)为Trident。每一次新的IE版本发布,也标志着Trident内核版本号的提升。

下面是各Trident版本信息:

冷知识:除Trident之外,微软还有另一个网页浏览器排版引擎,称为Tasman,它是使用在「Internet Explorer for Mac」的排版引擎。相较于Trident,Tasman引擎对网页标准有较佳的支持,但微软自04年开始已经停止了Mac计算机版本的 Internet Explorer的开发。

Safari
Safari是苹果公司开发的浏览器,使用了KDE(Linux桌面系统)的KHTML作为浏览器的运算核心,Safari所用浏览器内核的名称是大名鼎鼎的WebKit。 Safari在2003年1月7日首度发行测试版,并成为Mac OS X v10.3与之后版本的默认浏览器,也成为苹果其它系列产品的指定浏览器(也已支持Windows平台)。

如上述可知,WebKit前身是KDE小组的KHTML引擎,可以说WebKit是KHTML的一个开源的分支。当年苹果在比较了Gecko和KHTML后,选择了后者来做引擎开发,是因为KHTML拥有清晰的源码结构和极快的渲染速度。

需要了解的是,虽然我们称WebKit为浏览器内核(或浏览器引擎),但不太适合直接称之为我们开头提到的Rendering Engine(渲染引擎),因为WebKit本身主要是由两个引擎构成的,一个正是渲染引擎“WebCore”,另一个则是javascript解释引擎“JSCore”,它们均是从KDE的渲染引擎KHTML及javascript解释引擎KJS衍生而来。

在2010年4月,苹果公司宣布了其浏览器引擎Webkit的最新项目 Webkit2。Webkit2的目标是实现独立进程与非阻断式API。

WebKit可以说是苹果公司给开源世界的一大贡献,基于此开源引擎,衍生了多个WebKit分支,如下面要介绍的Chrome的浏览器引擎。

Chrome / Chromium
谷歌Chrome/Chromium浏览器从08年创始至今一直使用苹果公司的WebKit作为浏览器内核原型,是WebKit的一个分支,我们可以称之为Chromium引擎(注意我们这里说的是Chromium引擎,而不是Chromium浏览器)。

这里顺便介绍下Chrome和Chromium两个浏览器的区别——Chromium浏览器是谷歌为发展自家的浏览器Chrome而开启的计划,所以Chromium相当于Chrome的工程版或称实验版(尽管Chrome自身也有β版阶段),新功能会率先在Chromium上实现,待验证后才会应用在Chrome上。Chromium一天最多可以更新十几二十个版本,实验性的新特性都会现在这里放出,但是Chromium本身其实并不稳定;而Chrome总共有四个更新分支:Canary、Dev、Beta、Stable,稳定性依次增强。

我们说回引擎。Chromium引擎虽然是属于WebKit的分支,却把WebKit的代码梳理得可读性提高很多,所以以前可能需要一天进行编译的代码,现在只要两个小时就能搞定。因此Chromium引擎和其它基于WebKit的引擎所渲染页面的效果也是有出入的。基于以上原因,有的地方会把Chromium引擎跟WebKit区分开来,有的地方则直接把Chromium引擎归为WebKit(比如维基百科),其实都有其道理。

然而在13年发布的Chrome 28.0.1469.0版本开始,Chrome放弃Chromium引擎转而使用最新的Blink引擎(基于WebKit2——苹果公司于2010年推出的新的WebKit引擎),Blink对比上一代的引擎精简了代码、改善了DOM框架,也提升了安全性。

Opera
Opera浏览器,是一款挪威Opera Software ASA公司制作的支持多页面标签式浏览的网络浏览器。是跨平台浏览器可以在Windows、Mac和Linux三个操作系统平台上运行。Opera浏览器创始于1995年4月,到2014年3月4日,官方发布的个人电脑用的最新版本为Opera20。

Opera的一个里程碑作品是Opera7.0,因为它使用了Opera Software自主开发的Presto渲染引擎,取代了旧版Opera 4至6版本使用的Elektra排版引擎。

Presto加入了动态功能,例如网页或其部分可随着DOM及Script语法的事件而重新排版。Presto在推出后不断有更新版本推出,使不少错误得以修正,以及阅读Javascript效能得以最佳化,并成为当时速度最快的引擎。

然而为了减少研发成本,Opera在2013年2月宣布放弃Presto,转而跟随Chrome使用WebKit分支的Chromium引擎作为自家浏览器核心引擎。

在Chrome与2013年推出Blink引擎(也是基于WebKit的分支)之后,Opera也紧跟其脚步表示将转而使用Blink作为浏览器核心引擎。

Firefox
Mozilla Firefox是一个开源网页浏览器,原名是Firebird,2004年2月9日,Mozilla Firebird决定改称Mozilla Firefox。Firefox浏览器使用的是Gecko内核,其发展历程如下:

1997年,网景收购了DigitalStyle。当时,网景浏览器在各方面的表现已经比不上她的主要竞争对手Internet Explorer。网景开始研发下一代的排版引擎,并期望把新的排版引擎应用于下一版本的网景浏览器上。

1998年初,Mozilla计划开始执行。这个新的排版引擎名为Raptor,以开发源码的方式发放于互联网上。后来,因为商标问题,Raptor改名为NGLayout(即next generation layout之意)。而最后NGLayout就被网景重新命名为Gecko。

2003年7月15日时代华纳解散了网景公司,大部分开发者被解雇。Mozilla基金会亦在当天成立,继续推动着Gecko的发展。时至今天,Gecko仍继续由Mozilla的雇员和义工所维护和发展。

最后还是再谈谈javascript引擎(后面统称JS引擎)这东西。我们上述的渲染引擎主要是负责HTML、CSS以及其他一些东西的渲染,而JS引擎则主要负责对javascript的渲染,一个JS引擎的好坏决定了一个浏览器对脚本的加载和执行速度,也影响了其跑分。

下方列出各种主流浏览器各自的JS引擎,了解下即可:

Firefox:
SpiderMonkey:第一款JavaScript引擎,由Brendan Eich在Netscape Communications时编写,用于Mozilla Firefox 1.0~3.0版本。

Rhino:由Mozilla基金会管理,开放源代码,完全以Java编写。

TraceMonkey:基于实时编译的引擎,其中部份代码取自Tamarin引擎,用于Mozilla Firefox 3.5~3.6版本。

JaegerMonkey:德文Jäger原意为猎人,结合追踪和组合码技术大幅提高性能,部分技术借凿了V8、JavaScriptCore、WebKit:用于Mozilla Firefox 4.0以上版本。

IonMonkey:可以对JavaScript编译后的结果进行优化,用于Mozilla Firefox 18.0以上版本。

OdinMonkey:可以对asm.js进行优化,用于Mozilla Firefox 22.0以上版本。

Chrome:
V8:开源,由Google丹麦开发,是Google Chrome的一部分。

注:我们上面提到Chrome是基于WebKit的分支,而WebKit又由渲染引擎“WebCore”和JS解释引擎“JSCore”组成,可能会让你搞不清V8和JSCore的关系。你可以这样理解——WebKit是一块主板,JSCore是一块可拆卸的内存条,谷歌实际上认为Webkit中的JSCore不够好,才自己搞了一个V8 JS引擎,这就是Chrome比Safari在某些JS测试中效率更高的原因。

IE:
Chakra:中文译名为查克拉,用于Internet Explorer 9的32位版本及IE10+。

Opera:
Linear A:用于Opera 4.0~6.1版本。

Linear B:用于Opera 7.0~9.2版本。

Futhark:用于Opera 9.5~10.2版本。

Carakan:由Opera软件公司编写,自Opera10.50版本开始使用。

其它:
KJS:KDE的ECMAScript/JavaScript引擎,最初由Harri Porten开发,用于KDE项目的Konqueror网页浏览器中。

Narcissus:开放源代码,由Brendan Eich编写(他也参与编写了第一个SpiderMonkey)。

Tamarin:由Adobe Labs编写,Flash Player 9所使用的引擎。

Nitro(原名SquirrelFish):为Safari 4编写。

力的三要素

ceshicehciehi
3123123
力的三要素

力的作用点

力的大小

力的方向

力的三要素是力对物体的作用效果取决于力的大小、方向与作用点。 

学一门技艺的同理

投入技艺课程时间的多少、学习的课程是一门还是两门的作用点、学习课程的方向是否正确

 

wordpress 修改数据库密码后 找不到后台登录密码时

修改数据库密码后,wordpress网站打不开

当你觉得数据库密码不够安全,想更改,可以在你的空间提供商网站的个人中心的数据库管理里面去修改。不过,当你修改了网站数据库的密码后,会导致网站打不开,提示“数据库连接错误”。如何在修改数据库密码后,不影响网站的正常访问呢?
这里我用自己的wordpress建好的前端开发站做了一次实验,当修改数据库密码后,对网站后台程序不做任何修改的话,访问网站会提示“数据库连接错误”。这是由于网站搭建之初就为网站程序设置了一个连接数据库的密码,所以在你修改了网站数据库密码后,还需要对网站程序重新给定数据库的新密码。
WordPress网站后台数据库修改密码后,网站打不开,提示“数据库连接错误”时,做如下修改:找到wordpress的wp-config.php文件,用notepad++打开,修改数据库密码为你空间数据库的最新密码。
// ** MySQL 设置 – 具体信息来自您正在使用的主机 ** //
/** WordPress 数据库的名称 */
define(‘DB_NAME’, ‘空间数据库名称’);/** MySQL 数据库用户名 */
define(‘DB_USER’, ‘空间数据库帐户’);

/** MySQL 数据库密码 */
define(‘DB_PASSWORD’, ‘空间数据库最新密码’);

/** MySQL 主机 */
define(‘DB_HOST’, ‘空间数据库连接地址’);

/** 创建数据表时默认的文字编码 */
define(‘DB_CHARSET’, ‘utf8’);

/** 数据库整理类型。如不确定请勿更改 */
define(‘DB_COLLATE’, ”);
将修改好的wp-config.php文件重新上传覆盖原来的文件,然后重新访问站点就可以了。
如果是其他后台cms搭建的网站在修改数据库密码后网站无法访问,这里你可以留言一下,我将根据具体的后台cms给您回复。

 
 
 

WordPress忘记密码找回登录密码的四种行之有效的方法

 

WordPress忘记密码找回登录密码的四种行之有效的方法

PS:20170214更新,感谢SuperDoge同学提供的方法,登入phpMyAdmin后,先从左边选自己的数据库,然后点上面的 SQL 标签页,执行下面命令:

1
UPDATE `wp_users` SET `user_pass`='$P$BWZhQxx/R9UCBgECUhxsV0EKfqfEh31' WHERE `user_login`='freehao123'

然后使用用户名:freehao123,密码:admin 登入。注意如果你的用户名是其它的,请在上面的命令中替换,登录时使用这个用户名登录。

一、最简单的找回Wordpress密码:后台用邮件直接找回

1、忘记了Wordpress登录密码,直接使用Wordpress登录后台的“找回密码”,输入你的管理员邮箱,就会收到重置密码的邮件了,点击重置链接,设置新的密码即可。

Wordpress忘记密码后台直接找回

2、不过,使用后台直接找回密码有两个前提:一是你当初安装Wordpress时填写的是自己的邮箱,二是你的主机可以发送重置密码的邮件,二者缺一,则会导致找回密码失败。

二、最直接的重置Wordpress密码:PhpMyAdmin修改MD5

1、进入到主机的PhpMyAdmin管理界面,这是老版本的Godaddy空间管理SQL数据库的地方。

Wordpress忘记密码进入SQL地址

2、注意现在新购买的Godaddy主机都是采用Cpanel面板了,数据库中有PhpMyAdmin管理链接。

Wordpress忘记密码查看Cpanel地址

3、进入到PhpMyAdmin后,点击wp_users这个表。

Wordpress忘记密码找到表

4、再点击修改用户参数。(注意:user_login是登录名,默认的是admin,如果你这之前改过用户名,则显示的是其它的)。

Wordpress忘记密码编辑参数

5、在这里将user_pass值改成:5d41402abc4b2a76b9719d911017c592,执行,保存。

Wordpress忘记密码执行保存

6、完成后,你就可以使用密码:hello 来登录你的Wordpress了,登录到Wordpress后台后要记得马上修改密码。

Wordpress忘记密码使用新的登录

三、最快捷的修改Wordpress密码:执行SQL命令

1、进入到PhpMyAdmin的SQL执行命令页面,执行以下命令:


1
update wp_users set user_pass=md5("123456") where user_login='admin';

2、123456是你的Wordpress新密码,admin是管理员账号。执行完了命令后,你就可以用新的密码来登录Wordpress了。

Wordpress忘记密码执行SQL命令

四、最方便的设置Wordpress新密码:用PHP文件重置密码

PS:2014年3月7日更新,感谢 arefly.com 博主提供了新的重置Wordpress密码的PHP文件:WordPress恢复密码PHP文件下载地址。将此文件上传到你的网站根目录,然后输入所有关于你站点的MYSQL信息和需要更改的WordPress帐号及密码,点击“重新设定密码”就行了。该PHP工具在使用后会尝试自动删除,但是如果删除失败,记得自己删除这个文件来确保网站的安全。

新的重置Wordpress密码的PHP文件

1、如果你没有权限进入数据库管理系统,或者不想去那么麻烦地使用PhpMyAdmin,则可以试试用PHP文件重置Wordpress密码的方法。

2、将以下代码复制,保存为wppw.php文件。(代码来自:https://www.yiduqiang.com/wordpress-password-changes.html


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
/*你的数据库服务器地址,一般保持默认*/
$servername = "localhost:3306";
/*数据库用户名*/
$phpMyadminUser = "root";
/*数据库密码*/
$phpMyadminKey = "yiduqiang";
/*数据库名称*/
$phpMyadminName = "test";
/*wordpress数据表格前缀*/
$QZ = "wp_";
/*你要设置的wordpress新密码*/
$NewKey = "yiduqiang";
/*你要设置新密码的用户名*/
$wordpress_User = "yiduqiang";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>wordpress密码找回工具</title>
</head>
<body>
<?php
error_reporting(0);
if(!mysql_connect($servername,$phpMyadminUser,$phpMyadminKey))
{
    echo "对不起,数据库链接出错。<br />";
}
else
{
    echo "数据库链接成功。<br />";
    mysql_select_db($phpMyadminName,mysql_connect($servername,$phpMyadminUser,$phpMyadminKey));
    if (!mysql_query("update ".$QZ."users set user_pass='".md5($NewKey)."' where user_login='".$wordpress_User."'"))
    {
        echo "对不起,修改密码失败。";
    }
    else
    {
        echo "修改密码成功。";
    }
}
?>
</body>
</html>

3、或者直接下载我已经保存好的wppw.php文件:WordPress重置密码PHP文件。打开wppw.php文件,将数据库用户名、密码、名称等改成你的,还有WP的新密码。

Wordpress忘记密码修改连接数据库

4、特别注意:有些主机的数据库Host地址可能不是默认的Localhost,例如Godaddy的主机就是一连串的URL地址。

Wordpress忘记密码注意数据库主机

4、将wppw.php文件用FTP的方式上传到你的网站的根目录下。

Wordpress忘记密码上传到根目录

5、然后打开:https://域名/wppw.php,页面会提示你密码修改成功。如果有提示你数据库连接错误,请返回仔细检查wppw.php中的数据库部分信息有没有错误。

Wordpress忘记密码修改成功

五、Wordpress找回密码方法小结

1、使用Wordpress自带的找回密码功能是最简单最方便的,如果主机不支持php mail()函数,可以使用SMTP来代替,方法:WordPress评论回复邮件通知

2、Wordpress上传重置密码的PHP文件在使用完了之后要记得删除,以免出现安全隐患。在使用PhpMyAdmin执行SQL命令前要记得备份数据,以免失败导致数据丢失。

 

vue elementUI项目中遇到的问题整理ing

1、本地json数据调用

①思路:有直接调用路径的方式

②思路:可以在export JS文件中建立变量,然后在VUE页面文件中export。之后设置为变量值。

例如新建一个表单里面的,国家货币,数据选项调用本地json货币数据

expor JS文件中 定义数组

vue页面中,先导入,再引用变量
<el-select v-model=”form.currency” filterable placeholder=”货币类型” class=”inputW”>
<el-option v-for=”money in moneys” :key=”money” :label=”money.label” :value=”money.value“>
</el-option>
</el-select>

moneys:数据池

money.label:选项展示数据

money.value:传入后台数据

2、select for循环option,报错“Avoid using non-primitive value as key, use string/number value instead.”

<el-select v-model=”form.Name” filterable placeholder=”供应商销售层”>
<el-option v-for=”carrier in carriers” :key=”carrier.id” :label=”carrier.name” :value=”carrier.id”>
</el-option>
</el-select>

key:设置时候,选择value内值

3、[Vue warn]: Invalid prop: custom validator check failed for prop “name”. 
(found in component <icon> at /var/www/html/vueApp/node_modules/vue-awesome/components/Icon.vue)

查询是否有icon名字写错!

好用的数据接口模拟工具easymock和好用的数据接口测试工具postman

数据接口之福音,现在才发现,扶额……

easymock可以模拟接口数据,就不用受限制于后台接口程序员啦(适合前端开发快速,接口还没完善)

http://easy-mock.com/

postman可以看真实的接口返回数据,和应该接收前端数据,就可以看看接口是否返回正确。(适合后台程序员检测接口返回值,接收值)

详细介绍和教程

http://www.bayescafe.com/tools/use-postman-to-test-api-automatically.html

点击弹出li的索引值

有个面试题,是点击一个li,弹出此li的索引值

  • content content 1
  • content content 2
  • content content 3
  • content content 4
  • content content 5
1
// *用闭包解决索引值,变量,穿透作用域链*

var oUl = document.getElementById(“oList”);
var oLi = oUl.getElementsByTagName(“li”);
alert(oLi.length);
for(var i = 0;i <oLi.length;i++){
(function(){
var n = i;
oLi[i].onclick = function(){
alert(n+1);
}
})(i)
}
// 利用事件绑定,给ul绑定进行捕获。
// 浏览器的事件模型分为三个阶段 1、捕获阶段 2、目标阶段 3、冒泡阶段
var oUl = document.getElementById(“oList”);
oUl.onclick = function(event){
var tg = event.target;
var oLi = oUl.getElementsByTagName(“li”);
for(var i = 0;i<oLi.length;i++){
if(oLi[i]===tg){
alert(i+1);
}
}
}

js获取不到div.style.left,解决方案

element.style.left 只能获得element的行内样式,一般写在style或css文件内的left就无法获得。

解决方案,通过字符串截取和隐式转换

var oBox=$(“box”);
document.onkeydown=function(evt){
var e = evt||window.event;
var addNum = 10;
var _left = strToNum(oBox.style.left);
var _top = strToNum(oBox.style.top);
if(e.keyCode==37){
oBox.style.left=(_left-addNum)+”px”
}
if(e.keyCode==38){
oBox.style.top=(_top-addNum)+”px”;
}
if(e.keyCode==39){
oBox.style.left=(_left+addNum)+”px”;
}
if(e.keyCode==40){
oBox.style.top=(_top+addNum)+”px”;
}
}
}
function $(id){
return document.getElementById(id);
}
function strToNum(str){
var index = str.indexOf(“px”);
return str.substring(0,index)-0;

}