編程挑戰(zhàn):tab切換
?<script type="text/javascript">
??? // JS實(shí)現(xiàn)選項(xiàng)卡切換
??? 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>
為什么無(wú)法切換?不對(duì)嗎?
2018-07-06
這樣寫(xiě)的錯(cuò)誤在哪里呢,首先頁(yè)面加載的時(shí)候,會(huì)把你這段js代碼擼了一邊,關(guān)鍵點(diǎn)在執(zhí)行到了for循環(huán)里面,到底是安什么邏輯執(zhí)行的,回到頁(yè)面上看看,發(fā)現(xiàn)3個(gè)li元素鼠標(biāo)移上去,樣式都變成可點(diǎn)擊的樣式了,說(shuō)明這段代碼li[i].onclick=function(){func1}起了作用,但是在沒(méi)有點(diǎn)擊的情況下,func1是不會(huì)執(zhí)行的,點(diǎn)擊li元素的時(shí)候,才執(zhí)行func1,再看看執(zhí)行func1的邏輯:for 循環(huán),里面一個(gè)if...else...判斷,if的判斷條件是i==n,這個(gè)時(shí)候的i是多少很關(guān)鍵,在最外面的for循環(huán)在頁(yè)面加載的時(shí)候就已經(jīng)執(zhí)行完畢了,循環(huán)第一遍的時(shí)候i=0;i<3;i++,執(zhí)行for循環(huán)里面的代碼,第二遍i=1;i<3;i++,還是執(zhí)行里面的代碼,第三邊i=2;i<3;i++,繼續(xù)執(zhí)行里面的代碼,第四邊i=3,這個(gè)時(shí)候i不小于3了,然后條件看不成立,就不再執(zhí)行這個(gè)for循環(huán)了,所以,里面的for循環(huán)永遠(yuǎn)只會(huì)執(zhí)行else部分(因?yàn)閕=3)你可以測(cè)試下在點(diǎn)擊的時(shí)候alert(i),li[i].onclick=function(){func1;alert(i);}
所以才會(huì)出現(xiàn)提示答案里的oLis[i].index = i這樣一句代碼,頁(yè)面加載的時(shí)候外面的for循環(huán)就實(shí)時(shí)給每個(gè)li元素自定義了一個(gè)index屬性,并賦值i(也就是分別為0,1,2)。
還有一個(gè)解決方法我也說(shuō)不太明白(我也是初學(xué)者),如果要用這個(gè)方法你要去了解一下閉包和立即執(zhí)行函數(shù),還有js的內(nèi)存機(jī)制。具體寫(xiě)法如下:
<script type="text/javascript">
? ? // JS實(shí)現(xiàn)選項(xiàng)卡切換
? ? 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,因?yàn)槲乙赶虻疆?dāng)前