js數據綁定(模板引擎原理)
阿新 • • 發佈:2017-10-03
name 沒有 bsp creat 兩種 spa 而是 length clas
1 <div> 2 <ul id="list"> 3 <li>11111111111</li> 4 <li>22222222222</li> 5 <li>33333333333</li> 6 </ul> 7 </div>
我為ul中的每個li綁定了事件,鼠標移入變換背景色(為了演示代碼,這裏沒有使用事件代理,如果使用事件代理,對於本例無效)
1 var data = ["aaa", "bbb", "ccc"]; 23 var oUl = document.querySelector("#list"); 4 var oLi = document.getElementsByTagName("li"); 5 6 for(var i = 0; i < oLi.length; i++) { 7 oLi[i].onmouseover = function(e) { 8 9 e.target.style.backgroundColor = "pink"; 10 11 } 12 oLi[i].onmouseout = function(e) { 13 14e.target.style.backgroundColor = ""; 15 16 } 17 }
(此例使用事件代理寫法是這樣,不過對於本案例無效,所以不使用這種方法)
1 oUl.onmouseover = function(e) { 2 if(e.target.tagName == "LI") { 3 e.target.style.backgroundColor = "pink"; 4 } 5 } 6 oUl.onmouseout = function(e) { 7 if(e.target.tagName == "LI") {8 e.target.style.backgroundColor = ""; 9 } 10 }
1.動態插入節點(優點:不影響原有結構綁定的事件,缺點:觸發dom重排,非常耗性能,不建議使用)
1 var data = ["aaa", "bbb", "ccc"]; 2 3 var oUl = document.querySelector("#list"); 4 5 for(var i = 0; i < data.length; i++) { 6 var oLi = document.createElement("li"); 7 oLi.innerHTML = data[i]; 8 oUl.appendChild(oLi); 9 }
2.字符串拼接(優點:只觸發一次dom重排,缺點:影響原有結構綁定的事件【註意此時假如你沒有使用事件代理,而是使用循環為每個li添加事件,才會出現原有結構綁定的事件無效,否則,原有事件依然有效,這其實也體現了事件代理的一個優勢,就是不關心子元素如何變化,只要父元素沒有變化,事件依然有效】)
1 var str = ""; 2 for(var i = 0; i < data.length; i++) { 3 str += "<li>"; 4 str += data[i]; 5 str += "</li>" 6 } 7 8 oUl.innerHTML += str;
3.dom碎片(前兩種方法的綜合,既考慮性能,又不影響原有結構)
1 var frg = document.createDocumentFragment(); 2 3 var str = ""; 4 for(var i = 0; i < data.length; i++) { 5 var oLi = document.createElement("li"); 6 oLi.innerHTML = data[i]; 7 frg.appendChild(oLi); 8 } 9 10 oUl.appendChild(frg);
js數據綁定(模板引擎原理)