什么可能导致html和脚本在for循环的迭代中表现不同?

时间:2016-09-24 04:39:27

标签: javascript jquery python django django-templates

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

所以我在类别对象中运行循环。在这个外部循环中,我包括一个内部循环来列出子类别和一个隐藏子菜单的脚本,并且只在单击一个类别时才滑动它。我使用django模板标签为我的html元素动态分配类名,并在脚本中引用它们。因此,在循环迭代之后,每个类别都有一个子类别列表和一个专用脚本,它们具有唯一的类名,因此没有重叠的可能性。所以奇怪的部分是,这适用于大多数类别,但是一些类别及其子菜单保持打开状态,当点击页面重新加载的类别时。

我没有得到它,是什么导致完全相同的代码(在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 %}

4 个答案:

答案 0 :(得分:1)

类别名称是否包含空格?

只是提示:您没有在代码中使用良好实践。 IMO你应该在forloop之外获取你的javascript代码并删除{{ category_name }}类。 点击catindexlistitem应该切换隐藏类(我注意到你使用bootstrap)给它的孩子ul。

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

答案 1 :(得分:1)

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

代码段没有显示category.name接受的值,我的猜测是用户输入? 请参阅“属性值”部分中的naming rules。对于类名有效。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我的建议是通过使用单个函数来处理所有点击来清理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),我将分别应用于我想要隐藏和切换的所有元素。< / p>