- 從基礎知識JS-web-API
- js基礎知識:ECMA 262標准
- js-web-API: w3c標准
- W3c標准中關於js的規定有
- DOM操作、BOM操作、事件綁定、ajax請求(包括http協議)、存儲
- 常說的js(瀏覽器執行的js)包含兩部分:
- 1、js基礎知識(ECMA262標准)
- 2、JS-Web-API(w3c標准)
一、DOM操作
- 知識點:DOM本質、DOM節點操作、DOM結構操作
1、DOM本質 樹
- DOM就是Document+Object+Model(文檔對象模型)。
2、DOM節點操作
- DOM可以理解為:瀏覽器把拿到的HTML代碼,結構化為一個瀏覽器可識別並且js可操作的一個模型而已。
(1)、獲取DOM節點
var div1 = document.getElementById('div1');//元素
var divList = document.getElementsByTagName('div');//集合
console.log(divList.length);
console.log(divList[0]);
var containerList = document.getElementsByClassName('.container');
var pList = document.querySelectorAll('p');//集合
(2)、property 屬性
var pList = document.querySelectorAll('p');
var p = pList[0];
console.log(p.style.width);//獲取樣式
p.style.width = '100px';//修改樣式
console.log(p.className);//獲取class
p.className = 'p1';//修改class
//獲取nodeName和nodeType
console.log(p.nodeName);
console.log(p.nodeType)
(3)、Attribute 屬性
var pList = document.querySelectorAll('p');
var p = pList[0];
p.getAttribute('date-name');
p.setAttribute('date-name','imooc');
p.getAttribute('style');
p.setAttribute('style','font-size:30px')
3、DOM結構操作
- 新增節點、獲取父元素、獲取子元素、刪除節點
(1)、新增節點
var div1 = document.getELementById('div1');
//添加新節點
var p1 = document.createElement('p');
p1.innerHTML = 'this is p1';
div1.appendChild(p1);//添加新創建的元素
//移除已有節點
var p2 = document.getElementById('p2');
div1.appendChild(p2);
(2)、獲取父元素和子元素
var div1 = document.getELementById('div1');
var parent = div1.parentElement;//父元素
var child = div1.childNodes;//子元素
div1.removeChild(child[0]);//刪除節點
解題
1、DOM是哪種基本的數據結構
- 樹
2、DOM操作的常用API有哪些
- 獲取DOM節點、以及節點的property和attribute;
- 獲取父元素,獲取子元素
- 新增節點,刪除子元素
3、DOM節點的Attribute和property有何區別
- property只是一個js對象的屬性的修改
- Attribute是對html標簽屬性的修改
二、BOM
- Brower object model 瀏覽器對象模型
- 知識點
- navigator(瀏覽器)、screen(屏幕)、location(地址)、history(歷史)
(1)、navigator & screen
//navigator
var ua = navigator.userAgent;
var isChrome = ua.indexOf('chrome');
console.log(isChrome)
//screen
console.log(screen.width);
console.log(screen.height);
(2)、location & historylocation.href //地址
location.protocal //'http' 'https'
location.host //集合
location.pathname //'/learn/199'路徑
location.search //?參數
location.hash //#
//history
history.back()
history.forward()
解題
-
如何檢測瀏覽器的類型
var ua = navigator.userAgent; var isChrome = ua.indexOf('chrome'); console.log(isChrome)
三、事件綁定
- 知識點:通用事件綁定;事件冒泡;代理
1、通過事件綁定
var btn = document.getElementById('btn1');
btn.addEventListener('click',function(event){
console.log('clicked');
})
function bindEvent(elem,type,fn){
elem.addEventListener(type,fn);
}
var a = document.getElementById('link1');
bindEvent(a,'click',function(e){
e.preventDefault();//阻止默認行為
alert('clicked');
})
關於IE低版本的兼容性
- IE低版本使用attachEvent綁定事件,和w3c標准不一樣
2、事件冒泡
<div id="div1">
<p id="p1">激活</p>
<p id="p2">激活</p>
<p id="p3">激活</p>
<p id="p4">激活</p>
</div>
<div id="div2">
<p id="p5">取消</p>
<p id="p6">取消</p>
</div>
var p1 = document.getElementById('p1');
var body = document.body;
function bindEvent(elem,type,fn){
elem.addEventListener(type,fn);
}
bindEvent(p1,'click',function(e){
e.stopPropagation()//阻止冒泡
alert('激活');
})
bindEvent(body,'click',function(e){
alert('取消')
})
3、代理
<div id="div1">
<a href="#">a1</a>
<a href="#">a2</a>
<!-- 會隨時新增更多a標簽 -->
</div>
<script>
var div1 = document.getElementById('div1');
div1.addEventListener('click',function(e){
var target = e.target;
if(target.nodeName === 'A'){
alert(target.innerHTML)
}
})
</script>
完善通用綁定事件的函數
<div id="div1">
<a href="#">a1</a>
<a href="#">a2</a>
<!-- 會隨時新增更多a標簽 -->
</div>
<script>
function bindEvent(elem,type,selector,fn){
if(fn == null){
fn = selector;
selector = null;
}
elem.addEventListener(type,function(e){
var target;
if(selector){
target = e.target;
if(target.matches(selector)){
fn.call(target,e)
}
}else {
fn(e);
}
})
}
//使用代理
var div1 = document.getElementById('div1');
bindEvent(div1,'click','a',function(e){
e.preventDefault();
console.log(this.innerHTML)
})
</script>
解題
簡述事件冒泡流程
- DOM樹形結構->事件冒泡 --> 阻止冒泡 --> 冒泡的應用
四、ajax
- 知識點:XMLHttpRequest、狀態碼說明、跨域
1、XMLHttpRequest
var xhr = XMLHttpRequest;
xhr.open('GET','api',false);
xhr.onreadystatechange = function(){
//這里的函數異步執行,可參考之前js基礎的異步模塊
if(xhr.readyState == 4){
if(xhr.status == 200){
alert(xhr.responseText)
}
}
}
xhr.send(null);
//IE兼容問題;
//IE低版本使用ActiveXObject和w3c標准不一樣
2、readyState 狀態碼說明
- 0---(未初始化)還沒有調用send()方法
- 1--- (載入)已調用send方法,正在發送請求
- 2---(載入完成)send()方法執行完成,已經接收到全部響應內容
- 3---(交互)正在解析內容
- 4---(完成)響應內容解析完成,可以在客戶端調用了
3、status狀態碼說明
- 2xx --- 表示成功處理請求,如200;
- 3xx --- 需要重定向,瀏覽器直接跳轉;
- 4xx --- 客戶端請求錯誤,如404
- 5xx --- 服務端錯誤
4、跨域
- 什么是跨域、JSONP、服務器端設置http header
(1)、什么是跨域?
- 瀏覽器有同源策略,不允許ajax訪問其他域接口
- http://www.yourname.com:80/page1.html
- http端口80 https端口默認443
- 跨域條件:協議、域名、端口有一個不同就算跨域
(2)、可以跨域的三個標簽
- 有三個標簽允許跨域加載資源
<img src="xxx" />
<link href="xxx" />
<script src="xxx" />
(3)、三個標簽的場景
<img>
用於打點統計,統計網站可能是其他域<link>``<script>
可以使用CND、CND的也是其他域<script>
可以用JSONP
(4)、跨域注意事項
- 所有的跨域請求都必須經過信息提供方允許,如果未經允許即可獲取,那是瀏覽器同源策略出現漏洞
(5)、JSONP實現原理
-
加載http://www.baidu.com/classindex.html
-
不一定服務器端有一個classindex.html文件
-
服務器可以根據請求,動態生成一個文件返回
-
同理於
<script src="http:www.baidu.com/api.js">
<script> window.callback = function(data){ //這里我們跨域得到信息 console.log(data) } </script>
(6)、服務器端設置http header
- 另外一個解決跨域的簡潔方法,需要服務端來做,但是作為交互方,我們必須知道這個方法,是將解決跨域問題的一個趨勢。
五、存儲
- 知識點:cookie、locationStorage 和sessionStorage
1、cookie
- 本身用於客戶端和服務端通信
- 但是它有本地存儲的功能,於是就被“借用”;
- 使用document.cookie = ... 獲取和修改即可
(1)、cookie用於存儲的缺點
- 存儲量太小,只有4kb
- 所有http請求都帶着,會影響獲取資源的效率
- API簡單,需要封裝才能用document.cookie = ...
(2)、locationStorage和sessionStorage
- HTML5專門為存儲而設計,最大容量5M(兆)
- API簡單易用
- localStorage.setItem(key,value)
- localStorage.getItem(key,value)
- ios safar隱藏模式下 localStorage.getItem會報錯