【问题标题】:jquery each function syntax updatejquery每个函数语法更新
【发布时间】:2012-01-03 14:52:45
【问题描述】:

我有许多信息面板共享同一个类,我希望使用 slideToggle 函数显示/隐藏它们。面板的内容是通过json动态拉进来的。所以我必须使用'live'而不是'bind'功能?以下代码将同时切换所有面板。我希望一次只切换一个面板。

$('a.sc-info-toggle').live('click', function() {
    $('.sc-info').slideToggle();
    return false;
});

非常感谢

【问题讨论】:

  • 所以更新你的最后一个问题...
  • 你的 HTML 是什么样的?
  • 这不是我回答的问题。我看到你在解决第一个问题后改变了你的问题。这不是问另一个问题的正确方法。我建议将此问题恢复为原始版本,接受您的一个可以解决您的问题的答案,然后提出另一个与此问题相关的问题。

标签: javascript jquery


【解决方案1】:

您不必使用.each(),因为jQuery 默认将您的函数应用于匹配的元素,并且您必须将return false; 放在发生点击事件的位置。所以这可能是你想要做的:

$('a.sc-info-toggle').live('click', function(event) {
  $('.sc-info').slideToggle();
  return false;
});

【讨论】:

    【解决方案2】:

    您从 .each() 回调中返回 false,而不是从 .live() 回调中返回:

    $('a.sc-info-toggle').each(function(){ 
        $(this).live('click', function(event) {
            $('.sc-info').slideToggle();
            return false;
        });         
    });
    

    根据文档,从 .each() 回调返回 false:

    我们可以在特定的迭代中打破 $.each() 循环,方法是 回调函数返回假。返回非 false 与 a 相同 for 循环中的 continue 语句;它会立即跳到下一个 迭代。

    并且从.live 回调中返回 false 基本上取消了底层事件的默认操作。

    顺便说一句,.live() 现在已弃用,您应该在旧版本中使用 .on()(在 jQuery 1.7+ 中)和 .delegate()

    【讨论】:

      【解决方案3】:

      live 已弃用。你想改用on

       $(document).on('click', 'a.sc-info-toggle', function() {
          $('.sc-info').slideToggle();
          return false;
       });
      

      您尚未说明单击的锚点与您要滑动的面板之间的关系。如果面板就在锚点旁边,这应该可以工作:

       $(document).on('click', 'a.sc-info-toggle', function() {
          $(this).next('.sc-info').slideToggle();
          return false;
       });
      

      理想情况下,尝试识别某个容器(例如,id 为 foo 的 div),它将始终包含所有这些锚点,然后选择 that 而不是 document

       $("#foo").on('click', 'a.sc-info-toggle', function() {
          $('.sc-info').slideToggle();
          return false;
       });
      

      这可能会更有效率,因为您不会听到文档上发生的每一次点击,而只会听到foo 内部发生的点击。

      【讨论】:

      • 您还需要防止默认单击锚点而不是返回 false。它们都可以工作,但一个比另一个更好。
      • @GregPettit - 你确定吗?我认为从 jQuery 处理程序返回 false 防止默认的标准方法。
      • @AdamRackis 我真的应该保留几个源链接来支持我的声明,所以不,我不能说我 100% 确定。当然很多在野外和 jQuery 自己的网站上的例子都有return false,但这更多的是出于习惯而不是良好的实践。我的理解是返回 false 将允许事件冒泡(在最后返回 false 之前)。防止默认将阻止事件甚至冒泡,从而提高性能。另外,我觉得它更优雅:event.preventDefault() 肯定是明确的。 ;-) 只需将事件传递给函数。
      • @Greg - 你有got it backwards :) - return false 两者都做,preventDefault 只会阻止默认操作。 (要停止冒泡而不返回 false,您还必须调用 stopPropagation() 或为 IE 设置 cancelBubble = true
      • @AdamRackis 是的,它似乎。我有一种提高知识的愉快感觉……谢谢!
      【解决方案4】:

      新年快乐, 伙计,你为什么要使用它真的不需要的每个循环,让它变得简单如下:

      $('a.sc-info-toggle').live('click', function(event) {
      
      // $(this) will return the link which is clicked
      
          $(this).find('.sc-info').slideToggle();
             return false;
      
        });
      

      【讨论】:

      • 嗨,谢谢,如果我按照你说的那样做,每个带有 .sc-info 类的面板都会同时切换。还有其他想法吗?
      【解决方案5】:

      代替:

      $('.sc-info').slideToggle();
      

      您需要定位与切换开关相关的 .sc-info。

      例如,如果您的 html 看起来像这样:

      <a href="#" class="sc-info-toggle">Toggle</a>
      <div class="sc-info">
          <p>Content</p>
      </div>
      

      你可以用这个:

      $('a.sc-info-toggle').live('click', function() {
          $(this).next('.sc-info').slideToggle();
          return false;
       });
      

      如果切换位于内容内部,则使用 .parent() 而不是 .next()。

      希望有帮助:)

      【讨论】:

      • 感谢您的帮助。我尝试了你的建议,但没有喜悦。 html 是
      • ​Info​​
      • ​。 ...
    • 试试 $(this).parent().next('.sc-info').slideToggle();
    • 成功了。感谢ridecar2 和大家的帮助。
    • 【解决方案6】:

      命令return false; 只会退出.each 循环。 此外,在.live 中,您可以滑动切换该页面上的所有 .sc-info,而不仅仅是与您单击的按钮相关的那个。

        $('a.sc-info-toggle').live('click', function(event) {
          $(**the.div.you.need**).slideToggle()
        });
      

      【讨论】:

        【解决方案7】:

        live 将事件处理程序绑定到匹配选择器的元素,无论它们现在存在还是将来存在。所以在这里使用每个有点愚蠢。这也是一样的:

        $('a.sc-info-toggle').live('click', function(event) {
            $('.sc-info').slideToggle()
            return false;
        });
        

        【讨论】:

          【解决方案8】:

          你不需要each(),jQuery 会处理它,因为选择器会返回一个数组,return false 也应该在live() 回调中:

          $('a.sc-info-toggle').live('click', function() {
              $('.sc-info').slideToggle();
              return false;
          });         
          

          但是,如果您使用的是最新版本的 jQuery (1.7+),请使用 .on() 方法。否则,我建议尽可能使用.delegate(),因为它更有效。见https://stackoverflow.com/a/4579154/978306

          【讨论】:

            【解决方案9】:

            好的,这取决于您的 HTML 的外观,但目前您的目标是使用 .sc-info 类的所有元素,而不仅仅是切换链接附近的元素。

            它应该看起来像这样(同样,取决于您的标记):

            $('a.sc-info-toggle').live('click', function(event) {
              $(this).parent().find('.sc-info').slideToggle();
            });
            

            这会在这样的结构中找到面板:

            <div>
                <a class="sc-info-toggle">Toggle 1</a>
                <div class="sc-info">Panel 1</div>
            </div>
            
            <div>
                <a class="sc-info-toggle">Toggle 2</a>
                <div class="sc-info">Panel 2</div>
            </div>
            

            【讨论】:

              【解决方案10】:

              这应该可以(我猜手柄是滑动元素的子元素):

              $('a.sc-info-toggle').live('click', function() {
                $(this).parents('.sc-info').slideToggle();
                return false;
              });
              

              【讨论】:

                猜你喜欢
                相关资源
                最近更新 更多
                热门标签