【问题标题】:what could cause html and script to behave different across iterations of a for loop?什么可能导致 html 和脚本在 for 循环的迭代中表现不同?
【发布时间】:2017-02-02 00:14:49
【问题描述】:

我正在尝试构建一个侧边导航栏,其中列出了类别,单击类别后,相应的子类别子列表会显示在该类别的正下方。如果再次点击该类别,子列表会收缩。

所以我正在跨类别对象运行一个循环。在这个外部循环中,我包含一个用于列出子类别的内部循环和一个隐藏子菜单并仅在单击类别时才进行滑动切换的脚本。我正在使用 django 模板标签为我的 html 元素动态分配类名,并在脚本中引用它们。所以毕竟 for 循环迭代,有一个子类别列表和每个类别的专用脚本,它们具有唯一的类名,因此没有重叠的机会。所以奇怪的是,这对大多数类别都非常有效,但有些类别及其子菜单仍然打开,当点击该类别时,页面会重新加载。

我不明白,什么会导致完全相同的代码(在 for 循环中运行)表现如此不同?

这是我的代码:

{% load staticfiles %}
{% load i18n pybb_tags forumindexlistbycat %}
{% catindexlist as catindexlisted %}

{% block body %}<div class="col-sm-12 col-md-12 col-xs-12 col-lg-12 body-container leftsidenavigator" style="margin-top:15px;">
    <div class="col-sm-12 col-md-12 col-xs-12 col-lg-12 leftsidenavigator-inner" style="padding:0px;">
         <h2><center>Categories</center></h2>
             <ul class="catindexlist catlistcat nav-collapse89">
                   {% for category in catindexlisted %}
                         <li class="catindexlistitem category-name{{category.name}}{{category.name}}" style="font-weight:600;padding-right:20px;"><a href="">{{category.name}}</a></li>
                         <ul style="padding:0px;" class="nav-collapse88">
                         {% for forum in category|forumindexlistbycat %}
                               <li class="catlistforum{{category.name}}{{category.name}} forum-name" style="padding-right:10px;"><a href="{{ forum.get_absolute_url }}">{{forum.name}}</a></li>
                         {% endfor %}</ul><script>

                         $(function() {
                              $(".catlistforum{{category.name}}{{category.name}}").hide();
                                    $(".category-name{{category.name}}{{category.name}} a").click(function(e) {
                                     e.preventDefault();
                                     $(".catlistforum{{category.name}}{{category.name}}").slideToggle();
                                          if(!($(this).parent('li').siblings('div').children('ul').children('div').is(":visible"))){
                                              $(this).parent('li').siblings('div').children('ul').children('div').is(":visible").slideToggle();
                                          }});
                                      })
                                </script>
                           {% endfor %}
                           </ul>
                      </div>
                      </div>
                  {% endblock %}
     {% block theme_script %}<script src="{% static "pinax/js/theme.js" %}"></script>{% endblock %}

【问题讨论】:

  • 能否提供一个最小的代码示例?
  • 请提供您的 HTML 代码
  • 无效类别名称中的任何模式?也许是空格,而不是英文字符?请注意,您需要确保它是在这里使用的有效字符串,例如$(".catlistforum{{category.name}}{{category.name}}").我觉得你应该用PK代替名字。
  • 请提供产生的 HTML 代码示例,或可以看到此效果的页面的链接。正如@trinchet 所说,可能存在导致选择器/类名冲突(或名称包含无效字符,或为空等)的模式。

标签: javascript jquery python django django-templates


【解决方案1】:

最可能的原因是使用 {{category.name}} 作为类名。

代码 sn-p 没有显示 category.name 接受的值,我猜它可以是用户输入吗? 请参阅属性值部分中的naming rules 什么对类名有效。

可以使用模板标签slugify ({{category.name|slugify}}) 解决,但我的建议是尝试重新设计解决方案。

【讨论】:

    【解决方案2】:

    类别名称是否有可能包含空格?

    提示:您没有在代码中使用良好实践。 IMO 您应该在 forloop 之外获取您的 javascript 代码并删除 {{ category_name }} 类。 catindexlistitem 点击应该将 hidden 类(我注意到你使用引导程序)切换到它的子 ul。

    通过添加更通用的事件侦听器,您可以简化代码,并通过使用 css 来提高性能。如果您想添加效果,您仍然可以使用 css3。

    【讨论】:

      【解决方案3】:

      尝试在外部 for 循环之后编写 javascript 函数,有时这可能会重叠和重定向。并尝试在“li”内的类别名称之间提供空格。

      【讨论】:

        【解决方案4】:

        我的建议是通过创建一个函数来处理所有点击来清理你的 JS。您已经在使用点击类,那么为什么不让一个函数处理所有点击呢?

        <script>
          $(function() {
            // Hide all elements with a class starting with catlistforum
            $('[class^="catlistforum"]').hide();
        
            // Assign clicks to all links whose parent has a class starting with catlistforum
            // (Though why are you hiding the parents? How will they click the links?)
            $('[class^="catlistforum"] a').on("click", function(e) {
              e.preventDefault();
        
              // Delegate slideToggle to each click target
              $(e.target).slideToggle();
        
              // This seems redundant, but hopefully it will behave the way you want it to behave
              if(!($(e.target).parent('li').siblings('div').children('ul').children('div').is(":visible"))) {
                $(e.target).parent('li').siblings('div').children('ul').children('div').is(":visible").slideToggle();
              }
            });
          })
        </script>
        

        当然,如果我是你,我只会定义两个新类(例如 catlistforum-hidecatlistforum-toggle),我将分别将它们应用于我想要隐藏和切换的所有元素。

        【讨论】:

          猜你喜欢
          • 2015-07-15
          • 2017-05-02
          • 2018-03-16
          • 1970-01-01
          • 1970-01-01
          • 2014-03-16
          • 2016-06-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多