2016-09-24 18 views
10

Tôi đang cố gắng xây dựng thanh điều hướng bên nơi danh mục được liệt kê và khi nhấp vào danh mục, danh sách phụ tương ứng của các danh mục con được hiển thị ngay bên dưới danh mục. Và nếu danh mục được nhấp một lần nữa, danh sách các hợp đồng phụ.điều gì có thể khiến html và tập lệnh hoạt động khác nhau qua các lần lặp của vòng lặp for?

Vì vậy, tôi đang chạy vòng lặp trên các đối tượng danh mục. Bên trong vòng lặp bên ngoài này, tôi bao gồm một vòng lặp bên trong để liệt kê các danh mục phụ và một tập lệnh ẩn trình đơn phụ và chỉ trượt nó khi một danh mục được nhấp. Tôi đang sử dụng thẻ mẫu django để tự động gán tên lớp cho các phần tử html của tôi và cũng có thể tham chiếu đến chúng trong tập lệnh. Vì vậy, sau khi tất cả cho lặp vòng lặp, có một danh sách các tiểu thể loại và một kịch bản dành riêng cho mỗi thể loại và họ có tên lớp duy nhất để không có cơ hội của một chồng chéo. Vì vậy, phần lạ là, điều này hoạt động hoàn hảo cho hầu hết các loại, nhưng một số các loại và menu phụ của họ vẫn mở và khi nhấp vào thể loại trang tải lại.

Tôi không hiểu, điều gì có thể gây ra cùng mã chính xác (chạy trong vòng lặp for) để hoạt động khác đi?

Đây là mã của tôi:

{% 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 %} 
+1

Bất kỳ cơ hội nào bạn có thể cung cấp mẫu mã tối thiểu? – TomLingham

+1

Vui lòng cung cấp Mã HTML của bạn –

+1

Bất kỳ mẫu nào trong tên của danh mục không hoạt động? có lẽ không gian, không phải ký tự tiếng anh? Lưu ý rằng bạn cần phải chắc chắn đó là chuỗi hợp lệ được sử dụng tại đây, ví dụ: '$ (". catlistforum {{category.name}} {{category.name}} ").' Tôi nghĩ bạn nên sử dụng PK thay vì tên. – trinchet

Trả lời

1

Nguyên nhân có thể xảy ra nhất là sử dụng {{category.name}} cho tên lớp.

Đoạn mã không hiển thị giá trị nào được chấp nhận cho category.name và dự đoán của tôi là nó có thể là đầu vào của người dùng không? Xem naming rules trong phần Thuộc tính Giá trị những gì hợp lệ cho tên lớp.

Có thể giải quyết bằng cách sử dụng thẻ mẫu slugify ({{category.name | slugify}}) nhưng đề xuất của tôi là thử thiết kế lại giải pháp một chút.

1

Có bất kỳ cơ hội mà tên của category chứa dấu cách?

Chỉ mẹo: Bạn không sử dụng thực tiễn tốt trong mã của mình. IMO bạn sẽ nhận được mã javascript của mình bên ngoài vòng kết nối và xóa các lớp {{ category_name }}. catindexlistitem khi nhấp chuột phải chuyển đổi ẩn lớp (tôi nhận thấy bạn sử dụng bootstrap) cho con của nó là ul.

Bằng cách thêm trình xử lý sự kiện chung chung hơn, bạn đơn giản hóa mã của mình và bằng cách sử dụng css bạn cải thiện hiệu suất. Trong trường hợp bạn muốn thêm hiệu ứng bạn vẫn có thể với css3.

0

Hãy thử viết hàm javascript sau vòng ngoài cho vòng lặp, đôi khi điều này có thể trùng lặp và chuyển hướng. Và cũng thử cung cấp khoảng cách giữa các tên của danh mục bên trong "li".

0

Lời khuyên của tôi là dọn dẹp JS của bạn bằng cách thực hiện một chức năng duy nhất để xử lý tất cả các lần nhấp. Bạn đã sử dụng lớp học khi nhấp chuột, vậy tại sao không có một chức năng xử lý tất cả các nhấp chuột?

<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> 

Tất nhiên, nếu tôi là bạn, tôi sẽ chỉ định nghĩa hai lớp mới (ví dụ catlistforum-hidecatlistforum-toggle) mà tôi sẽ áp dụng cho tất cả các yếu tố tôi muốn che giấu và chuyển đổi, tương ứng.

Các vấn đề liên quan