js分三個部分:
ECMAScript標準:js的基本語法
DOM:Ducument Object Model--->文檔對象模型--->操做頁面的元素
BOM:Browser Object Model--->瀏覽器對象---->操做瀏覽器javascript
1,什麼是api-----能夠理解爲一套方法(或者工具)
2,什麼是webapi-----那就是網絡提供的方法(或者工具)html
1,根據標籤名獲取元素java
document.getElementsByTagName('div'); // 可以獲取全部div標籤node
能夠經過已找到的元素來調用web
2,根據標籤的class屬性獲取元素api
document.getElementsByClassName('nav'); // 可以獲取全部class="nav"的元素數組
能夠經過已找到的元素來調用瀏覽器
在IE9之後的版本才支持!網絡
3,根據標籤的name屬性獲取元素app
document.getElementsByName('mv'); // 能獲取全部name="mv"的元素
在不一樣瀏覽器工做的方式不一樣,在IE和Opera瀏覽器下這個方法
將返回具備id屬性和name屬性是這個值的!
4,根據標籤的id屬性獲取元素
document.getElementById('btn'); // 只能獲取第一個id="btn"的元素
只能經過document來調用!
5,根據選擇器來查找元素:
document.querySelector('ul li'); // 只能獲取第一個元素
document.querySelectorAll('ul li'); // 能夠獲取ul下的全部li元素
有瀏覽器兼容性問題,在IE8之後的版本纔會執行。移動端開發能夠直接使用,不用擔憂兼容性問題
事件:就是當何時作什麼事情
觸發~響應
1,先獲取元素
2,給元素註冊事件
事件名稱
事件源
事件處理函數
實例:點擊按鈕後彈出窗口
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>測試</title> </head> <body> <input type="button" value="點我" id="btn"> <script> // 先獲取元素 var btn = document.getElementById('btn'); // 註冊事件 btn.onclick = function () { alert('點到我了'); } </script> </body> </html>
例子1:點擊按鈕切換圖片
<!DOCTYPE> <html lang="en"> <head> <meta charset="UTF-8"> <title>測試</title> </head> <input type="button" value="點我" id="btn"> <br /> <img src="images/a.jpg" id="mv" /> <script> // 獲取元素 var btn = document.getElementById('btn'); var mv = document.getElementById('mv'); // 標誌位,保證兩種照片能夠來回切換 var flag = true; // 註冊事件 btn.onclick = function () { if (flag) { mv.src = 'images/b.jpg'; flag = false; } else { mv.src = 'images/a.jpg'; flag = true; } } </script> </html>
表單元素:能夠和用戶進行交互 如 input button
非表單的屬性: href, title, alt, id, src, className
而這些屬性都是能夠修改的
實例:
<!DOCTYPE> <html lang="en"> <head> <meta charset="UTF-8"> <title>測試</title> </head> <a href="http://www.baidu.com" id="link">百度</a> <script> var link = document.getElementById('link'); // 修改連接 link.href = 'http://www.jd.com'; </script> </html>
例子:點擊按鈕div顯示或隱藏
<!DOCTYPE> <html lang="en"> <head> <meta charset="UTF-8"> <title>測試</title> <style> * { margin: 0; padding: 0; } #box { width: 200px; height: 200px; background-color: pink; } .show { display: block; } .hidden { display :none; } </style> </head> <input type="button" value="隱藏" id="btn"> <br /> <div class="show" id="box"></div> <script> // 獲取元素 var btn = document.getElementById('btn'); // 標誌位,控制來回切換 var isShow = true; // 註冊事件 btn.onclick = function () { // 獲取元素 var box = document.getElementById('box'); // div是否顯示 if (isShow) { // 修改元素的類名 // className爲何DOM對象的對應標籤的class屬性的名字叫作className, // 由於class在javascript中是關鍵字,關鍵字不能夠做爲變量或者屬性的名字。 box.className = 'hidden'; // 修改按鍵的屬性。 // this的幾種狀況: // 1,在函數內----指向window // 2,在構造函數中----指向的是構造函數建立的對象 // 3,在方法中----指向的是這個方法所屬的對象 // 4,在事件處理函數中----誰調用該事件,this就指向誰 this.value = '顯示'; isShow = false; } else { box.className = 'show'; this.value = '隱藏'; isShow = true; } } </script> </html>
取消a標籤的默認行爲:不會跳轉到href指定的頁面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <a href="http://www.baidu.com" id="link">百度</a> <script> // 獲取元素 var link = document.getElementById('link'); // 註冊事件 link.onclick = function () { alert('hello world'); // 重要的一步:取消a標籤的默認行爲 return false; } </script> </body> </html>
job:相冊(來回切換照片)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> /** { padding: 0; margin: 0; }*/ /* 清除浮動*/ .clearfix:after { content: 0; display: block; height: 0; visibility: hidden; clear: both; } .clearfix { *zoom: 1; } /*a標籤*/ #imagegallery a { display: inline-block; margin: 0 20px 20px 0; padding: 0; text-decoration: none; } #imagegallery a img { border: 0; } </style> </head> <body> <h2> 美女畫廊 </h2> <div id="imagegallery" class="clearfix"> <a href="images/1.jpg" title="美女A"> <img src="images/1-small.jpg" width="100px" alt="美女1"> </a> <a href="images/2.jpg" title="美女B"> <img src="images/2-small.jpg" width="100px" alt="美女2"> </a> <a href="images/3.jpg" title="美女C"> <img src="images/3-small.jpg" width="100px" alt="美女3"> </a> <a href="images/4.jpg" title="美女D"> <img src="images/4-small.jpg" width="100px" alt="美女4"> </a> </div> <img id="image" src="images/placeholder.png" width="450px" /> <p id="des">請選擇一張照片</p> <script> // 獲取全部的a元素 var imagegallery = document.getElementById('imagegallery'); var links = imagegallery.getElementsByTagName('a'); // 給全部的a元素添加事件 for (var i = 0; i < links.length; i++) { // 全部的a標籤對應的元素 var link = links[i]; link.onclick = function () { // 獲取佔位圖 var image = document.getElementById('image'); // 切換圖片 image.src = this.href; // 獲取p元素 var des = document.getElementById('des'); // 設置p標籤的內容 des.innerText = this.title; //取消a標籤的默認行爲 return false; } } </script> </body> </html>
打印對象:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="box"> hello world <span>Hi</span> </div> <script> // 獲取元素 var box = document.getElementById('box'); // 打印這個對象 console.dir(box); // div#box // 獲取內部文本 console.log(box.innerText); // hello world Hi // 獲取內部文本和標籤(有標籤時) console.log(box.innerHTML); // </script> </body> </html>
innerHTML:獲取內部文本和標籤(若是有標籤)
innerText / textContent:獲取內部文本(不包含標籤),有瀏覽器兼容問題
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="box">hello</div> <script> // innerText的瀏覽器兼容處理 function getInnerText(element) { // 判斷是否有innerText屬性 if (typeof element.innerText === 'string') { // 瀏覽器支持innerText則使用 return element.innerText; } else { // 瀏覽器不支持innerText,則使用textContent return element.textContent; } } // 獲取元素 var box = document.getElementById('box'); // 傳入函數 alert(getInnerText(box)) </script> </body> </html>
設置內容時該什麼方法:
innerText / textContent // 內容不帶標籤
innerHTML // 內容帶標籤
當設置不含標籤的內容時候,應該使用innerText,它的效率高!
value // 用於大部分表單元素的內容獲取(option 除外)
type // 能夠獲取input標籤的類型(輸入框或複選框等)
checkeed // 複選框選中屬性。(返回的值是布爾類型)
selected // 下拉菜單選中屬性。(返回的值是布爾類型)
文本域的相關屬性設置:
disabled // 禁用屬性。讓用戶沒法輸入內容。(返回的值是布爾類型)
readOnly // 只讀不能修改
.value // 能夠修改文本域裏面的內容---建議使用這種
.innerText // 能夠修改文本域裏面的內容
job:點擊按鈕禁用文本框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <input type="button" value="點我" id="btn"> <input type="button" value="寫入內容" id="btn1"> <br /> <input type="text" id="text" value="123"> <script> // 獲取元素 var btn = document.getElementById('btn'); // 註冊事件 btn.onclick = function () { var text = document.getElementById('text'); // 禁止屬性。只是讓用戶沒法輸入。但仍是能夠經過代碼寫入內容 text.disabled = true; } // 獲取元素 var btn1 = document.getElementById('btn1'); // 註冊事件 btn1.onclick = function () { // 獲取元素 var text = document.getElementById('text'); // 寫入內容。 text.value = 'hello world'; } </script> </body> </html>
job:給文本框賦值,獲取文本框的值---兩種實現方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> input { display: block; margin: 10px 10px; } </style> </head> <body> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="button" value="獲取文本框的值" id="btn"> <script> // 給文本框賦值,獲取文本框的值 // 1,先給文本框賦值 // // 獲取全部input元素 var inputs = document.getElementsByTagName('input'); // 拿到每個input元素 for (var i = 0; i < inputs.length; i++) { var input = inputs[i]; // 判斷是否是文本框 if (input.type === 'text') { input.value = i; } } // 2,獲取文本框的值 // // 獲取btn元素 var btn = document.getElementById('btn'); // 註冊事件 btn.onclick = function () { // 存儲所有文本框的值 var array = []; // 獲取全部文本框的值 for (var i = 0; i < inputs.length; i++) { // 判斷是否是文本框 var input = inputs[i]; if (input.type === 'text') { array.push(input.value); } } // 拼接成0|1|2|3|4|5|6|7|8|9 var s = array.join('|'); console.log(s); } </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> input { display: block; margin: 10px 0; } </style> </head> <body> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="text" name="" id=""> <input type="button" value="獲取全部屬性的值" id="btn"> <script> // 1,給全部文本框賦值 // // 獲取全部input元素 var inputs = document.getElementsByTagName('input'); // 遍歷全部input元素 for (var i = 0; i < inputs.length; i++) { var input = inputs[i]; // 判斷是否是文本框 if (input.type === 'text') { // 給文本框賦值 input.value = i; } } // 2,獲取全部文本框中的值,並拼接 // 獲取按鈕元素 var btn = document.getElementById('btn'); // 註冊事件 btn.onclick = function () { // 存儲全部文本框的值 var str = ''; // 遍歷全部input元素 for (var i = 0; i < inputs.length; i++) { var input = inputs[i]; // 判斷是否是文本框 if (input.type === 'text') { // 拼接字符串 str += input.value + '|'; } } var s = str.substr(0, str.length - 1); console.log(s); } </script> </body> </html>
自定義屬性 :
setAttribute('屬性名', '值') // 設置自定義屬性
getAttribute('屬性名') // 獲取自定義屬性的值
removeAttribute('屬性名') // 移除自定義屬性或者自帶屬性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div>111111</div> <div>222222</div> <div>333333</div> <div>444444</div> <div>555555</div> <input type="button" value="移除自定義屬性" id="btn"/> <script> var Objs = document.getElementsByTagName('div'); // 遍歷 for (var i = 0; i < Objs.length; i++) { // 設置自定義屬性和值 Objs[i].setAttribute('num', (i + 1)); // 根據標籤名獲取元素,爲元素註冊點擊事件,添加事件處理函數 Objs[i].onclick = function () { // 獲取自定義屬性的值 alert(this.getAttribute('num')); }; } // 根據id獲取元素,註冊點擊事件,添加事件處理函數 document.getElementById('btn').onclick = function () { // 遍歷 for (var i = 0; i < Objs.length; i++) { // 移除自定義屬性 Objs[i].removeAttribute('num'); } }; </script> </body> </html>
介紹:
1,頁面上的全部內容都是節點:標籤是節點,屬性是節點,文本也是節點(文本有文字空格換行)
2,獲取標籤元素很是方便
節點的屬性:
節點的屬性:(可使用標籤(元素).出來,可使用屬性節點.出來,文本節點.點出來)
節點的類型 nodeType // 1 標籤節點,2 屬性節點,3 文本節點
節點的名字 nodeName // 大寫標籤名 標籤節點,小寫屬性名 屬性節點,#text 文本節點
節點的值 nodeValue // Null 標籤節點,屬性名 屬性節點,文本的內容
獲取節點:
1,只有標籤才能做爲父節點
2, .parentNode,.parentElement支持全部瀏覽器(谷歌,火狐,IE8)
3,.childNodes,children也支持全部瀏覽器(谷歌,火狐,IE8)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>kay</title> </head> <body> <input type="button" value="獲取" id="btn"/> <ul id="uls"> <li>kay1</li> <li>kay2</li> <li>kay3</li> <li id="middle">kay4</li> <li>kay5</li> <li>kay6</li> <li>kay7</li> </ul> <script> // 根據id獲取按鈕,註冊點擊時間,添加事件處理函數 document.getElementById('btn').onclick = function () { // 根據id獲取元素li var middle = document.getElementById('middle'); // 獲取父節點 console.log(middle.parentNode); // 獲取到整個ul // 獲取父元素 console.log(middle.parentElement); // 獲取到也是整個ul // 獲取前一個兄弟元素 console.log(middle.previousElementSibling); // 獲取到kay3 // 獲取前一個兄弟節點 console.log(middle.previousSibling); // 返回#text(就是距離前一個元素中間的那段換行) } </script> </body> </html>
//獲取父節點 parentNode //獲取父元素 parentElement // 獲取子節點 childNodes //獲取子元素 children //獲取第一個子節點 firstChild // 獲取第一個子元素 firstElementChild //獲取最後一個子節點 lastChild //獲取最後一個子元素 lastElementChild //獲取前一個節點 previousSibling //獲取前一個元素 previousElementSibling //獲取後一個節點 nextSibling //獲取後一個元素 nextElementSibling
瀏覽器兼容問題:
1,在IE8獲取子節點和兄弟節點被變成獲取子元素和兄弟元素
2,在IE8獲取父節點和父元素能夠正常獲取
//總結:凡是獲取節點的代碼在谷歌和火狐獲得的都是 相關的節點
//凡是獲取元素的代碼在谷歌和火狐獲得的都是 相關的元素
//從子節點和兄弟節點開始,凡是獲取節點的代碼在IE8中獲得的是元素,獲取元素的相關代碼,在IE8中獲得的是undefined----元素的代碼,iE中不支持
// 獲取任意一個父級元素的第一個子元素 function getFirstElementChild(element) { // 判斷瀏覽器是否支持 if (typeof element.firstElementChild !== 'undefined') { // 返回第一個子元素 return element.firstElementChild; } else { // node=第一個字節點 var node = element.firstChild; // node.nodeType !== 1(不是標籤) while (node && node.nodeType !== 1) { // // node = 後一個字節點 node = node.nextSibling; } return node; } } // 獲取任意一個父級元素的最後一個子元素 function getLastElementChild(element) { // if (typeof element.lastElementChild !== 'undefined') { return element.lastElementChild; } else { // node=最後一個子節點 var node = element.lastChild; // node.nodeType !== 1(不是標籤) while (node && node.nodeType !== 1) { // node = 前一個字節點 node = node.previousSibling; } // 返回節點 return node; } }
1,document.write('標籤的代碼及內容')
// 缺陷:若是在頁面加載完畢後,經過這種方式建立元素,會把頁面的全部內容都清除(只剩下這個建立的元素)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>kay</title> </head> <body> <input type="button" value="獲取" id="btn"/> <ul id="uls"> <li>kay1</li> <li>kay2</li> <li>kay3</li> <li id="middle">kay4</li> <li>kay5</li> <li>kay6</li> <li>kay7</li> </ul> <script> // 根據id獲取按鈕,註冊點擊時間,添加事件處理函數 document.getElementById('btn').onclick = function () { document.write('<p>哈哈頁面消失了吧</p>'); } </script> </body> </html>
2,對象.innerHTML='標籤及代碼'
// 在誰裏面建立就應該是(誰.innerHTML)
document.getElementById('btn').onclick = function () { var middle = document.getElementById('middle'); middle.innerHTML = '<p>見證奇蹟的時刻</p>'; }
3,document.createElement('標籤的名字')
// 根據id獲取按鈕,註冊點擊時間,添加事件處理函數 document.getElementById('btn').onclick = function () { // 建立p元素 var p = document.createElement('p'); // 設置p元素中間內容 p.innerText = '見證奇蹟'; // 把建立的子元素,追加到父元素裏面 document.getElementById('middle').appendChild(p); }
元素相關操做:
.appendChile(newChild) // 追加子元素
.insertBefore (newChild,refChild) // 在某元素以前插入新元素。.insertAfter在某元素以後插入新元素
.replaceChild (newChild,refChild) // 替換子元素
.removeChild(oldChild) // 移除子元素
job:
// 第一種實現方式 my$('btn').onclick = function () { // 若是這個按鈕存在 if (my$('btn1')) { // 移除這個按鈕 my$('dv').removeChild(my$('btn1')); } // 建立按鈕 var input = document.createElement('input') input.type = 'button'; input.value = '按鈕'; input.id = 'btn1'; // 追加 my$('dv').appendChild(input); }; //--------------------- // 第二種實現方式 my$('btn').onclick = function () { // 判斷這個按鈕是否存在 if (!my$('btn1')) { // 按鈕不存在 var obj = document.createElement('input'); obj.type = 'button'; obj.value = '按鈕'; obj.id = 'btn1'; my$('dv').appendChild(obj); } }
綁定事件的三種方式:
addEventListener和attachEvent能夠綁定多個相同事件!
a,.on事件名=事件處理函數 // 谷歌,火狐,IE8都支持
缺點:不能綁定多個相同事件,假如綁定多個的話最終只有一個。
b,.addEventListener(type,listener,useCapture) //只有谷歌和火狐支持
//參數1:事件的類型---事件的名字,沒有on
//參數2:事件處理函數---函數(命名函數,匿名函數)
//參數3:布爾類型,目前就寫false
// 不支持IE8 document.getElementById('btn').addEventListener('click', function () { console.log('hello'); }, false);
c,.attachEvent(type,listener) //只有IE8支持
//參數1:事件類型---事件名字,有on
//參數2:事件處理函數---函數(命名函數,匿名函數)
// 只支持IE8 document.getElementById('btn').attachEvent('onclick', function () { console.log('hello'); });
解綁事件:對應以上的三種解綁方法
注意:用什麼方式綁定事件,就應該用對應的方式解綁事件
a,對象.on事件名=null
// 綁定 document.getElementById('btn1').onclick = function () { console.log('kay'); } document.getElementById('btn2').onclick = function () { // 解綁 document.getElementById('btn1').onclick = null; }
b,對象.removeEventListener('不帶on的事件名', 函數名, false)
// 命名函數 function f1() { console.log('hello') } // 綁定 document.getElementById('btn1').addEventListener('click', f1, false) document.getElementById('btn2').onclick = function () { // 解綁 document.getElementById('btn1').removeEventListener('click', f1, false); };
c,對象.detachEvent(帶on的事件名, 函數名)
// 命名函數 function f2() { console.log('kay'); } // 綁定 document.getElementById('btn1').attachEvent('onclick', f2); // document.getElementById('btn2').onclick = function () { // 解綁 document.getElementById('btn1').detachEvent('onclick', f2); };
解決瀏覽器兼容問題:
// 爲任意元素綁定任意事件 function addEventListener(element, type, fn) { // 若是瀏覽器有這個方法,谷歌,火狐 if (element.addEventListener) { element.addEventListener('click', fn, false); // IE8的 } else if (element.attachEvent) { element.attachEvent('on' + type, fn); } else { element['on' + type] = null; } } // 兩個命名函數 function f1() { console.log('kay1'); } function f2() { console.log('kay2'); } var btn1 = document.getElementById('btn1'); // 綁定兩個點擊事件 addEventListener(btn1, 'click', f1); addEventListener(btn1, 'click', f2);
// 爲任意元素解綁事件 function removeEventListener(element, type, fnName) { // 若是瀏覽器有這個方法 if (element.removeEventListener) { element.removeEventListener(type, fnName, false); } else if (element.detachEvent) { element.detachEvent('on' + type, fnName); } else { element['on' + type] = null; } } // 解綁事件 removeEventListener(btn1, 'click', f2);
事件冒泡解釋:
多個元素嵌套,有層次關係,這些元素都註冊了相同的事件,
若是裏面的元素的事件觸發了,
外面的元素的該事件自動的觸發了.
<div id="dv1"> <div id="dv2"> <div id="dv3"></div> </div> </div> <script> // 最外層 document.getElementById('dv1').onclick = function () { console.log('外層===' + this.id); }; // 第二層 document.getElementById('dv2').onclick = function () { console.log('第二層===' + this.id); }; // 最裏層 document.getElementById('dv3').onclick = function () { console.log('最裏層===' + this.id); }; </script>
阻止事件冒泡:
1,window.event.cancelBubble = true; // 谷歌和IE8支持,火狐不支持
2,e.stopPropagation(); // 谷歌和火狐支持,IE8不支持
這種使用的是事件處理函數的參數對象.方法()
document.getElementById('dv1').onclick = function () { console.log('外層===' + this.id); }; document.getElementById('dv2').onclick = function () { console.log('第二層===' + this.id); // 阻止事件冒泡第一種 // window.event.cancelBubble = true; }; // function (參數對象) document.getElementById('dv3').onclick = function (e) { console.log('最裏層===' + this.id); // 阻止事件冒泡第二種, e.stopPropagation(); };
1捕獲階段 --- 從外到裏
2目標階段
3冒泡階段 --- 從裏到外
e.eventPhase // 調用事件處理程序的階段
// 命名函數 function fn(e) { var current = ''; // 判斷事件處於哪一個階段 switch (e.eventPhase) { case 1: current = '捕獲階段'; break; case 2: current = '目標階段'; break; case 3: current = '冒泡階段'; break; } console.log(this.id + '===' + current); }
// var dv1 = document.getElementById('dv1'); var dv2 = document.getElementById('dv2'); var dv3 = document.getElementById('dv3'); var objs = [dv1, dv2, dv3]; // 爲數組中每一個元素註冊點擊事件 objs.forEach(function(item) { // true捕獲階段,false冒泡階段 item.addEventListener('click', fn, false) });
被點擊的div3就是:目標階段
job:爲同一元素綁定多個不一樣事件,並使用同一個事件處理函數
// 命名函數 function fn(e) { switch(e.type) { case 'click': alert('kay,hellow'); break; case 'mouseover': this.style.backgroundColor = 'hotpink'; break; case 'mouseout': this.style.backgroundColor = 'green'; break; } } var btn = document.getElementById('btn'); // 爲按鈕綁定:點擊,鼠標進入,鼠標離開事件 btn.addEventListener('click', fn, false); btn.addEventListener('mouseover', fn, false); btn.addEventListener('mouseout', fn, false);