window.onload
和document.onDOMContentLoaded
有什么区别?
触发时机
- 当
onload
事件触发时,页面上所有的DOM,样式表,脚本,图片,flash都已经加载完成了。 - 当
DOMContentLoaded
事件触发时,仅当DOM加载完成,不包括样式表,图片,flash。
区分理由
开发中我们经常需要给一些元素的事件绑定处理函数。但问题是,如果那个元素还没有加载到页面上,但是绑定事件已经执行完了,是没有效果的。这两个事件大致就是用来避免这样一种情况,将绑定的函数放在这两个事件的回调中,保证能在页面的某些元素加载完毕之后再绑定事件的函数。
如何获取图片真实的宽高
<body>
![](http://upload-images.jianshu.io/upload_images/6663055-7b779e8c4ea4af64.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
<script>
document.querySelector('img').onload = function(){
console.log(this.width)
console.log(this.height)
}
// 利用`onload`事件的特点,当图片触发`onload`事件后,输出图片的宽高
</script>
</body>
// 输出结果
1913
803
如何获取元素的真实宽高
<head>
<meta charset="utf-8">
<title>JS Bin</title>
<style>
.box {
width: 500px;
height: 600px;
border: 2px solid black;
}
</style>
</head>
<body>
<div class="box">NinthG</div>
<script>
var realHeight = document.querySelector('.box').offsetHeight
var realWidth = document.querySelector('.box').offsetWidth
console.log(realHeight)
console.log(realWidth)
// 利用页面元素宽高的`element.offsetHeight`和`element.offsetWidth`方法
// 或可使用`window.getComputedStyle().width/height`,但是这个方法经测试,没有包含border的宽度
</script>
</body>
URL为什么要编码,如何编码解码?
为何需要编码
通常如果一样东西需要编码,说明这样东西并不适合传输。原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义。
- 例如,Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码。
- 又如,Url的编码格式采用的是ASCII码,而不是Unicode,这也就是说你不能在Url中包含任何非ASCII字符,例如中文。否则如果客户端浏览器和服务端浏览器支持的字符集不同的情况下,中文可能会造成问题。
- Url编码的原则:就是使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符。
如何编码解码
Url编码通常也被称为百分号编码(Url Encoding,also known as percent-encoding),是因为它的编码方式非常简单,使用%百分号加上两位的字符——0123456789ABCDEF——代表一个字节的十六进制形式。
- Url编码默认使用的字符集是US-ASCII。例如a在US-ASCII码中对应的字节是0x61,那么Url编码之后得到的就是%61,我们在地址栏上输入http://g.cn/search?q=%61%62%63,实际上就等同于在google上搜索abc了。又如@符号在ASCII字符集中对应的字节为0x40,经过Url编码之后得到的是%40。
- 对于非ASCII字符,需要使用ASCII字符集的超集进行编码得到相应的字节,然后对每个字节执行百分号编码。对于Unicode字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如"中文"使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过Url编码之后得到"%E4%B8%AD%E6%96%87"。
补全如下函数
判断用户的浏览器类型
function isAndroid(){
if(navigator.userAgent.indexof('Android') > 0) {
console.log('Android')
}
}
function isIphone(){
if(navigator.userAgent.indexof('Iphone') > 0) {
console.log('Iphone')
}
}
function isIpad(){
if(navigator.userAgent.indexof('Ipad') > 0) {
console.log('Ipad')
}
}
function isIOS(){
if(navigator.userAgent.indexof('IOS') > 0) {
console.log('IOS')
}
}
cookie & session & localStorage 分别是什么?
cookie
cookie是存储在浏览器上的一小段数据,用来记录某些当页面关闭或者刷新后仍然需要记录的信息。在控制台用 「document.cookie」查看你当前正在浏览的网站的cookie。
session
session是一种让服务器能识别某个用户的「机制」,session 在实现的过程中需要使用cookie。 二者不是同一维度的东西。
localStorage
- localStorage HTML5本地存储web storage特性的API之一,用于将大量数据(最大5M)保存在浏览器中,保存后数据永远存在不会失效过期,除非用 js手动清除。
- 不参与网络传输
- 一般用于性能优化,可以保存图片、js、css、html 模板、大量数据。
使用 localStorage封装一个 Storage 对象,达到如下效果
老师课件中提供的答案,能看懂,但是并不能自己写出来
var Storage = (function(){
return {
set: function(key, value, expireSeconds){
localStorage[key] = JSON.stringify({
value: value,
expired: expireSeconds===undefined?undefined:Date.now() + 1000*expireSeconds
})
},
get: function(key){
if(localStorage[key] === undefined){
return
}
var o = JSON.parse(localStorage[key])
if(o.expired === undefined || Date.now() < o.expired){
return o.value
}else{
delete localStorage[key]
}
}
}
})()
// 达到效果
Storage.set('name', '饥人谷')
Storage.set('age', 2, 30) ; //设置 name 字段存储的值为'饥人谷'
Storage.set('teachers', ['ruoyu', 'fangfang', 'tom'], 60)
Storage.get('name') // ‘饥人谷’
Storage.get('age') // 如果不超过30秒,返回数字类型的2;如果超过30秒,返回 undefined,并且 localStorage 里清除 age 字段
Storage.get('teachers') //如果不超过60秒,返回数组; 如果超过60秒,返回undefined
参考文章
DOMContentLoaded 与onload区别以及使用|cnblogs——hoboStage
URL编码与解码原理|csdn——零度anngle