常识
JavaScript的出现就是为了服务浏览器的运行。
主流浏览器的分类:
- IE 6-11:国内使用的最多的IE浏览器,对W3C标准支持差。IE10开始支持ES6。
- chrome:Google出品的基于Webkit内核浏览器,内置了非常强悍的JavaScript引擎——V8。最新版早就支持ES6了。
- Safari:Apple的Mac系统自带的基于Webkit内核的浏览器,从OS X10.7 lion自带的6.1版本开始支持ES6,目前最新的OS X 10.11EL caption自带的safari版本是9.X,早已支持ES6;
- Firefox:Mozilla自己研制的gecko内核和JavaScript引擎OdinMonkey。早期按版本发布,后面自更新。
- 移动设备上IOS和Android两大阵营分别主要使用Apple的safari和谷歌的chrome,两者都是WEBKIT核心,H5先在手机上全面普及,对JavaScript的标准支持很好,最新版本均支持ES6。
不同浏览器对JavaScript的支持有差异,主要体现在API的接口不一样,比如AJAX,FILE接口。不同浏览器对ES6标准特性支持也不一样。
在编写JavaScript的时候,要充分考虑到浏览器的差异,尽量让一份JavaScript代码能运行在不同的浏览器上。
浏览器对象
JavaScript可以获取浏览器提供的很多对象,并进行操作。
window
window对象不仅充当全局作用域,也可以表示浏览器窗口。
window对象具有innerWidth,innerHeight属性,可以获取浏览器的内部宽度和高度。内部宽高指的是出去菜单栏,工具栏,边框等占位元素后,显示网页的净高度。
outerWidth,outerHeight可以获取浏览器的整个宽高。
navigator
navigtor对象表示浏览器的信息,常用的属性包括:
- navigator.appName:浏览器名称;
- navigator.appVersion:浏览器版本;
- navigator.language:浏览器设置的语言;
- navigator.platform:操作系统类型
- navigator.userAgent:浏览器设定的User-Agent字符串
navigator的信息很容易被用户修改,因此通过IF语句判断浏览器版本来获取宽度信息很容易出错,且很难维护代码,此时应该利用JavaScript对于不存在的属性返回UNDEFINED的特点,使用短路运算符(或)来获取宽度信息。
var width=document.body.clientWidth||window.innerWidth;
screen
screen对象表示屏幕的信息,常用的属性有:
- screen.width:屏幕宽度,以像素为单位;
- screen.height:屏幕高度
- screen.colorDepth:返回颜色位数,如8,16,24.
location
location对象表示当前页面的URL信息。
一个完整的URL
http://www.example.com:8080/path/index.html?a=1&b=2#TOP
可以用location.href来获取URL各个部分的值。
location.protocol; // ‘http’
location.host; // ‘www.example.com’
location.port; // ‘8080’
location.pathname; // ‘/path/index.html’
location.search; // ‘?a=1&b=2’
location.hash; // ‘TOP’
加载新页面调用location.assign();重新加载页面调用location.reload()方法。
'use strict';
if(comfirm('重新加载该页面'+location.href+'?')){
location.reload();
}else{
location.assign('/');//设置一个新的URL地址;
}
document
document对象表示当前页面。由于HTML在浏览器中以DOM形式表示为树形结构,document对象是整个DOM树的根节点。document的title属性是从HTML文档中的
'use strict'
document.title='努力学习';
要查找DOM树的某个节点,需要从document对象开始查找。最常用的查找是根据ID和TagName。
准备HTML数据:
<dl id="drink-menu" style="border:solid 1px #ccc;padding:6px;">
<dt>摩卡</dt>
<dd>热摩卡咖啡</dd>
<dt>酸奶</dt>
<dd>北京老酸奶</dd>
<dt>果汁</dt>
<dd>鲜榨苹果汁</dd>
</dl>
用document对象提供的getElementById()和getElementsByTagName()可以按ID获得一个DOM节点和按Tag名称获得一组DOM节点:
var menu=document.getElementById('drink-menu');
var drinks=document.getElementsByTagName('dt');
var i,s;
s='提供的饮料有:';
for(i=0;i<drinks.length;i++){
s=s+drinks[i].innerHTML+',';
}
console.log(s);
document对象还有一个cookie属性,可以获取当前页面的cookie。
cookie是由服务器发送的key-value标识符。因为HTTP的协议是无状态的,但是服务器要区分到底哪个是用户发过来的请求,就可以用cookie来区分。当一个用户登录后,服务器发送一个cookie给浏览器,例如user=ABC123XYZ(加密后的字符串),此后,浏览器在访问该网站时,会在请求头上附上这个cookie,服务器会根据cookie即可区分出用户。
cookie还可以存储网站的一些设置,例如,页面显示的语言等等。
JavaScript可以通过document.cookie读取到当前页面的Cookie:
document.cookie;//'v=123;remember=true;prefer=zh'
由于在HTML页面中引入第三方的JavaScript代码是允许的,而JavaScript能读取到页面的cookie,用户的登录信息通常存在cookie中,这就造成了很大的安全隐患
<!--当前页面在www.example.com-->
<html>
<head>
<script src='http://www.foo.com/jquery.js'>
</script>
</head>
</html>
如果引入的第三方的JavaScript中存在恶意代码,则www.foo.com网站将直接获取到www.example.com网站的用户登录信息。
为解决这个问题,服务器在设置cookie时可以使用httpOnly,设置了httpOnly的cookie将不能被JavaScript读取,这个行为由浏览器实现,主流浏览器均支持httpOnly选项,IE从IE6 SP1开始支持。
为了确保安全,服务器端在设置cookie时,应该始终坚持使用httpOnly。
history
history对象保存了浏览器的历史记录,JavaScript可以调用history对象的back()或forward(),相当于用户点击了浏览器的后退或前进按钮。
这个对象是历史遗留对象,对于现代web页面来说,由于大量的使用AJAX和页面交互,简单粗暴的调用history.back()可能让用户体验感不好;新手在设计web页面时喜欢在登录页面登陆成功的时候使用history.back(),试图回到登陆前的页面,这个做法很不好。尽量不要使用history对象。