![](/img/trans.png)
[英]Why is .addClass() and .removeClass() not working as expected?
[英]Why my addClass removeClass with event handler does not work as expected?
jQuery版本1.6
目標:當用戶點擊向下箭頭(展開expander-down
)時,顯示高級區域。 同樣明智的是,當用戶點擊上箭頭( expander-up
)時,隱藏高級區域。
問題:我認為使用下面的代碼實現起來很簡單。 單擊expander-up
,高級搜索區域按預期顯示,但是當我單擊expander-down
,沒有任何反應。
僅供參考,我使用圖像分割技術通過添加/刪除類(expandder-down,expandder-up)來交換箭頭的外觀。
JavaScript的:
$(".expander-down").unbind("click").click(function ()
{
$(this).addClass("expander-up").removeClass("expander-down");
$("#advanced-search").show();
});
$(".expander-up").unbind("click").click(function ()
{
$(this).addClass("expander-down").removeClass("expander-up");
$("#advanced-search").hide();
});
HTML
<a href='#'>
<span class='expander-down'></span>
</a>
<div id='advanced-search'>advanced!</div>
因為分配了click
處理程序的元素永遠不會更改。 即使用戶單擊擴展器,您也可以在其上保留相同的處理程序(向下或向上)。
我會像這樣重構它:
$(".expander-down, .expander-up").click(function() {
var $this = $(this);
$this.toggleClass("expander-down expander-up");
$("#advanced-search").toggle($this.hasClass("expander-down"));
return false; // Stops propagation and prevents default action
});
通過切換向下/向上狀態響應單擊,然后根據結果狀態顯示/隱藏搜索框。 我認為你的代碼在擴展器關閉時顯示它,所以這就是我上面所做的,但這對我來說並不是立即有意義的。 如果我誤讀,只需將hasClass
中的hasClass
expander-down
更改為hasClass
expander-up
。
問題在於.expander-up
在頁面加載中不存在,這意味着事件不會被綁定到您的范圍。
取消綁定所有點擊功能根本不是必需的。 此外,您可以將兩個函數合並為一個:
$(".expander").click(function(e) {
e.preventDefault(); // This avoids unwanted scrolling effect
$(this).toggleClass("expander-up expander-down");
$("#advanced-search").toggle();
});
toggleClass
將css類添加到元素(如果尚未設置),並刪除該類(如果已設置)。 toggle
執行相同但元素可見性。
你的HTML應該是這樣的:
<a href='#'>
<span class='expander expander-down'></span>
</a>
<div id='advanced-search'>advanced!</div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.