JavaScript-知識總結-1(GitHub更新)

JavaScript基礎知識剖析

01

  • 01-01 變量類型和計算(1)
  • 01-02 變量類型和計算(2)
  • 01-03 變量類型和計算(3)-JSON的理解
  • 01-04 原型與原型鏈-構造函數
  • 01-05 原型規則和示例
  • 01-06 原型鏈
  • 01-07 instanceof
  • 01-08 知識點小結 & 解決問題

02

  • 02-01 作用域和閉包-執行上下文
  • 02-02 作用域和閉包-this
  • 02-03 作用域和閉包-作用域
  • 02-04 作用域和閉包-閉包
  • 02-05 知識點小結 & 解決問題

03

  • 03-01 異步和單線程-什么是異步
  • 03-02 異步和單線程-單線程
  • 03-03 其他知識點-日期和Math
  • 03-04 其他知識點-數組和對象的API

04

JS小練習

  • JSDemo JS小程序
  • JDMenu 京東無延遲菜單
  • DatePicker組件開發
  • 手風琴效果開發

知識點學習

01-01

變量類型和計算(1)

  • JS中使用typeof能得到的哪些類型
  • 何時使用===何時使用 ==
  • JS中有哪些內置函數
  • JS變量按照存儲方式區分為哪些類型,并描述其特點
  • 如何理解JSON

值類型

  • 從內存來說值類型是把每一個值存儲在變量類型的每一個位置
var a = 100;
var b = a;
a = 200
console.log(b);//100

引用類型

  • 把a賦值*-成一個對象,a的位置是通過指針指向一個位置
  • 把b賦值成a,其實是定義一個b,b的指針指向了那個對象位置
  • 也就是有兩份 age:20的對象
  • 對象的引用,就相當于復寫一個對象,這兩個對象之間相互獨立
  • 引用類型:對象、數組、函數
var a ={age:20};
var b = a;
b.age = 21;
console.log(a.age); //21
  • typeof運算符
typeof undefined //undefined
typeof 'abc' // String
typeof 123 //number
typeof true //boolean
typeof {} //object
typeof [] //object
typeof null //object
typeof console.log //funciton

變量計算-強制類型轉換

  • 字符串拼接
var a = 100 + 10;//110
var b = 100 + '10';//10010
  • == 運算符
100 == '100' //true
0 == '' //true
null == undefined //true
  • if語句
var a = true;
if(a){
  //....
}
var b = 100;
if (b) {
  //....
}
var c = '';
if (c) {
  //...
}
  • 邏輯運算
console.log(10 && 0); //0
console.log('' || 'abc'); //abc
console.log(!window.acb); //true

//判斷一個變量會被當做true還是false
var a = 100;
console.log(!!a);

01-02

變量類型和計算(2)

JS中使用typeof能得到的類型

//問題:JS中使用typeof能得到哪些類型
typeof undefined //undefined
typeof 'abc' // String
typeof 123 //number
typeof true //boolean
typeof {} //object
typeof [] //object
typeof null //object
typeof console.log //funciton
  • 總結來說typeof可以得到undefined、String、number、boolean可以區分值類型,但對于引用類型無法很細的區分,只能區分函數。
  • 尤其是typeof null //object它是一個引用類型

何時使用 === 和 ==

//問題:何時使用===何時使用==

if (obj.a == null) {
  //這里相當于 obj.a === null || obj.a === undefined,簡寫形式
  //這是jquery源碼中推薦的寫法
}

JS中的內置函數

//問題:JS中有哪些內置函數----數據封裝類對象
//作為構造函數的作用
Object
Array
Boolean
Number
String
Function
Date
RegExp
Error

JS按照存儲方式區分變量類型

//JS 變量按照存儲方式區分為哪些類型,并描述其特點

//值類型
var a = 10;
var b = a;
a = 11;
console.log(b);  // 10

//引用類型
var obj1 = {x:100}
var obj2 = obj1;
obj1.x = 200;
console.log(obj2.x); // 200
  • ES中,引用類型是一種數據結構,用于將數據和功能組織在一起

01-03

變量類型和計算(3)-理解JSON

//問題:如何理解JSON
//JSON只不過是一個JS對象
//JSON也是一個數據格式
JSON.stringify({a:10,b:20});
JSON.parse('{"a":10."b":20}')

01-04

原型與原型鏈-構造函數

  • 如何準確判斷一個變量數組類型
  • 寫一個原型鏈繼承的例子
  • 描述new一個對象的過程
  • zepto(或其他框架)源碼中如何使用原型鏈

知識點

  • 構造函數
  • 構造函數-擴展
  • 原型規則和示例
  • 原型鏈
  • instanceof

構造函數

  • 自己的想法
  • 普通的函數就像是按步驟執行的動作,而構造函數更像是可更改零件的木偶,普通函數可以直接調用,但是構造函數需要new
  • 因為構造函數也是函數,所以可以直接被調用,但是它的返回值為undefine,此時構造函數里面的this對象等于全局this對象
  • 擴展實例和對象的區別,從定義上來講:1、實例是類的具象化產品,2、而對象是一個具有多種屬性的內容結構。
funciton Foo(name,age){
  this.name = name;
  this.age = age;
  this.class = 'class-1';
  // return this //默認有這一行
}
var f = new Foo('zhangsan',20); //實例化對象
// var f1 = new Foo('lisi',22) //創建多個對象

構造函數-擴展

  • var a = {} 其實是 var a = new Object()的語法糖
  • var a = [] 其實是 var a = new Array()的語法糖
  • function Foo(){...}其實是 var Foo = new Function(...)
  • 使用 instanceof 判斷一個函數是否是一個變量的構造函數
    • 如果想判斷一個變量是否為“數組”:變量 instanceof Array

01-05

原型規則和示例

  • 5條原型規則
  • 原型規則是學習原型鏈的基礎

第1條

  • 所有的引用類型(數組、對象、函數),都具有對象特質、即可自由擴展屬性(除了“NULL”以外)
var obj = {}; obj.a = 100;
var arr = []; arr.a = 100;
function fn(){
  fn.a=100;
}

第2條

  • 所有的引用類型(數組、對象、函數),都有一個__proto__(隱式原型)屬性,屬性值是一個普通的對象
console.log(obj.__proto__);
console.log(arr.__proto__);
console.log(fn.__proto__);

第3條

  • prototype解釋為JavaScript開發函式庫及框架
  • 所有的函數,都有一個prototype(顯示原型)屬性,屬性值也是一個普通對象。
console.log(fn.prototype);

第4條

  • 所有引用類型(數組、對象、函數),__proto__屬性值指向它的構造函數的prototype屬性值
console.log(obj.__proto__ === Object.prototype);

第5條

  • 當試圖得到一個對象的某個屬性時,如果這個對象本身沒有這個屬性,那么會去它的__proto__(即它的構造函數prototype)中尋找
//構造函數
function Foo(name,age){
  this.name = name;
}
Foo.prototype.alertName = function () {
  alert(this.name);
}
//創建示例
var f = new Foo('zhangsan')
f.printName = function () {
  console.log(this.name);
}
//測試
f.printName();
f.alertName();
  • this

循環對象自身屬性

var item;
for (item in f) {
  //高級瀏覽器已經在for in 中屏蔽了來自原型的屬性
  //但是這里建議大家還是加上這個判斷,保證程序的健壯性
  if(f.hasOwnProperty(item)) {
    console.log(item);
  }
}

01-06

原型鏈

//構造函數
function Foo(name,age){
  this.name = name;
}
Foo.prototype.alertName = function (){
  alert(this.name);
}
//創建示例
var f = new Foo('zhangsan');
f.printName = function () {
  console.log(this.name);
}
//測試
f.printName();
f.alertName();
f.toString(); // 要去f.__proto__.__proto__中查找

原型鏈視圖

原型鏈圖
原型鏈圖

01-07

instanceof

  • 用于判斷引用類型屬于哪個構造函數的方法
  • f instanceof Foo 的判斷邏輯是:
  • f__proto__一層一層往上走,是否能對應到Foo.prototype
  • 再試著判斷f instanceof Object

01-08

知識點小結 & 解決問題

如何準確判斷一個變量是數組類型

var arr = [];
arr instanceof Array; //true
typeof arr //object  typeof是無法判斷是否是數組

寫一個原型鏈繼承的例子

//動物
function Animal(){
  this.eat = function () {
    console.log('animal eat');
  }
}
//狗??
function Dog(){
  this.bark = function () {
    console.log('dog bark');
  }
}
Dog.prototype = new Animal();
//哈士奇
var hashiqi = new Dog();
//如果要真正寫,就要寫更貼近實戰的原型鏈

描述new一個對象的過程

  • 創建一個新對象
  • this指向這個新對象
  • 執行代碼,即對this賦值
  • 返回this ??
function Foo(name,age){
  this.name = name ;
  this.age = age ;
  //return this //默認有這一行
}
var f = new Foo('zhangsan',20);
//var f1 = new Foo('list',22) //創建多個對象

zepto(或其他框架)源碼中如何使用原型鏈

  • 。。。。。。

貼近實際開發原型鏈繼承的例子

function Elem(id) {
  this.elem = document.getElementById(id);
}

Elem.prototype.html = function (val) {
  var elem = this.elem;
  if (val) {
    elem.innerHTML = val;
    return this; // 鏈式操作
  }else {
    return elem.innerHTML;
  }
}

Elem.prototype.on = function (type, fn) {
  var elem = this.elem ;
  elem.addEventListener(type, fn) ;
}

var div1 = new Elem('div1');
//console.log(div1.html());
div1.html('<p>hello imooc</p>')
div1.on('click',function () {
  alert('click')
})

02-01

作用域和閉包-執行上下文

  • 說一下對變量提升的理解
  • 說明this幾種不同的使用場景
  • 創建10個<a>標簽,點擊的時候彈出來對應的序號
  • 如何理解作用域
  • 實際開發中閉包的應用

知識點梳理

  • 執行上下文
  • this
  • 作用域
  • 作用域鏈
  • 閉包

執行上下文

console.log(a);  // undefined
var a = 100;

fn('zhangsan')  // 'zhangsan' 20
function fn(name) {
  age = 20;
  console.log(name, age);
  var age;
}
  • 范圍:一段<script>或者一個函數
  • 全局:變量定義、函數聲明
  • 函數:變量定義、函數聲明、this、arguments
  • 注意??“函數聲明”和“函數表達式”的區別
fn()
function fn() {
  //聲明
}

fn1()
var fn1 = function () {
  //表示
}
var a = 100; //類似于這個

//全局聲明

console.log(a);
var a = 100;

fn('zhangsan')
function fn(name) {
  console.log(this);
  age = 20;
  console.log(name,age);
  var age;

  bar(100);

  function bar(num) {
    console.log(num);
  }
}

02-01

作用域和閉包-this

  • this 要在執行時才能確認值,定義時無法確認值
var a = {
  name:'A',
  fn:function(){
    console.log(this.name);
  }
}
a.fn() //this === A
a.fn.call({name:'B'}) //this === {name:'B'}
var fn1 = a.fn;
fn1() //this === window
  • 作為構造函數執行
  • 作為對象屬性執行
  • 作為普通函數執行
  • call apply bind
function Foo(name){
  this.name = name;
}
var f = new Foo('zhangsan');

var obj = {
  name:'A',
  printName:function(){
    console.log(this.name);
  }
}
obj.printName()

function fn(){
  console.log(this);
}
fn()

// call apply bind
function fn1(name) {
  alert(name);
  console.log(this);
}
fn1.call({x:100},'zhangsan',20);
// bind
var fn2 = function fn2(name) {
  alert(name);
  console.log(this);
}.bind({y:200});
fn2('zhangsan',20);

02-03

作用域和閉包-作用域

作用域

  • 沒有塊級作用域
  • 只有函數和全局作用域
//無塊級作用域
if(true){
  var name = 'zhangsan';
}
console.log(name);

//函數和全局作用域
var a = 100;
function fn() {
  var a = 200;
  console.log('fn',a);
}
console.log('global',a);
fn();
  • 作用域鏈
var a = 100;
function fn() {
  var b = 200;

  //但錢作用域沒有定義變量,即“自由變量”
  console.log(a);
  console.log(b);
}
fn();

var a = 100;
function F1() {
  var b = 200;
  function F2() {
    var c = 300;
    console.log(a);//a是自由變量。形成一個鏈式結構,向父級去查找
    console.log(b);//b是自由變量
    console.log(c);//
  }
}

02-04

作用域和閉包-閉包

  • 函數作為返回值
function F1() {
  var a = 100;
  //返回一個函數(函數作為返回值)
  return function () {
    console.log(a);//自由變量,父作用域中查找
  }
}
//f1得到一個函數
var f1 = F1();
var a = 200;
f1();
  • 函數作為參數傳遞
function F1() {
  var a = 100;
  return function () {
    console.log(a);  //自由變量,父作用域中查找
  }
}
var f1 = F1();
function F2(fn) {
  var a = 200;
  fn();
}
F2(f1);

02-05

知識點小結 & 解決問題

對變量提升的理解

  • 變量定義
  • 函數聲明(注意和函數表達式的區別)

this幾種不停的使用場景

  • 作為構造函數執行
  • 作為對象屬性執行
  • 作為普通函數執行
  • call apply bind
function Foo(name){
  this.name = name;
}
var f = new Foo('zhangsan');

var obj = {
  name:'A',
  printName:function(){
    console.log(this.name);
  }
}
obj.printName()

function fn(){
  console.log(this);
}
fn()

// call apply bind
function fn1(name) {
  alert(name);
  console.log(this);
}
fn1.call({x:100},'zhangsan',20);
// bind
var fn2 = function fn2(name) {
  alert(name);
  console.log(this);
}.bind({y:200});
fn2('zhangsan',20);

創建10個<a>標簽點擊的時候彈出來對應的序號

  • 錯誤寫法
//這是一個錯誤的寫法!!!
var i,a;
for (var i = 0; i < 10; i++) {
  a = document.createElement('a');
  a.innerHTML = i + '<br>';
  a.addEventListener('click',function (e) {
    e.preventDefault();
    alert(i)
  })
  document.body.appendChild(a);
}
//輸出為如下: <a>"9"<br></a>
  • 正確寫法
//這是一個正確寫法!!!
var i;
for (i = 0; i < 10; i++) {
  (function(i){
    var a = document.createElement('a');
    a.innerHTML = i + '<br>';
    a.addEventListener('click',function (e) {
      e.preventDefault();
      alert(i);
    })
    document.body.appendChild(a);
  })(i)
}

如何理解作用域

  • 自由變量
  • 作用域鏈,即自由變量的查找
  • 閉包的兩個場景

實際開發中閉包的應用

//閉包實際應用中主要作用于封裝變量,收取權限
function isFirstLoad() {
  var _list = [];
  return function (id) {
    if(_list.indexOf(id) >= 0){
      return false;
    }else {
      _list.push(id);
        return true;  
    }
  }
}

// 應用
var firstLoad = isFirstLoad()
firstLoad(10) // true
firstLoad(10) // false;
firstLoad(20) // true

03-01

異步和單線程-什么是異步

  • 同步和異步的區別是什么?分別舉一個同步和異步的例子
  • 一個關于setTimeout的筆試題
  • 前端使用異步的場景有哪些

異步知識點

  • 什么是異步(對比同步)
  • 前端使用異步的場景
  • 異步與單線程

什么是異步

console.log(100); // step1
setTimeout(function () {
  console.log(200); // step3
},1000);
console.log(300); // step2

對比同步

console.log(100);
alert(200) // 1秒鐘后點擊確認
console.log(300);

何時需要異步

  • 在可能發生等待的情況
  • 等待過程中不能像alert一樣阻塞程序運行
  • 因此,所有的所有的等待情況都需要異步

前端使用異步的場景

  • 定時任務:setTimeout,setInverval
  • 網絡請求:ajax請求,動態<img>加載
//ajax請求
console.log('start');
$.get('./data1.json',function (data1) {
  console.log(data1);
})
console.log('end');
//<img>加載示例
console.log('start');
var img = document.createElement('img');
img.onload = function () {
  console.log('loaded');
}
img.src = '/xxx.png';
console.log('end');
  • 事件綁定

03-02

異步和單線程-單線程

console.log(100); // step1
setTimeout(function () {
  console.log(200); // step3
});
console.log(300); // step2
  • 從上面代碼中理解單線程
    • 執行第一行,打印100
    • 執行setTimeout后,傳入setTimeout的函數會被暫存起來,不會立即執行(單線程的特點,不能同時干兩件事)
    • 執行最后一行打印300
    • 待所有程序執行完,處于空閑狀態時,會立馬看有沒有暫存起來的要執行
    • 發現暫存起來的setTimeout中的函數無需等待時間,就立即來過來執行

解答:異步與單線程

  • 同步和異步的區別是什么?分別舉一個同步和異步的例子
    • 同步會阻塞代碼執行,而異步不會
    • alert是同步,setTimeout是異步
  • 一個關于setTimeout的筆試題
  • 可以說setTimeout是等待頁面加載完畢后,在進行加載
console.log(1);
setTimeout(function () {
  console.log(2);
},0)
console.log(3);
setTimeout(function () {
  console.log(4);
},1000)
console.log(5);
  • 前端使用異步的場景有哪些
    • 定時任務:setTimeout,setInverval
    • 網絡任務:ajax請求,動態<img>加載
    • 事件綁定

03-03

其他知識點-日期和Math

獲取 2017-06-10 格式的日期

Date.now(); // 獲取當前時間毫秒數
var dt = new Date();
dt.getTime() // 獲取毫秒數
dt.getFullYear() // 年
dt.getMonth() // 月(0-11)
dt.getDate() // 日(0-31)
dt.getHours() // 小時(0-23)
dt.getMinutes() // 分鐘(0-59)
dt.getSeconds() // 秒 (0-59)

獲取隨機數,要求時長度一致的字符串格式

  • Math 獲取隨機數 Math.random()

03-04

其他知識點-數組和對象的API

寫一個能遍歷對象和數組的通用forEach函數

數組API
  • forEach 便利所有元素
var arr = [1,2,3];
arr.forEach(function (item,index) {
  //遍歷數組所有元素
  console.log(index,item);
})
  • every 判斷所有元素是否都符合條件
var arr = [1,2,3];
var result = arr.every(function (item,index) {
  if (item<4) {
    //用于判斷所有的數組元素,都滿足一個條件
    return true;
  }
})
console.log(result);
  • some 判斷是否有至少一個元素符合條件
var arr = [1,2,3];
var result = arr.some(function (item,index) {
  // 用來判斷所有的數組元素,只要有一個滿足條件即可
  if (item<2) {
    return true;
  }
})
console.log(result);
  • sort 排序
var arr = [1,4,2,3,5]
var arr2 = arr.sort(function (a,b) {
  //從小到大排序
  return a - b;
  //從大到小排序
  //return b - a
})
console.log(arr2);
  • map 對元素重新組裝,生成新數組
var arr = [1,2,3,4]
var arr2 = arr.map(function functionName(item,index) {
  //將元素重新組裝,并返回
  return '<b>' + item + '</b>';
})
console.log(arr2);
  • filter 過濾符合條件的元素
var arr = [1,2,3];
var arr2 = arr.filter(function (item,index) {
  //通過某一個條件過濾數組
  if(item >= 2){
    return true;
  }
})
console.log(arr2);
對象API
var obj = {
  x: 100,
  y: 200,
  z: 300
}
var key
for (key in obj) {
  // 注意這里的hasOwnProperty,請查看原型鏈
  if (obj.hasOwnProperty(key)) {
    console.log(key,obj[key]);
  }
}
  • 舉個例子
<!DOCTYPE html>
<html>
    <head>
    <meta charset="utf-8" />
        <title>Register</title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  </head>
<body>
  <script type="text/javascript">
    console.log(Date.now());
    var dt = new Date();
    console.log(dt);
    console.log(dt.getTime());
    console.log(dt.getFullYear());
    console.log(dt.getDate());

    var arr = [1,2,3,4]

    arr.forEach(function (item,index) {
      console.log(index,item);
    })
  </script>
</body>
</html>

問題解答

  • 獲取2017-06-10格式的日期
function formatDate(dt) {
  if (!dt) {
    dt = new Date();
  }
  var year = dt.getFullYear();
  var month = dt.getMonth() + 1;
  var date = dt.getDate();
  if (month < 10) {
    //強制轉換類型
    month = '0' + month;
  }
  if (date < 10) {
    //強制轉換類型
    date = '0' + date;
  }
  //強制轉換類型
  return year + '-' + month + '-' + date;
}
var dt = new Date();
var formatDate = formatDate(dt);
console.log(formatDate);
  • 獲取隨機數,要求是長度一致的字符串格式
var random = Math.random();
var random = random + '0000000000'; //后面加上10個0
var random = random.slice(0,10);
console.log(random);
  • 寫一個能遍歷對象和數組的通用forEach函數
//do
var arr = [1,2,3];
//注意,這里的參數的順序換了,為了和對象的遍歷格式一致
forEach(arr,function (index,item) {
  console.log(index.item);
})

var obj = {x:100,y:200};
forEach(obj,function (key,value) {
  console.log(key,value);
})

//init
function forEach(obj,fn) {
  var key;
  if (obj instanceof Array) {
    //準確判斷是不是一個數組
    obj.forEach(function (index.item) {
      fn(index,item);
    })
  }else {
    //不是數組就是對象
    for (key in obj){
      fn(key,obj[key]);
    }
  }
}

04-01

從基礎知識到JS-Web-API

  • 變量類型和計算
  • 原型和原型鏈
  • 閉包和作用域
  • 異步和單線程
  • 其他(如日期、Math、各種常用API)

特點

  • 特點:表面上來看不能用于工作中開發代碼
  • 內置函數:Object Array Boolean String ......
  • 內置對象:Math JSON ...
  • 我們連在網頁彈出一句Hello World都不能實現

JS-Web-API

  • JS基礎知識:ECMA 262標準
  • JS-Web-API:W3C標準
  • W3C標準中關于JS的規定有:
    • DOM操作
    • BOM操作
    • 事件綁定
    • ajax請求(包含http協議)
    • 存儲

基本操作

  • 頁面彈框是windows.alert(123),瀏覽器需要做:
    • 定義一個windows全局變量,對象類型;
    • 給它定義一個alert屬性,屬性值是一個函數;
  • 獲取元素document.getElementById(id),瀏覽器需要:
    • 定義一個document全局變量,對象屬性;
    • 給它定義一個getElementById的屬性,屬性值是一個函數;
  • W3C標準沒有規定任何JS基礎相關的東西;
  • 不管什么變量類型、原型、作用域和異步
  • 只管定義用于瀏覽器中JS操作頁面的API和全局變量
  • 全面考慮,JS內置的全局函數和對象有哪些?
  • 之前ECMA的
  • 比如 window document
  • 所有未定義的全局變量,如navigator.userAgent

總結

  • 常說的JS(瀏覽器執行的JS)包含兩個部分:
  • JS基礎知識(ECMA262標準);
  • JS-Web-API(W3C標準);

04-02

DOM操作

  • Document Object Model
  • DOM是哪種基本的數據結構
  • DOM操作的常用API有哪些
  • DOM節點的attr和property有和區別

DOM的本質

  • XML
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Dont forget me this weekend</body>
<other>
<a></a>
<b></b>
</other>
</note>
  • XML
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Document</title>
</head>
<body>
  <div>
    <p>this is p</p>
  </div>
</body>
</html>

04-03

DOM節點操作

  • 獲取DOM節點
  • prototype,獲取JS對象上的屬性
  • Attribute,獲取DOM標簽上的屬性

獲取DOM節點

var div1 = document.getElementById('div1'); //元素
var divList = document.getElementByTagName('div'); //集合
console.log(divList.length);
console.log(divList[0]);

var containerList = document.getElementByClassName('.container'); //集合
var pList = document.querySelectorAll('p'); //集合

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 和 ndoeType
console.log(p.nodeName);
console.log(p.nodeType);

Attribute

var pList = document.querySelectorAll('p');
var p = pList[0];
p.getAttribute('data-name');
p.getAttribute('data-name','imooc');
p.getAttribute('style');
p.setAttribute('style','font-size:30px;');

04-04

DOM結構操作

  • 新增節點
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);
  • 獲取父元素-獲取子節點
var div1 = document.getElementById('div1');
var parent = div1.parentElement;
  • 刪除節點
var div1 = document.getElementById('div1');
var child = div1.childNodes;
div1.removeChild(child[0]);

舉個栗子(例子:example)!!!

<!DOCTYPE html>
<html>
<head>
</head>
<body>
  <div id="div1">
    <p id="p1">this is p1</p>
    <p id="p2">this is p2</p>
  </div>
  <div id="div2">
    <p id="p3">this is p3</p>
    <p id="p4">this is p4</p>
  </div>
  <script type="text/javascript">
  var p = document.createElement('p');
  p.innerHTML = '';
  </script>
</body>
</html>

04-05

DOM知識總結

  • DOM是哪種基本的數據結構?
  • DOM操作的常用API有哪些
    • 獲取DOM節點,以及節點的propertyAttribute
    • 獲取父節點,獲取子節點
    • 新增節點,刪除節點
  • DOM節點Attributeproperty有何區別
    • property只是一個JS對象的屬性的修改
    • Attribute是對html標簽屬性的修改
  • 重點總結
    • DOM本質
    • DOM節點的操作
    • DOM結構操作
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容