2013-04-25 137 views
2

我有這樣的一些HTML:顯示/隱藏不能正常工作?

 <div class="clearfix wanted_item"> 
      <div class="clearfix"> 
       <div class="float_right"><img src="images/pin.png"></div> 
       <div class="float_right"> 
        <h3>a</h3> 
        <div>abcd</div> 
       </div> 
      </div> 
      <div class="float_right more_details" style="display: block;"> 
            <ul> 
        <li>some list</li>     </ul> 
       <div class="application_link">      
        <a class="orange_button" href="volunteer.php?volunteer_type=1"><span>apply</span></a> 
       </div> 
      </div> 
      <a class="float_left clearfix more_details_link" href="javascript:void(0);">Show details</a> 
     </div> 

而且我有這樣的jQuery代碼:

$(".less_details_link").click(function() { 
    $(this).parent().children(".more_details").slideUp(500); 
    $(this).text("Show details"); 
    $(this).removeClass('less_details_link'); 
    $(this).addClass('more_details_link'); 
}); 
$(".more_details_link").click(function() { 
    $(this).parent().children(".more_details").slideDown(500); 
    $(this).text("Hide details"); 
    $(this).removeClass('more_details_link'); 
    $(this).addClass('less_details_link'); 
}); 

出於某種原因,當我點擊「顯示」鏈接能正常工作,我也可以看到,它將類更改爲less_details_link,但第二個click()函數無法在沒有任何輸出到控制檯日誌的情況下運行。當我點擊「隱藏詳細信息」鏈接時,它只是沒有做任何事情。

+2

你可以把這個在[jsfiddle](http://jsfiddle.net/)給我們嗎? – 2013-04-25 21:30:39

回答

3

jsFiddle Demo

這是因爲當你添加一個類的元素,它不與它帶來的事件處理程序,除非你對(jQuery API: on)使用的事件處理程序

$("body").on("click",".less_details_link",function() { 
$(this).parent().children(".more_details").slideUp(500); 
$(this).text("Show details"); 
$(this).removeClass('less_details_link'); 
$(this).addClass('more_details_link'); 
}); 
$("body").on("click",".more_details_link",function() { 
$(this).parent().children(".more_details").slideDown(500); 
$(this).text("Hide details"); 
$(this).removeClass('more_details_link'); 
$(this).addClass('less_details_link'); 
}); 
+0

這很好,謝謝!只是好奇爲什麼不Kacey的解決方案工作,你的呢? – 2013-04-25 21:35:11

+2

@hoverhand - Kacey沒有使用事件代表團。當以這種形式使用時,'on'只會附加類似於原始方法的點擊事件。當在這種形式中使用'on'時,它會將事件委託出去,這就允許將來的元素擁有那個事件處理器。 [jQuery API:on](http://api.jquery.com/on/) – 2013-04-25 21:36:22

+0

@hoverhand他是對的。我回答的太快了,我沒有想到這一點。 – 2013-04-25 21:38:17

1

這是比它需要更復雜的方式。它的一個鏈接,只是給它一個額外的類來表示是否擴展或不擴展,然後做一個簡單的if函數來確定是否激活。

謝謝@Kacey對.slideToggle().toggleClass()的推薦,更簡單一些。

$(".more_details_link").click(function() { 
    var $this = $(this); 

    $this 
     .toggleClass('active') 
     .prev() 
     .stop() 
     .slideToggle(500); 

    $this.hasClass('active') ? $this.text("Show details") : $this.text("Hide details"); 
}); 

編輯爲使用三元if功能的文本。

+0

'.toggleSlide()'和'.toggleClass()'怎麼樣?這會使它更加複雜。 – 2013-04-25 21:34:37

+0

良好的通話,有很多清理我沒有考慮到它 – PlantTheIdea 2013-04-25 21:35:39

+1

這麼多的代碼效率,一旦它的工作原理沒有一度關心速度。天啊。 – PlantTheIdea 2013-04-25 21:47:26

-1

當你的jQuery加載時,沒有.less_details_link可用,所以它不能掛鉤.click()函數。你想要做的是設置你的功能,像這樣:

$(".less_details_link").on("click", function() { ... } 
$(".more_details_link").on("click", function() { ... } 
+0

這也行不通。特拉維斯J有正確的語法。 – OptimusCrime 2013-04-25 21:36:42