2012-08-13 83 views
0

我從視圖動態生成下表。我需要在class=heading上添加點擊事件才能顯示或隱藏class=contentjQuery slideToggle()不工作

<table> 
<thead> 
    <tr> 
     <th class="thead">Function</th> 
     <th class="thead"">Type</th> 
     @foreach (var item in Model.PackageNames) 
     { 
      <th class="thead"> 
       @item 
      </th> 
     } 
    </tr> 
</thead> 
<tbody> 
    @foreach (var item in Model.PrivilegeGroups) 
    { 
     <tr> 
      <td colspan="50"> 
       <div class="heading"> 
        @item.Name 
       </div> 
      </td> 
     </tr> 
     <text> 
      <p class="content"> 
       @foreach (var privilege in item.Privileges.Values) 
       { 
        <tr> 
         <td> 
          @privilege.Name 
         </td> 
         <td> 
          @privilege.Type.ToString() 
         </td> 
         @foreach (var package in privilege.Packages) 
         { 
          <td> 
           @package.AccessLevel.ToString() 
          </td> 
         } 
        </tr> 
       } 
      </p> 
     </text> 
    } 
</tbody> 
</table> 

這是我使用的jQuery,但它不起作用。

<script type="text/javascript"> 
    $(document).ready(function() { 
     $(".heading").click(function() { 
      $(this).next(".content").slideToggle(500); 
     }); 
    }); // -- End Ready 
</script> 

然而,$('.content').slideToggle();做的工作,與切換所有class=content元素。我只想隱藏下一個元素。我如何使它工作?

謝謝。

+0

您的HTML格式不正確且無效。在'tbody'中,你只能有一個'tr',裏面有'th'或'td'。 – ahren 2012-08-13 21:39:10

回答

0

非常感謝您@Garrett Fogerlie和@saganbyte,我終於解決它通過移動從<td>class=heading<tr>$(this).next(".content").slideToggle(500);作品吧!

@foreach (var item in Model.PrivilegeGroups) { 
     <tr class="heading"> 
      <td colspan="50"> 
        @item.Name 
      </td> 
     </tr> 
     <p class="content"> 
      @foreach (var privilege in item.Privileges.Values) 
      { 
       <tr> 
        <td class="thead"> 
         @privilege.Name 
---Rest of the code here 
0

首先,因爲裏面只有<tbody><th><tr><td>是允許的,我覺得你應該<tbody>看起來是這樣的:

<tbody> 
    @foreach (var item in Model.PrivilegeGroups) 
    { 
     <tr> 
      <td colspan="50" class="heading"> 
       @item.Name 
      </td> 
     </tr> 
     <tr class="content">   
      @foreach (var privilege in item.Privileges.Values) 
      { 
       <td> 
        @privilege.Name 
       </td> 
       <td> 
        @privilege.Type.ToString() 
       </td> 
       @foreach (var package in privilege.Packages) 
       { 
        <td> 
         @package.AccessLevel.ToString() 
        </td> 
       } 
      } 
     </tr> 
    } 
</tbody> 

我不是很好用JavaScript,但我想你可以嘗試用$(this).closest(".content").slideToggle(500);$(this).next("p").slideToggle(500);

更換$(this).next(".content").slideToggle(500);如果這些不工作,你可以嘗試使用一種獨特的id代替的像這樣:

<tbody> 
    @{ int i = 0; } 
    @foreach (var item in Model.PrivilegeGroups) 
    { 
     <tr> 
      <td colspan="50" class="heading"> 
       @item.Name 
      </td> 
     </tr> 
     <tr id="[email protected]">   
      @foreach (var privilege in item.Privileges.Values) 
      { 
       <td> 
        @privilege.Name 
       </td> 
       <td> 
        @privilege.Type.ToString() 
       </td> 
       @foreach (var package in privilege.Packages) 
       { 
        <td> 
         @package.AccessLevel.ToString() 
        </td> 
       } 
      } 
     </tr> 
    @{ i++ } 
    } 
</tbody> 

然後相應地更新您的JavaScript。

就像我說的,我不擅長javascript/jquery,希望這有助於。

0

你確定你的jquery代碼是在'數據加載/渲染頁面之後運行'嗎?

你可以嘗試'生活',而不是'點擊'?因此,這將改變你的jQuery代碼到

<script type="text/javascript"> 
    $(document).ready(function() { 
     $(".heading").live('click', function() { 
      $(this).next(".content").slideToggle(500); 
     }); 
    }); // -- End Ready 
</script> 

一種方法來檢查是運行在Firebug jQuery代碼(如果FF)一旦頁面加載,看看你的作品,然後在更新代碼的腳本標籤相應地。

+0

我嘗試過,但仍然無法正常工作。在調試腳本,我看到錯誤接下來是未定義的!如Garrett Fogerlie所建議的,我還綁定了$(this).closest(「。content」),但仍然看到相同的錯誤。 – vindh123 2012-08-14 14:18:13

+1

.closest()正在使用的方式需要jQuery 1.6+。你能確認你使用的jQuery版本是1.6還是更高?我只是更新我使用最新的jquery版本,然後嘗試通過在加載數據後從Firebug控制檯(Firefox)運行它來達到目的。在控制檯中,我首先檢查是否能夠獲取所有的.heading標籤,然後在其上應用.live並測試它是否被觸發,然後嘗試以某種方式獲取.content項目或其他。這個練習會告訴我問題可能在哪裏。 – walmik 2012-08-14 18:12:35