js API


  • 從基礎知識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會報錯


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM