源代碼見:
https://github.com/Embrace830/JSExample
&&和||的理解
a || b:如果a是true,那么b不管是true還是false,都返回true。因此不用判斷b了,這個時候剛好判斷到a,因此返回a。
如果a是false,那么就要判斷b,如果b是true,那么返回true,如果b是false,返回false,其實不就是返回b了嗎。
a && b:如果a是false,那么b不管是true還是false,都返回false,因此不用判斷b了,這個時候剛好判斷到a,因此返回a。
如果a是true,那么就要在判斷b,和剛剛一樣,不管b是true是false,都返回b。
判斷邏輯,因為重置按鈕需要清空之前的style,這里用if語句也可以,但是比較繁瑣,所以采用了與門操作符,好處就是代碼量比較少。
this.index === btns.length - 1 && (content.style.cssText = "");
循環邏輯,因為5個按鈕的功能相似,故通過循環的到每個按鈕的屬性,並改變其對應的值。將
attribute及其對應的
style分別用數組儲存
1 function changeAttr(elem, attr, sty) { 2 elem.style[attr] = sty; 3 } 4 window.onload = function () { 5 var content = document.getElementById('content'); 6 var btns = document.getElementsByClassName("btn"); 7 var styles = ["200px", "200px", "red", "none", "block"]; 8 var attrs = ["width", "height", "background", "display", "display"]; 9 for( var i = 0; i < btns.length; i++){ 10 btns[i].index = i; 11 btns[i].onclick = function () { 12 this.index === btns.length - 1 && (content.style.cssText = ""); 13 alert(this.index);
alert(i);//5 14 changeAttr(content, attrs[this.index], styles[this.index]);//this.index改為i時功能無法實現,由於觸發onclick事件時,i已經完成遍歷值為5 15 } 16 } 17 }
對於上述代碼中的紅色問題,可用匿名函數(閉包)將每次遍歷的 i 值傳入函數,使其值始終保持在內存。
1 for(var i=0;i<btn.length;i++){ 2 (function(n){ 3 btn[n].onclick=function(){ 4 n===btn.length-1&&(show.style.cssText=""); 5 change(show,style[n],attr[n]); 6 } 7 })(i) 8 }