`

Display Tag标签下使用checkbox勾选且分页后复选框状态保存

阅读更多

>>>在阅读本文之前请先优先参考《Display tag 的使用》

 

 

本文场景描述:使用display tag标签在做列表的情况下,前置复选框选择功能,在勾选时记住勾选复选框勾选状态,在分页后的复选框状态仍然保持。

目的:数据实现分页显示,不是查询所有的数据,而是每次取固定的条数。而且在每页选中的数据ID都可以保存,一起提交选中的数据,做相应的操作。比如第一 页选中2条,第二页选中3条,提交时是5条,如果返回第一页,这也显示选中的数据,回到第二页,也会显示选中的数据,以此类推,取消选中,翻页几次,无任 何问题;总之,无论选中还是取消,翻页都没有bug;

实现方法:

1、首先进入的是你分页显示数据的页面,在这个action,或者servlet里创建一个session,名字自定义。因为每次翻页都是经 过这个action的,大多都是这样吧,所以要做下判断,第一次进入的时候创建session,而翻页的时候就不在new(新建)了。然后从 session里取出来的map把它循环组成字符串传回页面,放到隐藏域中,做判断用。

代码:

//初始化Table所选项
	private void initCheckedItems(HttpServletRequest request,HttpServletResponse response, Model model){
		boolean isFirstEnter=true;
		if(request.getQueryString()!=null && !"".equals(request.getQueryString())){
	         if(request.getQueryString().contains("-p")){
	        	 isFirstEnter=false;
	         }
		}
		if(isFirstEnter){//判断是否第一次进入该页面[在未点击分页情况下]
			//创建map,用于存放选中的checkbox
			Map  ck_map = new HashMap();
			//存放session,命名为jld_session,注意:每个模块定义用于存放checkbox的session的名字必须不同
			request.getSession().setAttribute("chkd_session", ck_map);
		}
		if(request.getSession().getAttribute("chkd_session")!=null){
			//获取名字为当前模块的session,把session中的值取出来,返回到页面,用于判断哪个checkbox选中了
		   Map map = (Map)request.getSession().getAttribute("chkd_session");
		   String ckIds = "";
		   if(map !=null){
			   Iterator it = map.entrySet().iterator(); 
			   while(it.hasNext()){
				   Map.Entry entry = (Map.Entry) it.next();
				   String value = (String)entry.getValue();
				   if(ckIds.equals("")){
					   ckIds = value;
				   }else{
					   ckIds = ckIds +";"+value;
				   }
			   }
		  }
		   model.addAttribute("ckIds", ckIds);
		}
	}

 

在list所在的action中加入initCheckedItems(request, response, model);方法。

 

2、全选和单选操作,每次点击checkbox的时候,都触发一个js函数,把id传到后台,后台根据前台判断的是选中还是选中之后取消来做相应的 操作,是添加到map中,还是从map中移除,该方法里创建个map,把ID作为键值,ID作为value值,然后循环这个map,把所有ID组成字符串 用“;”分割,ajax返回值就是这个字符串,然后document.getElementById().value=...把这个字符串设在隐藏域 中    代码如下:

 

//全选时触发
function checkAll(){
	if ($("#chkAll:checked").length > 0){
		$("[name=sonChecklist]").attr("checked", "checked");
		$("[name=sonChecklist]").each(function(){
			var id=$(this).attr("id");
			chkSonClick(id);
		}); 
	}else{
		$("[name=sonChecklist]").removeAttr("checked");
	}
}
//单选时触发
function chkSonClick(id){
    var check = document.getElementById(id);
    var a = 1;
    if(check.checked){
    	a = 1;//添加
    }else{
    	a = 0;//取消
    }
    var b = 0;
    $.ajax({
            async: false,
            type: "POST",
            url: "setSubIds.do",
            data:"&id="+id+"&done="+a,
            success: function(msg){
                document.getElementById("ckIds").value = msg;//存到页面隐藏域中
                b = 1;
            }
    });
    if(a==1&&b==1){
    	document.getElementById(id).checked =true;
    }else if(a==0&&b==1){
    	document.getElementById(id).checked =false;
    }
}

3、后台处理传过来的数据,每次处理好数据之后都把数据设在页面的隐藏域中。

@RequestMapping("/setSubIds")
	public String setSubIds(HttpServletRequest request,
			HttpServletResponse response, RedirectAttributes attribute)
			throws Exception {
		System.out.println("----Ajax保存所选的checkbox进入----");
        String id = request.getParameter("id");        //点击checkbox的value值
        String done = request.getParameter("done");    //判断操作,是选中,还是选中之后取消
        //获得此模块所存的用于存储选中id的session,此模块命名为chkd_session,不同模块sessionid不同
        Map map = (Map)request.getSession().getAttribute("chkd_session");
        if(done.equals("1")){
            map.put(id, id);//插入map操作,id作为主键,id作为值,用户覆盖相同的值
        }else if(done.equals("0")){
            map.remove(id);//从map中移除操作
        }
        System.out.println("Map里存的值:"+map.size());
        //覆盖名为chkd_session的session
        request.getSession().setAttribute("chkd_session", map);
        //以下用于ajax返回值操作
        try{
        String ids = "";//要返回页面的字符串
        if(map !=null){
            //把map遍历成字符串
            Iterator it = map.entrySet().iterator();       
            while(it.hasNext()){
                Map.Entry entry = (Map.Entry) it.next();
                String value = (String)entry.getValue();
                //循环第一遍
                if(ids.equals("")){
                    ids = value;
                }else{
                    ids = ids +";"+value;
                }
            }
            }
        //创建servlet
        response.setContentType("text ml;charset=gb2312");
        PrintWriter outs = response.getWriter();
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        outs.print(ids);//打印返回值
    } catch (IOException e) {
        e.printStackTrace();
    }
		return null;
	}


4、在提交的时候获取这个隐藏域的内容,每次翻页都会发这些ID藏在隐藏域中
      判断是否选中:在页面加载之后最后执行:

//初始化选中项
initCheckedItems();
function initCheckedItems(){
	var idd = document.getElementsByName("sonChecklist");//checkbox的name名称,自己定义
	var ids = document.getElementById("ckIds").value;//隐藏域里的所有选中的id,字符串
	var arr = ids.split(";");
	for(var i=0;i<idd.length;i++){
       for(var n=0;n<arr.length;n++){
	       	if(idd[i].value==arr[n]){
				idd[i].checked = true;//如果有匹配的就选中
	       	}
       }
	}
}

 5、如何在display tag标签中嵌入checkbox可供选择。

 

<display:table id="item" name="${itemList}" size="${itemCount}" pagesize="${itemSize}"
	class="table table-bordered table-striped table-hover"
	requestURI="/system/list.do" partialList="true">
	<display:column title="<input  id='chkAll' type='checkbox' name='chkAll'  onclick='checkAll()'/>" class="nowrap">
    	<input type='checkbox' id="${item.id}" name='sonChecklist' value="${item.id}" onclick='chkSonClick(${item.id})'/>
    </display:column>
	<display:column title="名称" property="title" sortable="true"/>
</display:table>

 总结:实现了自己的需求。

             缺点:可能会慢,如果网络不好,因为每次都有请求。

 

 

分享到:
评论

相关推荐

    js翻页复选框状态保存

    ### js翻页复选框状态保存 在网页开发过程中,特别是在使用JSP(Java Server Pages)进行后端处理的应用场景下,保持用户界面的一致性和交互性是非常重要的。本篇文章将详细探讨如何通过JavaScript实现一个功能:即...

    CheckBox分级选中 复选框 上下级 联动

    事件处理器会在每次改变复选框状态时,更新父级复选框的状态(如果存在)和所有子级复选框的状态。 此外,为了优化用户体验,我们还可以添加一些辅助功能,比如禁用父级复选框的选中状态,直到所有子级复选框的状态...

    js checkbox全选 反选 取消全部设置表单html复选框勾选

    反选则是将所有复选框的状态反转,即已选中的变为未选中,未选中的变为选中。同样,我们遍历所有的复选框,但这次改变它们的`checked`属性为相反的值: ```javascript function invertSelection() { var ...

    ListView添加CheckBox复选框

    本篇文章将详细讲解如何在ListView中实现CheckBox复选框的功能。 首先,我们需要创建一个自定义的ListView适配器。适配器是连接数据源和ListView的关键,它负责将数据转化为可显示的视图。创建一个继承自`...

    checkbox复选框传值

    在网页设计和开发中,复选框(Checkbox)是一种常见的用户界面元素,允许用户从多个选项中选择一个或多个。当涉及到数据提交,比如通过HTML表单POST方法将用户的选择发送到服务器并存储到数据库中时,理解如何处理复...

    实现table表格checkbox复选框的全选 反选

    1. 当全选复选框被点击时,如果它被选中(`:checked`),则所有行内复选框(`.itemCheckbox`)都被设置为选中状态;反之,所有行内复选框都被取消选中。 2. 当行内复选框被点击时,我们检查当前所有行内复选框是否都...

    QT QTreeWidget添加复选框

    在QStyledItemDelegate的paint()方法中,我们可以使用QPainter来绘制复选框,根据item的数据来决定复选框的选中状态。此外,我们还需要覆盖createEditor()方法,以防止在编辑模式下出现不必要的编辑框。 然后,我们...

    Qt之QTableView添加复选框

    在`setEditorData`和`displayText`方法中处理选中状态,以便当用户改变复选框状态时,模型中的数据能够更新。 4. **关联委托与QTableView**: 创建`MyCheckBoxDelegate`实例并将其设置为QTableView的itemDelegate...

    checkbox复选框状态保持

    在IT领域,尤其是在前端开发中,"checkbox复选框状态保持"是一个常见的需求,它涉及到用户界面(UI)的交互设计和数据持久化。在网页或应用程序中,复选框(checkbox)是用户进行多选操作的基本元素,允许用户对一组...

    隐藏layui数据表格表头的checkbox复选框

    ### 隐藏LayUI数据表格表头的Checkbox复选框方法详解 #### 背景介绍 在前端开发过程中,经常会使用到LayUI框架搭建网页应用,尤其是在设计复杂的数据展示界面时,LayUI提供了强大的数据表格功能。然而,在某些场景...

    WPF实现带全选复选框的列表控件

    本文将说明如何创建一个带全选复选框的列表控件。其效果如下图: 这个控件是由一个复选框(CheckBox)与一个 ListView 组合而成。它的操作逻辑: 当选中“全选”时,列表中所有的项目都会被选中;反之,取消选中...

    layui-table表复选框勾选的所有行数据获取的例子

    在layui-table中,若要在表格中添加复选框,通常需要在`th`标签中使用`lay-data`属性来指定复选框的类型。例如,在文章描述的示例中,使用了`thlay-data="{type:'checkbox'}"`来为表头添加复选框。 ### 获取勾选行...

    tagsinput.js 实现记录checkbox勾选顺序

    在这个场景中,我们关注的是它如何实现记录checkbox(复选框)的勾选顺序,并在页面上展示,同时能够将这些值传递给后台。下面将详细解释这一技术实现。 首先,复选框在网页表单中被广泛使用,让用户可以选择多个...

    NET MVC3使用CheckBox List(复选框列表)的简单方法

    ### .NET MVC3 使用 CheckBox List(复选框列表)的简单方法 在.NET MVC3框架中,虽然没有直接提供CheckBox List的功能,但可以通过简单的自定义方法来实现这一功能。下面将详细介绍如何在.NET MVC3中使用CheckBox ...

    VB.NET为DataGridView添加CheckBox实现全选全不选复选框

    Datagridview控件没有全选或取消全选的复选框,本资源用VB2015通过扩展DataGridViewColumnHeaderCell类,在列头绘制一个复选框checkbox控件,通过定义checkbox鼠标单击事件来实现行的全选或取消全选。checkbox还可以...

    treeview 复选框 三种状态

    遍历TreeView的节点,检查每个子节点的复选框状态,并根据需要更新父节点的状态。 5. 响应用户交互: 处理`BeforeCheck`和`AfterCheck`事件,可以防止用户做出无效的选择,比如禁止在不允许部分选中的情况下选择...

    QT CheckBox复选框状态设置、信号绑定, setCheckState、checkState、setTristate

    你可以使用`QObject::connect()`来连接`CheckBox`的`stateChanged`信号到一个槽,以便在用户改变`CheckBox`状态时执行特定的操作。例如: ```cpp QObject::connect(checkBox, &QCheckBox::stateChanged, this, &...

    树形复选框(Checkbox)

    3. **状态管理**:JavaScript可以维护选中数,每当复选框状态改变时,计算当前选中的节点数量,并在适当的位置显示。 4. **展开与收缩**:实现展缩功能通常需要一个额外的标志(如“展开”或“折叠”图标),点击该...

    CheckBox复选框美化

    例如,可以使用自定义绘图函数在特定事件下绘制不同的复选框状态,或者利用内置的样式和主题来改变控件的整体外观。 值得注意的是,虽然美化界面可以提升用户体验,但过度的装饰也可能导致反效果,使界面显得杂乱或...

    layui table 复选框跳页后再回来保持原来选中的状态demo

    在layui table中,复选框通常用来让用户多选表格中的行,但默认情况下,当用户翻页后,先前选中的复选框状态不会被记住。为了解决这个问题,我们需要实现一个自定义的解决方案,确保用户在返回之前的页面时,复选框...

Global site tag (gtag.js) - Google Analytics