页面重新加载时Django AJAX无限滚动错误

时间:2020-12-23 09:45:18

标签: javascript jquery django ajax

我正在尝试使用 django 和 jquery(Waypoint) 实现无限滚动。

我有一个分页为 5 的 ListView,但是当航点加载第二个页面时,不再执行 AJAX 请求,因此我在 onAfterPageLoad 上添加了 AJAX 函数,这有助于将 AJAX 函数带回新加载的页面。

那很好,但是它给我的代码引入了一个错误,使最初加载的页面(第一页)不再能很好地执行 AJAX 功能。如果我刚刚加载了第三页,它会使第一页上的 AJAX 运行 3 次,并使第二页上的 AJAX 运行两次,依此类推,具体取决于已加载的页面数。

我不知道是否有任何很酷的方法可以实现这一点,因为我尝试只使用不带航点的 jquery,但仍然遇到与仅使用航点时遇到的错误相同的错误,从而导致错误。到目前为止,这有点棘手。

    {% extends "base.html" %}
    {% block content %}
    {% load static %}
    <div class="container" style="max-width:700px">
        <div class="px-3 pt-md-5 pb-md-4 mx-auto text-center">
            <h1 class="display-4">All Groups</h1>
            <p class="lead">List of groups</p>
        </div>
        <div class="">
            <div class="row infinite-container">
                {% for group in groups %}
                <div class="col-md-12 infinite-item">
                    <!-- <img class="img-fluid" src="https://picsum.photos/700"> -->
                    <a class="text-dark" href="{{ group.get_absolute_url }}">
                        <div class="card mb-4 box-shadow">
                            <div class="card-body">
                                <h2 style="font-size:18px;font-weight:bold;min-height:42px;">
                                    {{group.name|truncatechars:50}}</h2>
                                <div class="d-flex justify-content-between align-items-center">
                                    <small class="text-muted">{{group.owner}}</small>
                                    <small class="text-muted">{{group.date_created}}</small>
                                </div>

                                <p><a class='follow-btn' data-href='{{ group.get_group_follow_api_url }}' 
                                    data-likes='{{ page.likes.count }}'  
                                    href='{{ group.get_group_follow_url }}'>{{ group.follows.count }}
                                    
                                    {% if request.user.profile in group.follows.all %}
                                        Unfollow
                                    {% else %}
                                        Follow
                                    {% endif %}
                                </a></p>
                            </div>
                        </div>     
                    </a>
                </div>
                {% endfor %}
            </div>
            <!-- Comment for loading spinner -->
            {% comment %}
            <div class="d-flex d-none position-fixed" style="top:35vh;left:46vw">
              <button class="btn btn-primary loading">
                  <span class="spinner-border spinner-border-sm"></span>
                  Loading...
              </button>
          </div>
          {% endcomment %}
          <!-- End of comment for loading spinner -->
          
            <div class="row">
                <div class="col-12">
                    {% if page_obj.has_next %}
                    <a class="infinite-more-link" href="?page={{ page_obj.next_page_number }}"></a>
                    {% endif %}
                    </span>
                </div>
            </div>
        </div>
    </div>


    <script src="{% static "js/jquery.waypoints.min.js" %}"></script>
    <script src="/static/js/infinite.min.js"></script>
    <script>
        
      
        var infinite = new Waypoint.Infinite({
            element: $('.infinite-container')[0],
            

            offset: 'bottom-in-view',

            onBeforePageLoad: function () {
                $('.loading').show();
            },
            onAfterPageLoad: function () {
                $('.loading').hide();

                $(document).ready(function(){
         function updateText(btn, newCount, verb){
         btn.text(newCount + " " + verb)
     }
      
     $(".follow-btn").click(function(e){
       e.preventDefault()
       var this_ = $(this)
       var badge = this_.find('.unlike-update')
       var followUrl = this_.attr("data-href")
       var followCount = parseInt(this_.attr("data-follows")) | 0
       var addFollow = followCount + 1
       var removeFollow = followCount - 1
       if (followUrl){
          $.ajax({
           url: followUrl,
           method: "GET",
           data: {},
           success: function(data){
             console.log(data)
             var newFollows;
             if (data.followed){
                //  updateText(this_, addLike, "Unlike")
                //  updateText(this_, data.likescount, badge)
                 updateText(this_, data.followscount, "Unfollow")
             } else {
                //  updateText(this_, removeLike, "Like")
                 updateText(this_, data.followscount, "Follow")
                 // remove one like
             }
      
           }, error: function(error){
             console.log(error)
             console.log("error")
           }
         })
       }
      
     })
      })
        }})
       
      

    </script>



    {% include 'group/snippets/group_follow.html' %}
    {% endblock %}
    {% extends "base.html" %}
    {% block content %}
    {% load static %}
    <div class="container" style="max-width:700px">
        <div class="px-3 pt-md-5 pb-md-4 mx-auto text-center">
            <h1 class="display-4">All Groups</h1>
            <p class="lead">List of groups</p>
        </div>
        <div class="">
            <div class="row infinite-container">
                {% for group in groups %}
                <div class="col-md-12 infinite-item">
                    <!-- <img class="img-fluid" src="https://picsum.photos/700"> -->
                    <a class="text-dark" href="{{ group.get_absolute_url }}">
                        <div class="card mb-4 box-shadow">
                            <div class="card-body">
                                <h2 style="font-size:18px;font-weight:bold;min-height:42px;">
                                    {{group.name|truncatechars:50}}</h2>
                                <div class="d-flex justify-content-between align-items-center">
                                    <small class="text-muted">{{group.owner}}</small>
                                    <small class="text-muted">{{group.date_created}}</small>
                                </div>

                                <p><a class='follow-btn' data-href='{{ group.get_group_follow_api_url }}' 
                                    data-likes='{{ page.likes.count }}'  
                                    href='{{ group.get_group_follow_url }}'>{{ group.follows.count }}
                                    
                                    {% if request.user.profile in group.follows.all %}
                                        Unfollow
                                    {% else %}
                                        Follow
                                    {% endif %}
                                </a></p>
                            </div>
                        </div>     
                    </a>
                </div>
                {% endfor %}
            </div>
            <!-- Comment for loading spinner -->
            {% comment %}
            <div class="d-flex d-none position-fixed" style="top:35vh;left:46vw">
              <button class="btn btn-primary loading">
                  <span class="spinner-border spinner-border-sm"></span>
                  Loading...
              </button>
          </div>
          {% endcomment %}
          <!-- End of comment for loading spinner -->
          
            <div class="row">
                <div class="col-12">
                    {% if page_obj.has_next %}
                    <a class="infinite-more-link" href="?page={{ page_obj.next_page_number }}"></a>
                    {% endif %}
                    </span>
                </div>
            </div>
        </div>
    </div>


    <script src="{% static "js/jquery.waypoints.min.js" %}"></script>
    <script src="/static/js/infinite.min.js"></script>
    <script>
        
      
        var infinite = new Waypoint.Infinite({
            element: $('.infinite-container')[0],
            

            offset: 'bottom-in-view',

            onBeforePageLoad: function () {
                $('.loading').show();
            },
            onAfterPageLoad: function () {
                $('.loading').hide();

                $(document).ready(function(){
         function updateText(btn, newCount, verb){
         btn.text(newCount + " " + verb)
     }
      
     $(".follow-btn").click(function(e){
       e.preventDefault()
       var this_ = $(this)
       var badge = this_.find('.unlike-update')
       var followUrl = this_.attr("data-href")
       var followCount = parseInt(this_.attr("data-follows")) | 0
       var addFollow = followCount + 1
       var removeFollow = followCount - 1
       if (followUrl){
          $.ajax({
           url: followUrl,
           method: "GET",
           data: {},
           success: function(data){
             console.log(data)
             var newFollows;
             if (data.followed){
                //  updateText(this_, addLike, "Unlike")
                //  updateText(this_, data.likescount, badge)
                 updateText(this_, data.followscount, "Unfollow")
             } else {
                //  updateText(this_, removeLike, "Like")
                 updateText(this_, data.followscount, "Follow")
                 // remove one like
             }
      
           }, error: function(error){
             console.log(error)
             console.log("error")
           }
         })
       }
      
     })
      })
        }})
       
      

    </script>



    {% include 'group/snippets/group_follow.html' %}
    {% endblock %}

0 个答案:

没有答案