原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://qingkechina.blog.51cto.com/5552198/1544928

本文通过获取首页内容来讲解Web页面拖拽获取当前页数据,功能类似在google查看图片,这里面涉及如下五个步骤:

(1)页面首次加载时读取第一页数据

(2)触发滚动条拖拽动作

(3)Ajax异步读取下一页数据

(4)服务端把数据封装为Json返回

(5)把页面数据通过DOM元素绘制在页面上

接下来就按这五个步骤依次进行

1、页面首次加载时会加载main.js文件。在此文件中增加CURRENT_ITEM_INDEX变量,用于标识当前话题的索引值;增加方法getPageContent(),用于页面加载时调用,获取第一页数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * 按时间降序排列后标识页面最后一条记录的索引值
 */
var CURRENT_ITEM_INDEX = 0;
$(document).ready(function()
{
    // 获取首页内容
    getPageContent(CURRENT_ITEM_INDEX);
});
function getPageContent(currentIndex)
{
    var data = {"currentIndex": currentIndex};
    asyncRequest("mainContent.data", data, function(result)
    {
        // 由第3步实现
    });
}

2、触发滚动条拖拽动作。在main.js加载时对window绑定scroll事件

1
2
3
4
5
6
7
$(document).ready(function()
{
    // 略
    getBreifUserInfo();
    // 监听滚动条拖拽事件
    bindScrollEvent();
});


【备注】:由于涉及到不断地下拉滚动条,所以需要增加一个标识isQueryFlag,若正在查找数据时则不再响应下拉事件

/**

* 是否正在查询数据标识

*/

var isQueryFlag = false;


3、Ajax异步读取下一页数据。实现bindScrollEvent()方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * 绑定滚动条拖拽事件
 */
function bindScrollEvent()
{
    var scrollBarDistance = 0; // 滚动条的当前位置
    var documentHeight = 0; // 文档高度
    var windowHeight = $(window).height(); // 当前窗口高度
    $(window).scroll(function(){
        scrollBarDistance = $(document).scrollTop();
        documentHeight = $(document).height();
        if(scrollBarDistance + windowHeight >= documentHeight)
        {
            if(isQueryFlag === true)
            {
                return;
            }
            // 获取页面内容
            getPageContent(CURRENT_ITEM_INDEX);
        }
    });
}

4、服务端把数据封装为Json返回

(1)修改配置文件system-data.xml,把拖拽动作方法与服务端读取数据的业务处理逻辑关联起来

1
2
<!--获取系统首页内容信息-->
<business name="mainContent" business-class="com.medical.server.data.MainDataAction" />

(2)定义服务端读取数据的业务处理类com.medical.server.data.MainDataAction

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@Override
public String execute() throws FrameException
{
    // 获取当前记录索引值
    String currentIndex = getParameter("currentIndex");
    if (FrameUtil.isEmpty(currentIndex))
    {
        TopicResultBean result = new TopicResultBean();
        result.setErrorCode(FrameErrorCode.REQUEST_PARAM_ERROR);
        return gson.toJson(result);
    }
     
    // 从数据库中读取数据
    int index = Integer.valueOf(currentIndex);
    List<TopicDAO> topicList = TopicUtil.getTopicList(index);
    if (FrameUtil.isEmpty(topicList))
    {
        TopicResultBean result = new TopicResultBean();
        result.setErrorCode(FrameErrorCode.REQUEST_CONTENT_EMPTY);
        return gson.toJson(result);
    }
     
    // 组装界面所需要内容
    List<TopicBean> topicBeanList = new ArrayList<TopicBean>();
    for (TopicDAO element : topicList)
    {
        UserDAO author = UserUtil.getUserByName(element.getUserId());
         
        TopicBean bean = new TopicBean();
        bean.setUserName(author.getUserId());
        bean.setUserIcon(author.getIconPath());
        bean.setNickName(author.getUserSign());
         
        bean.setTopicId(element.getTopicId());
        bean.setTopicTitle(element.getTopicTitle());
        bean.setCommentNum(CommentUtil.getCommentNum(element.getTopicId()));
        bean.setTopicSummary(getTopicSummary(element.getPrescript()));
        bean.setTopicTime(element.getTopicTime());
         
        topicBeanList.add(bean);
    }
    // 返回JSON结果
    TopicResultBean result = new TopicResultBean();
    result.setErrorCode(0);
    result.setTopicList(topicBeanList);
    return gson.toJson(result);
}


【备注】:为了使内容简洁,中间省略了一些处理函数


5、把页面数据通过DOM元素绘制在页面上

(1)异步读取数据,并对数据合法性进行判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 设置查询标识
isQueryFlag = true;
asyncRequest("mainContent.data", data, function(result)
{
    // 若读取数据未成功直接返回
    var resultJson = eval(result);
    if(resultJson.errorCode != 0)
    {
        return;
    }
    var topicList = resultJson.topicList;
    if(!topicList){
        return;
    }
     
    // 重置数据当前索引值
    CURRENT_ITEM_INDEX = CURRENT_ITEM_INDEX + topicList.length;
     
    // 操纵DOM把数据绘制到页面上
    $.each(topicList, function(i, item){
        appendData(i, item);
    });
     
    // 重置查询标识
    isQueryFlag = false;
});

(2)DOM元素绘制的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/**
 * 操纵DOM把数据绘制到页面上
 */
function appendData(i, item)
{
    var topicItem = $("<div />").attr("class""main_item");
    topicItem.appendTo($("#main_content_dynamic_id"));
    // 添加用户头像      
    var userIcon = $("<i />").attr("class""main_item_icon");
    userIcon.appendTo(topicItem);
    // 添加挑战内容
    var content = $("<div />").attr("class""main_item_content");
    content.appendTo(topicItem);
    // >>>>>>设置挑战话题标题 
    var topWrapper = $("<div />").attr("class""main_item_wrapper");
    var topicTitle = $("<div />").attr("class""main_item_title");
    var titleLink = $("<a />").attr("href""#").text(item.topicTitle);
    titleLink.appendTo(topicTitle);
    topicTitle.appendTo(topWrapper);
    topWrapper.appendTo(content);
    // >>>>>>设置挑战话题标题
    var topicTime = $("<div />").attr("class""main_item_time").text(item.topicTime);
    topicTime.appendTo(topWrapper);
    // >>>>>>设置用户名称和昵称
    var centerWrapper = $("<div />").attr("class""main_item_wrapper");
    var userName = $("<label />").attr("class""main_item_author").text(item.userName + ",");
    var userNick = $("<label />").attr("class""main_item_nickname").text(item.nickName);
    userName.appendTo(centerWrapper);
    userNick.appendTo(centerWrapper);
    centerWrapper.appendTo(content);
    // >>>>>>设置话题摘要信息
    var middleWrapper = $("<div />").attr("class""main_item_wrapper");
    var topicSummary = $("<div />").attr("class""main_item_substance").html(item.topicSummary);
    topicSummary.appendTo(middleWrapper);
    middleWrapper.appendTo(content);
    // >>>>>>设置话题附属信息
    var bottomWrapper = $("<div />").attr("class""main_item_wrapper");
    var topicAttach = $("<div />").attr("class""main_item_attach");
    topicAttach.appendTo(bottomWrapper);
    bottomWrapper.appendTo(content);
    // >>>>>>>>>>>>设置话题关注信息
    var followLink = $("<a />").attr("href""#");
    var followIcon = $("<i />").attr("class""main_item_attention");
    followIcon.appendTo(followLink);
    followLink.appendTo(topicAttach);
    followLink.text("关注");
    // >>>>>>>>>>>>设置话题关注信息
    var commentLink = $("<a />").attr("href""#");
    var commentIcon = $("<i />").attr("class""main_item_discuss");
    commentIcon.appendTo(commentLink);
    commentLink.appendTo(topicAttach);
    commentLink.text(item.commentNum + "人评论");
    // >>>>>>>>>>>>设置话题分享信息
    var shareLink = $("<a />").attr("href""#");
    var shareIcon = $("<i />").attr("class""main_item_share");
    shareIcon.appendTo(shareLink);
    shareLink.appendTo(topicAttach);
    shareLink.text("分享");
    // >>>>>>>>>>>>设置话题收藏信息
    var favoriteLink = $("<a />").attr("href""#");
    var favoriteIcon = $("<i />").attr("class""main_item_collection");
    favoriteIcon.appendTo(favoriteLink);
    favoriteLink.appendTo(topicAttach);
    favoriteLink.text("收藏");
}

6、效果演示

(1)向数据表topictable中增加两条记录

(2)在浏览器输入http://localhost:8080/medical,效果如下:


【备注】:

1、可以多插入些记录,就可以观察拖拽效果了 

2、这里的拖拽事件没有考虑窗口的缩小与放大情况

3、为了简洁起见,没有增加返回顶端功能


本文出自 “青客” 博客,请务必保留此出处http://qingkechina.blog.51cto.com/5552198/1544928

【斗医】【18】Web应用开发20天相关推荐

  1. 【斗医】【11】Web应用开发20天

    本文在上文的基础上完成用户登录验证功能. 四.获取数据请求业务处理封装 1.配置数据读取方式,它的作用是使用FrameDataGainer响应以.data结尾的请求,并把处理后的数据返回给客户端.打开 ...

  2. 【斗医】【13】Web应用开发20天

    在上文中完成用户注册/登录后显示用户名的功能,同时也谈了谈系统编码问题,本文重点聊聊"下战书"功能,里面涉及第三方在线HTML编辑器的问题. 一.Navicat for MySQL ...

  3. 【斗医】【3】Web应用开发20天

    在上面提及异常的中英文从资源文件中读取,若读取失败需要日志记录,所以使用网上正在闹腾的Logback来记录.关于Logback与Log4j这里不做评判和说明,所有疑问可以请教谷歌. 一.Logback ...

  4. 【斗医】【10】Web应用开发20天

    本文在前面封装Hibernate工具的基础上重点完成用户登录功能,目前系统页面展示的名称是在HTML中写死的,所以下面要做的事:若用户已登录则显示用户名:若用户未登录则点击进入登录页面. 一.修改登录 ...

  5. 推荐20个很有帮助的 Web 前端开发教程

    在平常的搜索中,我碰到过很多有趣的信息,应用程序和文档,我把它们整理在下面这个列表.这是收藏的遇到的有用内容的一个伟大的方式,可以在你需要的时候方便查阅.相信你会在这个列表中发现对你很有用的资料. 您 ...

  6. 给 Web 前端开发人员推荐20款 CSS 编辑器

    CSS 和 HTML,JavaScript 是网页的基础,作为前端开发人员,对这三者都要很熟悉.特别是未来流行全栈开发的时代,每项技术都是你知识结构中必要的一个节点. 在开发中,选择好工具是非常重要的 ...

  7. python开发web项目_Django2:Web项目开发入门笔记(20)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这一篇教程,我们一起来了解如何在CentOS系统中将Django2的Web项目部署到Nginx服务器. CentOS系统虽然和Ubuntu系统都是Linu ...

  8. 基于Golang的简单web服务程序开发——CloudGo

    基于Golang的简单web服务程序开发--CloudGo[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 (1)基本要求 (2)扩展要求 三.具体 ...

  9. 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)

    读书笔记:编写高质量代码--web前端开发修炼之道 这本书看得断断续续,不连贯,笔记也是有些马虎了,想了解这本书内容的童鞋可以借鉴我的这篇笔记,希望对大家有帮助. 笔记有点长,所以分为一,二两个部分: ...

最新文章

  1. 【错误记录】IntelliJ IDEA 中右键点击源码目录选择 New 选项 没有创建 Java Class 选项 ( 将对应的源码目录标记为 Sources 选项 )
  2. python变量无需创建赋值_Python 第 2 章 变量及赋值运算符
  3. 使用Dynamic LINQ创建高级查询服务
  4. 古巴比伦乘法_古巴平台中的通用过滤器–类固醇上的excel过滤器
  5. matlab欧拉法程序,欧拉法matlab程序.doc
  6. Find命令搜索过去一段时间内修改过的文件
  7. matlab prn文件,PRN格式文件 如何打开PRN文件 PRN是什么格式的文件 用什么打开 - The X 在线工具...
  8. 电路基础学习笔记2:串并联电路
  9. 站班汇报 水印 加相册插件
  10. ELK集群部署报错(master not discovered yet, this node has not previously joined a bootstrapped )
  11. 【37期】请你详细说说类加载流程,类加载机制及自定义类加载器
  12. Weblogic10.3.6升级2021年10月补丁p33172858_1036_Generic.zip实践
  13. 交互设计师成长指引-从平凡到卓越
  14. IE 浏览器下的兼容(onclick)
  15. gedit变身为编程利器的简单配置
  16. C语言基础知识点总结
  17. 黑金开发板在NiosII环境下烧写image到flash失败的解决办法
  18. 大数据技术在金融行业的应用前景
  19. 【视觉定位UV】日志分析之Mark点详解
  20. 在ros中使用opencv启动例程 rosrun robot_vision cv_bridge_test.py 遇到的问题

热门文章

  1. 如何成为Android开发高手
  2. Depth graph
  3. Linux环境HBase安装与使用
  4. 按拼音模糊匹配查询条件的生成类
  5. 一些实用的 Javascript 代码
  6. PE文件和COFF文件格式分析——节信息
  7. 经典网络VGGNet介绍
  8. GitHub/GitLab/Gitee中项目互拷贝后仍保留历史提交记录的方法
  9. matlab图像处理命令(二)
  10. 【Live555】live555源码详解(五):MediaSource、MediaSink、MediaSession、MediaSubsession