window.onload 和 document.onDOMContentLoaded 有什么区别?
//页面所有资源加载完成
window.onload = function(){
console.log('window loaded')
}
//DOM结构解析完成
document.addEventListenner("DOMContentLoaded",function(){
console.log("DOMContentLoaded")
})
如何获取图片真实的宽高
document.addEventListener('DOMContentLoaded', function(){
console.log('DOMContentLoaded ')
})
console.log($('img').width) //0
$('img').onload = function(){ //图片请求到了,触发事件
console.log(this.width) //此时才能得到图片的真实大小
}
如何获取元素的真实宽高
window.getComputedStyle(node).height/width返回的是相应的宽高,单位为像素.
URL 如何编码解码?为什么要编码?
- JavaScript提供四个URL的编码/解码方法。
decodeURI()
decodeURIComponent()
encodeURI()
encodeURIComponent()
encodeURI方法不会对下列字符编码
1. ASCII字母
2. 数字
3. ~!@#$&*()=:/,;?+'
encodeURIComponent方法不会对下列字符编码
1. ASCII字母
2. 数字
3. ~!*()'
为什么编码?
- 为什么需要Url编码,通常如果一样东西需要编码,说明这样东西并不适合传输。原因多种多样,如
Size过大,包含隐私数据
,对于Url来说,之所 以要进行编码,是因为Url中有些字符会引起歧义
- Url参数字符串中使用
key=value
键值对这样的形式来传参,键值对之间以&符号
分隔,如/s?q=abc&ie=utf- 8
。如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义, 也就是对其进行编码 - Url的编码格式采用的是
ASCII码
,而不是Unicode,这也就是说你不能在Url中包含任何非ASCII字符,例如中文。否则如果客户端浏 览器和服务端浏览器支持的字符集不同的情况下,中文可能会造成问题
。
补全如下函数,判断用户的浏览器类型
function isAndroid(){
}
funcnction isIphone(){
}
function isIpad(){
}
function isIOS(){
}
function isAndroid(){
return /Android/.test(navigator.userAgent);
}
funcnction isIphone(){
return /iPhone/.test(navigator.userAgent);
}
function isIpad(){
return /iPad/.test(navigator.userAgent);
}
function isIOS(){
return /(iPad)|(iPhone)/i.test(navigator.userAgent);
}
cookie & session &localStorage 分别是什么
看到cookie,是不是想到了饼干,哈哈,今天我们要说的可不是饼干,今天我们要说的是浏览器的cookie
什么是cookie呢?
- cookie是存储在浏览器上的一小段数据,用来记录某些当页面关闭或者刷新后仍然需要记录的信息。在控制台用 「document.cookie」查看你当前正在浏览的网站的cookie。
如何设置?
- 服务器端
- 可以通过在http返回里面设置
Set-cookie
值告诉浏览器
- 可以通过在http返回里面设置
- 浏览器端
- 打开浏览器调试器,选到
Application
,找到cookie
选项
- 打开浏览器调试器,选到
cookie属性
属性名 | 默认值 | 作用 |
---|---|---|
Name(必填) |
名 | |
Value(必填) |
值 | |
Domain | 当前文档域 | 作用域 |
Path | 当前文档路径 | 作用路径 |
Expires/Max-age | 浏览器会话时间 | 失效时间 |
secure | false | htttps协议时生效 |
作用域
作用路径
Cookie -> javascript对象
//转化为js对象
function getcookie () {
var cookie = {};
var all = document.cookie;
if (all === '')
return cookie;
var list = all.split('; ');
for (var i = 0; i < list.length; i++) {
var item = list[i];
var p = item.indexOf('=');
var name = item.substring(0, p);
name = decodeURIComponent(name);
var value = item.substring(p + 1);
value = decodeURIComponent(value);
cookie[name] = value;
}
return cookie;
}
cookie的设置/修改
//设置
document.cookie = "name = value"
//修改
function setCookie (name, value, expires, path, domain, secure) {
var cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value);
if (expires)
cookie += '; expires=' + expires.toGMTString();
if (path)
cookie += '; path=' + path;
if (domain)
cookie += '; domain=' + domain;
if (secure)
cookie += '; secure=' + secure;
document.cookie = cookie;
}
删除cookie
function removeCookie (name, path, domain) {
document.cookie = name + '='
+ '; path=' + path
+ '; domain=' + domain
+ '; max-age=0';
}
缺陷
- 流量代价
- 安全性问题
- 大小限制
Storage
local Storage
session Storage
因为cookie有这么一些缺陷,所以HTML5提供了storage存储替代方案
localStorage
- 用于将大量数据(最大5M)保存在浏览器中,保存后
数据永远存在不会失效过期
,除非用 js手动清除。 - 不参与网络传输。
- 一般用于性能优化,可以保存图片、js、css、html 模板、大量数据。
可以理解js对象
- 读取
localStorage.name
- 添加/修改
localStorage.name = 'value'(string)
- 删除
delete localStorage.name
API
- 获取键值对数量
localStorage.length
- 读取
localStorage.getItem("name"),localStorage.key(i)
- 添加/修改
localStorage.setItem("name","value")
- 删除对应键值
localStorage.removeItem("name")
- 删除所有数据
localStorage.clear()
session
当一个用户打开淘宝登录后,刷新浏览器仍然展示登录状态。服务器如何分辨这次发起请求的用户是刚才登录过的用户呢?这里就使用了session保存状态。用户在输入用户名密码提交给服务端,服务端验证通过后会创建一个session用于记录用户的相关信息,这个 session 可保存在服务器内存中,也可保存在数据库中。
- 创建session后,会把关联的session_id 通过setCookie 添加到http响应头部中。
- 浏览器在加载页面时发现响应头部有 set-cookie字段,就把这个cookie 种到浏览器指定域名下。
- 当下次刷新页面时,发送的请求会带上这条cookie, 服务端在接收到后根据这个session_id来识别用户。
cookie 是存储在浏览器里的一小段「数据」,而session是一种让服务器能识别某个用户的「机制」,session 在实现的过程中需要使用cookie。 二者不是同一维度的东西。
使用 localStorage封装一个 Storage 对象,达到如下效果
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
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]
}
}
}
})()