• ajax无刷新高效分页和批量删除无刷新


    标签: 

    it

     

    Ajax实现高效分页功能文档

     

    技术要点

    异步请求:

    日期转换:

    页码条做法:

    页面间转换时问题:当点击下一页, 上一页等,原来的一页的数据没有清除,需要重新通过JS清除。

    批量删除数据

     

     

     

    步骤

    1. 使用asp.net异步请求数据:

             

    1.)创建XmlHtttpRequest对象来实现异步请求:这也是ajax最重要的东东。

               注意:XMLHttpRequest对象在IE浏览器和非IE浏览器中创建的方法不同。

    2)下面使用兼容方式创建异步对象:

     function createXhr() {

        var xhobj = false;

        try {

            xhobj = new ActiveXObject("Msxml2.XMLHTTP"); // ie msxml3.0+

        } catch (e) {

            try {

                xhobj = new ActiveXObject("Microsoft.XMLHTTP"); //ie msxml2.6

            } catch (e2) {

                xhobj = false;

            }

        }

        if (!xhobj && typeof XMLHttpRequest != 'undefined') {// Firefox, Opera 8.0+, Safari

            xhobj = new XMLHttpRequest();

        }

        return xhobj;

    }

     

     3)创建请求; - open (告诉他要去做的事情)

         获得数据主要通过Get请求,get请求有缓存(get请求同一个页面会缓存。当第二次访问该页面的时候不在提交到服务器

    从缓存里面拿值),这是我们不愿意看到的,可以取消缓存,使用一下代码:

         xmlHttpRequest.setRequestHeader("If-Modefied-Since","0");

     

     

     4xmlHttpRequest.send(null); 让他去请求数据

     

     

     5)设置readystatechange事件触发一个回调函数; -onreadystatechagne:最重要的东东

    这个事件主要是判断异步请求的不同状态下,触发不同的事件,做出不同的响应。

    他有一个重要的属性readyState属性:

    readyState属性指出了XMLHttpRequest对象在发送/接收数据过程中所处的几个状态。XMLHttpRequest对象会经历5种不同的状态。

    • 0:未初始化。对象已经创建,但还未初始化,即还没调用open方法;

    • 1:已打开。对象已经创建并初始化,但还未调用send方法;

    • 2:已发送。已经调用send 方法,但该对象正在等待状态码和头的返回;

    • 3:正在接收。已经接收了部分数据,但还不能使用该对象的属性和方法,因为状态和响应头不完整;

    • 4:已加载。所有数据接收完毕

     

     

    当请求数据回来后通过var res = xmlHttpRequest.responseText; 来接收数据。

    注意:这里回来的是Json形式的字符串,要转成json对象

    通过:eval_r()方法来转:var jsonArr = eval_r("(" + res + ")");

    再注意:有时候字符串中有数组等比较复杂的形式的字符时候,要如上面的形式加上eval_r("(" + res + ")");小括号

    以便作为表达式运行,要不然得不到数据,转化失败。

     

    6)请求数据回来后,得到的数据是里面有:数据中的要查询的表数据,还有表中总共多少条,分了几页。为下面的页码条做准备。

    问题?当用户访问过的页面后,比如第一页,过一会儿在访问这一页时候,需要重新发送请求到服务器端。这样不好,为了减少

    服务器端的负担,加快用户浏览的速度,可以在浏览器端定义一个全局变量,每当得到服务器发送来的数据,就把它放在我的浏览器端

    的全局变量中,当在此访问他们的时候,判断一下,全局变量中是否存在,如果存在,直接从中拿数据,否则在回到服务器端拿数据。       

     

    7)需要的全局变量:

           var pageIndex = 1; 当前访问的页数

            var pageCount = 0; 总页数

            var rowCount = 0; //总数据行

            var xmlHttpRequest = false//异步对象

            var tb = false//表格对象

            var jsonAll = new Array(); 缓存全局变量

     

     

    2. 在浏览器端脚本js保存数据使用json对象后:下一步要不数据放到浏览器端展现给用户看:下面通过js代码创建表格行来存放数据

    通过一个方法,一个业务就要写个方法,思路清晰,代码也清晰。

    function createTr(jsonTr) { ----传递的参数就是要添加到表格里的数据

               

                for (var i = 0; i < jsonTr.length; i++) {

                    var newRow = tb.insertRow(-1); //创建一行

                    newRow.setAttribute("id""tr" + jsonTr[i].CID); //给改行添加一个属性

     

                    var newCellId = newRow.insertCell(-1); //创建元素--下面追加多列元素

                    newCellId.innerHTML = jsonTr[i].CID;

     

                    var newCellCname = newRow.insertCell(-1);

                    newCellCname.innerHTML = jsonTr[i].CName;

                  

                    var newCellAddTime = newRow.insertCell(-1);

                    newCellAddTime.innerHTML = changeDateFormat(jsonTr[i].CAddTime);

                    

                }

            }

    3.不过问题来了??当访问下一个页面的时候,因为通过异步请求数据,轻量级的刷新页面,上一页的数据还没有清除,

     所以要手动的通过js来清除原来的数据。

    function clearTr() {

               var trCount=tb.rows.length;得到共有多少行数据

                for (var i = trCount-1; i>1 ; i--) {------注意这是一个细节,必须倒序删除,要不然删不全

                    tb.deleteRow(i);------很重要的一个js里的方法,通过它可以很方便的删除行----

                }

            }

      

            

     

     

    4.页码条的制作:

    页码条的制作的准备工作:需要从数据库获得总数据条数,总页数

     

            function creatSar() {----注意里面的loadData();方法是加载数据的,通过异步对象ajax请求来获得数据

    var sarDiv = document.getElementByIdx_x("sarDiv");先得到一个层div,目的是把页码条放在该层里

                var btnPre = sarDiv.innerHTML = "<span>数据总数" + rowCount + "</span>  <span>" + pageIndex + "/" + pageCount +

                 "</span><a href='javascript:loadData(1);'>第一°3</a><a href='javascript:loadData(prePage());'>上一页°3</a>" + forCreatePage() +

                "<a href='javascript:loadData(nextPage());'>下一页°3</a><a href='javascript:loadData("+pageCount+");'>最后一页</a>";     }

                    function forCreatePage() {

                var strA = "";

                for (var i = pageIndex; i < pageIndex + 5; i++) {

                    if (i == pageCount+1){---注意:当到达最后一页的时候不在循环了

                        break;

                    }

                   strA += "<a href='javascript:loadData(" + i + ");'>" + i + "</a>";           

                }

                return strA;  

           }

           //06--上一页

           function prePage() {

               if (pageIndex > 1) {

                   pageIndex--;

               }

               else {

                   pageIndex = 1;

               }

               return pageIndex;

           }

           //07--下一页

           function nextPage() {

               if (pageIndex < pageCount) {

                   pageIndex++;

               }

               else {

                   pageIndex = pageCount;

               }

               return pageIndex;

           }

     

    注意的问题:创建页码条的方法在哪里来调用?、

    loadData()方法里,创建完表格行后再调用他。因为里面传递了当前用户访问的页面,每次访问都要把全局的变量pageIndex当前的页改变。

    loadData()方法里面,必须写下传入的当前页,把它再赋值给全局变量。---这一点很重要。

     

     

    5.日期转换的问题:从数据库中得到的DateTime类型的日期格式2011-08-10 17:40:00.717转成2011-08-10

    可以通过写的一个js方法来解决:

    function changeDateFormat(cellval) {---参数是从服务器端传来的时间变量---通过这个方法就可以转换了

        var date = new Date(parseInt(cellval.replace("/Date(""").replace(")/"""), 10));

        var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;

        var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();

        return date.getFullYear() + "-" + month + "-" + currentDate;

    }

     

         

     

     

     

     

     

     

    外加的功能:批量删除数据

    知识点:1.异步对象来删除数据

    2.checkBox来选择要删除的对象,设置标签name都为同一个名字,value值为该行要删除数据的id

    3.写一个批量删除按钮,通过点击按钮来批量删除,调用删除的方法

    4.根据用户选择的,选择后的,得到id—根据value放在一个字符串里,然后可以使用sql语句处理删除操作in(---)

    5.如果数据库更新成功,还有页面上的数据,为了不让他刷新,可以使用js处理,直接清除删除的数据行,这个很重要。

      上面的到了要删除的id—字符串,然后分割成数组,得到每个id,循环表格行来查找第一列的id如果相等,删除这一行。

    代码如下:

     

    function delBatch() {

               if (window.confirm("确定要删除吗~~")) {

                   var checkBoxAll = document.getElementsByName("checkName"); //根据获得所有的checkBox选择框

                   var delIds = ""//要删除的id集合字符串

                   for (var i = 0; i < checkBoxAll.length; i++) {

                       if (checkBoxAll[i].checked) {//判断如果选中了,就放在删除的区域

                           delIds += checkBoxAll[i].value + ",";

                       }

                   }

                   delIds = delIds.substr(0, (delIds.length - 1));

                   xmlHttpRequest.open("post""CommonHandler.ashx"true);

                   xmlHttpRequest.setRequestHeader("Content-Type""application/x-www-form-urlencoded");

                   xmlHttpRequest.onreadystatechange = function () {

                       if (xmlHttpRequest.readyState == 4) {

                           if (xmlHttpRequest.status == 200) {

                               var res = xmlHttpRequest.responseText;

                               if (res == "ok") {

                                   //下面这种循-环方法不行循-环删除时checkBoxAll.length会变,只能删除选中的奇数行

    //                               for (var i = 0; i < checkBoxAll.length; i++) {

    //                                   if (checkBoxAll[i].checked) {

    //                                       delRow(checkBoxAll[i].value);

    //                                   }

    //                                

    //                               }

                                   alert("批量删除成功|");

                                   res = delIds.split(",");

                                   for (var i = 0; i < res.length; i++) {

                                       delRow(res[i]); //调用删除行的方法个法循-环行找到行的第那个列id相等就删除

                                   }

                               }

                               else {

                                   alert("删除失败");

                               }

                           }

                       }

                   }

                   xmlHttpRequest.send("type=delBatch&ids=" + delIds);

               }

           }

           //09删除行方法     

     

      function delRow(id) {

               var rowCount = tb.rows.length; //表格行数

               for (var i = 0; i < rowCount; i++) {//-环所有的行数

                   if (tb.rows[i].childNodes[0].innerHTML == id) {

                       tb.deleteRow(i);

                       break;

                   }

            

  • 相关阅读:
    vector 向量容器用法祥解
    stdafx.h 的作用
    vector 利用swap 函数进行内存的释放 vector<int>().swap
    LPCTSTR LPCWSTR LPCSTR 含义
    Application->ProcessMessages();
    sizeof 和 strlen 的区别
    程序编译没错,运行报错:无法定位程序输入点GT_BufLaserFollowRatio(这是函数)于动态链接库GTS.DLL上
    用户登录注销功能
    在项目开发中经常用到的全局函数
    在项目开发中经常用到的全局函数2
  • 原文地址:https://www.cnblogs.com/q101301/p/3666790.html
Copyright © 2020-2023  润新知