Django+ajax实现页面底部加载

来源:互联网 发布:it资讯 编辑:程序博客网 时间:2024/06/08 08:43
  • 需求:展示图片,当滚动条拖到页面底部时加载一部分图画。
  • 问题:photo的展示使用的是django的QuerySet,对于ajax如何加载非常头痛,还专门补了一下js。
  • 解决思路:用的取巧的办法,把photo先分页,然后ajax的load方法加载下一个页面的photo部分到当前页面来。

分页

第一步是把photo的QuerySet分页展示,我这里直接用127.0.0.1:8000/x/的url,所以在urls.py里这样写

url(r'^(?P<page>\d+)/$',index,name='分页'),
  • 1
  • 1

每页加载的数量改了好几次,最后决定少一点,定在5,那么需要根据page来分割QuerySet取得相对应的图片,然而QuerySet是无法排序的,先用list转换成列表,然后再切片。 
views.py

def index(request,page=0):    if request.method=='POST':        ...    else:        photos=list(Photo.objects.filter(is_show=True).order_by('-id'))[int(page)*5:(int(page)+1)*5]        return render_to_response('index.html',RequestContext(request,{'photos':photos}))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这样每页展示的图片就只有5张。

底部加载

一般当页面滑动到底部进行操作的代码结构类似这样:

 $(window).scroll(function () {        var scrollTop = $(this).scrollTop();//滚动条滚动的距离        var scrollHeight = $(document).height();//整个html页面高度        var windowHeight = $(this).height();//可视页面的高度        if (scrollTop + windowHeight == scrollHeight) {            //DO SOMETHING        }    });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

写到这里我又停下来再理了一下思路,要获得下一个页面的图片,首先要知道下一页的url,而这个加载本身是发生在主页,也就是没有/x/这个部分,又要分情况处理了。

var url=window.location.href;//获取当前页面链接var cuts=url.split('/');//分隔,获取页码if(cuts.length<5){        var cur_page_num=1;}else{        var cur_page_num=parseInt(cuts[3]);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

并且在不断往下拖动过程中需要一个循环自加页码的步骤。 
接下来用ajax的load方法获取对应的div,但是load方法必须要加载到一个容器里,于是乎还要先创建一个容器来装新加载的,如果直接加载到原来的div里面会覆盖之前的photo了。 
所有photo的装在一个大容器中

<div class='container-fluid grid'>{% block content %}{% endblock %}</div>
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

在block里面是每一个小的photo div

<div class="grid-item">...</div>
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

为了避免每一次加载覆盖之前的内容,每一次都需要创建一个容器,并且用唯一标示与其他的容器区分开。 
因此在js里面这样写:

if (scrollTop + windowHeight == scrollHeight) {            var nexturl=cuts[0]+'//'+cuts[1]+cuts[2]+'/'+String(cur_page_num+1)+'/';//拼接下一页的url            cur_page_num+=1;//自加1            //alert(cur_page_num);            var newnode=document.createElement("div");             newnode.setAttribute("class", "container-fluid grid");             newnode.setAttribute("id","new"+String(cur_page_num));            document.body.appendChild(newnode);            $('#new'+String(cur_page_num)).load(nexturl+' .grid-item');        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

每一次下滑拖到底部时,页码都会自加1,这样就避免了只能加载下一页的情况,新创建的div同样有class=’Container-fluid grid’,和前面的保持样式一致,另外增加一个id=new+页码,使用load方法加载到这个新的容器中。 
至此整个加载过程基本实现。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 腾讯手游模拟器玩全军出击卡怎么办 手游cf用模拟器画面很抖怎么办 腾讯手游助手模拟器游戏卡死怎么办 腾讯手游模拟器提示注册以满怎么办 手游绝地求生被检测成模拟器怎么办 腾讯手游助手模拟器内存不够怎么办 微信视频对方听不到我的声音怎么办 学生考试传纸条作弊老师应怎么办 苹果手机微信小游戏没有声音怎么办 红米手机游戏下好了安装不了怎么办 小米手机sd卡存储已满怎么办 英雄联盟峡谷之巅资格被收回怎么办 人进监狱之前信用卡没还怎么办 荒野行动资源文件下载卡住了怎么办 荒野行动绑定的手机号停机了怎么办 不小心误点了爱奇艺扣款了怎么办 和别人吵架别人先骂你怎么办 自己人被带到了缅甸黑社会了怎么办 绝地求生忘记复制钥匙激活码怎么办 绝地求生买的钥匙激活码丢了怎么办 蓝河奶粉宝宝吃了不长肉怎么办 苹果ios版本太低激活不了怎么办 脸上被油烫伤了 起了水泡怎么办 皮肤被油烫伤起来个水泡怎么办 去泰国旅游没来得及兑换泰铢怎么办 游戏和安卓 不和 出现黑屏怎么办 邻居把垃圾放在楼梯口不丢怎么办 58热敏小票打印机口松了怎么办 王鹏的眼睛今天起疙瘩了怎么办 背包带子老从肩膀滑下来怎么办 绝地求生用手机流量更新不成怎么办 手机拍的视频在电脑上放不了怎么办 炉石传说手机点登陆游戏闪退怎么办 车到信号屏蔽区一键启动不了怎么办 王者荣耀战队活跃度满了怎么办 win10你的账户已被停用怎么办 电脑一键还原后一直黑屏怎么办? 被打了狂犬疫苗的狗咬伤怎么办 美版苹果7系统坏了怎么办 韩服的球球大作战网络不稳定怎么办 球球大作战号删了找不回来怎么办