2012-08-13 84 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