編程挑戰:tab切換
?<script type="text/javascript">
??? // JS實現選項卡切換
??? var tab=document.getElementById("tab");
??? var ul=tab.getElementsByTagName("ul")[0];
??? var li=ul.getElementsByTagName("li");
???
??? var content=tab.getElementsByTagName("div");
???
??? for(var i=0,len=li.length;i<len;i++)
??? {
???????? li[i].onclick=function()
???????? {
???????????? for(var n=0;n<len;n++)
???????????? {
???????????????? if(i==n)
???????????????? {
???????????????????? li[n].className = "now";
???????????????????? content[n].className = "";
???????????????? }
???????????????? else
???????????????? {
???????????????????? li[n].className = " ";
???????????????????? content[n].className = "hide";
???????????????? }
???????????? }
???????? }
??? }??? </script>
為什么無法切換?不對嗎?
2018-07-06
這樣寫的錯誤在哪里呢,首先頁面加載的時候,會把你這段js代碼擼了一邊,關鍵點在執行到了for循環里面,到底是安什么邏輯執行的,回到頁面上看看,發現3個li元素鼠標移上去,樣式都變成可點擊的樣式了,說明這段代碼li[i].onclick=function(){func1}起了作用,但是在沒有點擊的情況下,func1是不會執行的,點擊li元素的時候,才執行func1,再看看執行func1的邏輯:for 循環,里面一個if...else...判斷,if的判斷條件是i==n,這個時候的i是多少很關鍵,在最外面的for循環在頁面加載的時候就已經執行完畢了,循環第一遍的時候i=0;i<3;i++,執行for循環里面的代碼,第二遍i=1;i<3;i++,還是執行里面的代碼,第三邊i=2;i<3;i++,繼續執行里面的代碼,第四邊i=3,這個時候i不小于3了,然后條件看不成立,就不再執行這個for循環了,所以,里面的for循環永遠只會執行else部分(因為i=3)你可以測試下在點擊的時候alert(i),li[i].onclick=function(){func1;alert(i);}
所以才會出現提示答案里的oLis[i].index = i這樣一句代碼,頁面加載的時候外面的for循環就實時給每個li元素自定義了一個index屬性,并賦值i(也就是分別為0,1,2)。
還有一個解決方法我也說不太明白(我也是初學者),如果要用這個方法你要去了解一下閉包和立即執行函數,還有js的內存機制。具體寫法如下:
<script type="text/javascript">
? ? // JS實現選項卡切換
? ? var tab=document.getElementById("tab-list");
? ? var ul=tab.getElementsByTagName("ul")[0];
? ? var li=ul.getElementsByTagName("li");
? ? var content=tab.getElementsByTagName("div");
? ? for(var i=0,len=li.length;i<len;i++){
? ? (function(j){
? ? li[i].onclick=function()
? ? ? ? ?{
? ? ? ? ? ? ?for(var n=0;n<len;n++)
? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ?if(j==n)
? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ?li[n].className = "now";
? ? ? ? ? ? ? ? ? ? ?content[n].className = "";
? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ?else
? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ?li[n].className = " ";
? ? ? ? ? ? ? ? ? ? ?content[n].className = "hide";
? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ?}
? ? ? ? ?}
? ? })(i)
? ? }
? ? </script>
2018-05-23
if判斷哪把n改成this,因為我要指向到當前