想問各位大大
當我按下Next按鍵後
#P0隱藏,#P1顯示(這樣
而當我按下Prev按鍵後
#P1隱藏,#P0顯示(這樣
以下是我的html、js程式碼
我不知道哪個地方出錯
目前是呈現按下按鍵後沒有動靜的狀態
想問是我的程式碼錯誤的地方在哪?
也想知道有沒有其他的寫法可以呈現這樣的效果
感謝各位(; ・д・´)(; ・
д・´)(; ・`д・´)
html
<div id="P0">
<p>0</p>
<button class="next" data-idn="0">Next</button>
</div>
<div style="display:none;" id="P1">
<p>1</p>
<button class="prev" data-idp="1">Prev</button>
<button class="next" data-idn="1">Next</button>
</div>
<div style="display:none;" id="P2">
<p>2</p>
<button class="prev" data-idp="2">Prev</button>
<button class="next" data-idn="2">Next</button>
</div>
<div style="display:none;" id="P3">
<p>3</p>
<button class="prev" data-idp="3">Prev</button>
<button class="next" data-idn="3">Next</button>
</div>
<div style="display:none;" id="P4">
<p>4</p>
<button class="prev" data-idp="4">Prev</button>
</div>
js
$(function () {
$('.next').on('click', function () {
var idn = $(this).attr('data-idn');
var none_div1 = $('#P'+idn);
var next_div = $('#P'+(idn+1));
none_div1.style.display="none";
next_div.style.display="";
} );
$('.prev').on('click', function () {
var idp = $(this).attr('data-idp');
var none_div2 = $('#P'+idp);
var prev_div = $('#P'+(idp-1));
none_div2.style.display="none";
prev_div.style.display="";
} );
});
chrome、firefox、edge 都可以按 F12 開啟開發者工具
到 console(主控台)分頁那邊可以看到錯誤訊息
可以利用這邊的資訊除錯
錯誤訊息
Uncaught TypeError: none_div1.style is undefined
這表示 var idn = $(this).attr('data-idn');
沒有拿到東西
回頭檢查 html 會看到第一個 Next Button 的 data-idn
誤寫成 data-idx
了
修正上一個錯誤後再執行,會跑出
Uncaught TypeError: none_div1.style is undefined
試著列印 none_div1
var none_div1 = $('#P'+idn);
console.log(none_div1); //加上這行
會看到這是一個 Object 而不是 html 元素
這是初學常忽略的點
jquery object 跟 html element 是不同的(學習時務必注意現在操作的是何者)
要從 jquery object 取得的 html element
可以使用 .get(index)
none_div1.get(0).style.display="none";
next_div.get(0).style.display="";
再次執行後出現錯誤
Uncaught TypeError: next_div.get(...) is undefined
試著列印
var next_div = $('#P'+(idn+1));
console.log('#P'+(idn+1), next_div);
會發現 '#P'+(idn+1)
是 #P01 而不是 #P1
這常發生在沒注意到 idn 是字串
所以 idn + 1 變成字串相加了
所以前面一開始取 idn 時應該要轉成整數
var idn = $(this).attr('data-idn');
idn = parseInt(idn, 10);
感謝 淺水員大大
後來是了兩種方法(雖然是一樣意思哈哈哈哈)
第一種是上述直接修改style
$(function () {
$('.next').on('click', function () {
var idn = $(this).attr('data-idn');
idn = parseInt(idn, 10);
var none_div1 = $('#P'+idn);
var next_div = $('#P'+(idn+1));
none_div1.get(0).style.display="none";
next_div.get(0).style.display="";
} );
$('.prev').on('click', function () {
var idp = $(this).attr('data-idp');
idp = parseInt(idp, 10);
var none_div2 = $('#P'+idp);
var prev_div = $('#P'+(idp-1));
none_div2.get(0).style.display="none";
prev_div.get(0).style.display="";
} );
});
第二種是在CSS裡面加入
.none{
display:none;
}
然後div程式碼變成
<div class="none" id="P1"> ...
js
$(function () {
$('.next').on('click', function () {
var idn = $(this).attr('data-idn');
idn = parseInt(idn, 10);
var none_div1 = $('#P'+idn);
var next_div = $('#P'+(idn+1));
none_div1.addClass("none");
next_div.removeClass("none");
} );
$('.prev').on('click', function () {
var idp = $(this).attr('data-idp');
idp = parseInt(idp, 10);
var none_div2 = $('#P'+idp);
var prev_div = $('#P'+(idp-1));
none_div2.addClass("none");
prev_div.removeClass("none");
;
} );
});
補充一下之前回的
其實 jquery object 有 .css() 可以用
none_div1.css('display', 'none');
next_div.css('display', '');
再來應該可以開始考慮用其它結構的方式來寫了
各種方式都可以試試看
我原本只是想說先學會除錯
我比較懶,修改成這樣隨意參考
.html
<section id="P0">
<p>0</p>
<button class="next" data-idn="0">Next</button>
</section>
<section style="display: none" id="P1">
<p>1</p>
<button class="prev" data-idp="1">Prev</button>
<button class="next" data-idn="1">Next</button>
</section>
<section style="display: none" id="P2">
<p>2</p>
<button class="prev" data-idp="2">Prev</button>
<button class="next" data-idn="2">Next</button>
</section>
<section style="display: none" id="P3">
<p>3</p>
<button class="prev" data-idp="3">Prev</button>
<button class="next" data-idn="3">Next</button>
</section>
<section style="display: none" id="P4">
<p>4</p>
<button class="prev" data-idp="4">Prev</button>
</section>
.js
let currIndex = 0;
const $allSection = $('section');
$(".next").on("click", function () {
$allSection.css('display', 'none');
$($allSection[++currIndex]).css('display', 'block');
});
$(".prev").on("click", function () {
$allSection.css('display', 'none');
$($allSection[--currIndex]).css('display', 'block');
});
想問問 vicisgood 大大
我想要把Prev跟Next按鈕提出
然後把P0的Prev隱藏
然後把P4的Next改成Review
目前程式碼如下
是可以運作的
但想問問有沒有更好的寫法
謝謝
.html
<section id="P0">
<p>0</p>
</section>
<section style="display: none" id="P1">
<p>1</p>
</section>
<section style="display: none" id="P2">
<p>2</p>
</section>
<section style="display: none" id="P3">
<p>3</p>
</section>
<section style="display: none" id="P4">
<p>4</p>
</section>
<button class="prev" style="display:none;" id="prev">Prev</button>
<button class="next" id="next">Next</button>
.js
let currIndex=0;
const $allSection = $('section');
var next = document.getElementById("next");
var prev = document.getElementById("prev");
$(".next").on("click", function () {
$allSection.css('display', 'none');
currIndex++;
if(currIndex<5){
prev.style.display="";
$($allSection[(currIndex-1)]).css('display', 'none');
$($allSection[currIndex]).css('display', 'block');
next.innerHTML="Next";
if(currIndex<5 && currIndex==4){
next.innerHTML="Review";
prev.style.display="";
$($allSection[(currIndex-1)]).css('display', 'none');
$($allSection[currIndex]).css('display', 'block');
}
}
else{
next.innerHTML="Next";
prev.style.display="none";
$($allSection[4]).css('display', 'none');
$($allSection[0]).css('display', 'block');
currIndex=0;
}
});
$(".prev").on("click", function () {
$allSection.css('display', 'none');
currIndex--;
if(currIndex>=0){
next.innerHTML="Next";
$($allSection[(currIndex-1)]).css('display', 'none');
$($allSection[currIndex]).css('display', 'block');
if(currIndex<5 && currIndex==0){
next.innerHTML="Next";
prev.style.display="none";
$($allSection[(currIndex-1)]).css('display', 'none');
$($allSection[currIndex]).css('display', 'block');
}
}
});
.html新增一個Review按鈕
.js
let currIndex = 0;
const $allSection = $("section");
const lastIndex = $allSection.length - 1;
$("#next").on("click", function () {
if (currIndex >= lastIndex) {
return;
}
++currIndex;
refresh();
});
$("#prev").on("click", function () {
if (currIndex <= 0) {
return;
}
--currIndex;
refresh();
});
$("#review").on("click", function () {
currIndex = 0;
refresh();
});
function refresh() {
refreshContent();
refreshBtn();
}
function refreshContent() {
$allSection.hide();
$($allSection[currIndex]).show();
}
function refreshBtn() {
if (currIndex === 0) {
$("#prev").hide();
} else {
$("#prev").show();
}
if (currIndex === lastIndex) {
$("#next").hide();
$("#review").show();
} else {
$("#next").show();
$("#review").hide();
}
}