JS CheckBox事件

本文介绍了一个基于Java的Web应用程序页面,该页面用于展示部门列表并实现用户与部门之间的关联。通过使用Java和JSP技术,实现了部门及其下属用户的动态加载,并提供了用户选择功能。

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="tos.app.user.domain.service.UserService" %>
<%@ page import="tos.framework.service.ServiceMgr" %>
<%@ page import="tos.app.user.common.UserConstants" %>
<%@ page import="tos.app.system.dfiMST.domain.dto.DfiItemDataDTO" %>
<%@ page import="tos.app.user.domain.dto.UserDTO" %>
<%@ include file="../common/taglibs.jsp"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>部门列表&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</title>
    <SCRIPT src="<%=request.getContextPath()%>/views/common/scripts/common.js"></SCRIPT>  
     <LINK rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/views/common/styles/style.css">
     <script src='<%=request.getContextPath()%>/views/common/scripts/common.js'></script>
     <%
       Map para = new HashMap();
       UserService userService = (UserService)ServiceMgr.getService(UserConstants.USERSERVICE_BEAN_KEY);
       String typ = "Department";
       List dfiItemData = userService.queryDfiItemDate(typ);
       List userList = userService.select4Group();
       request.setAttribute("dfiItemData",dfiItemData);
       request.setAttribute("userList",userList);
       request.setAttribute("fistQuery","fistQuery");
     %>
          <script type="text/javascript" language="Javascript">
         var winWidth=0;
         var winHeight=0; 
         var data = "";    
         function callback(){
            var defItem = document.getElementsByName("defItem1");
           
            var a=0;
          for(var i = 0;i<defItem.length;i++){
              if(defItem[i].checked){
                  ++a;
                  if(defItem[i].value=="undefined") defItem[i].value="";

               if(data=="" && defItem[i].value!=""){
                     data=defItem[i].value;
           }else if(defItem[i].value!=""){
              data+=","+defItem[i].value;
          }
        }       
          
         }
            window.returnValue=data;
            window.document.clear();
            window.close();
       }
      
     </script>
<script language='javascript'>

var imgPath = '<%=request.getContextPath()%>/images/';
var imgBlank = imgPath + 'arrow_002.jpg';
var imgFolderClose = imgPath + 'plus.gif';
var imgFolderOpen = imgPath + 'minus.gif';
var imgText = imgPath + 'openMark.png';
var targetFrame = '_self';
var clSelected = '#DD0000';
var clUnSelected = '#999999';
var g_hasCheckbox = false;

var g_checkboxName = 'selItem';
var g_checkboxNameLevel = true; //如果有必要,可以不同层次的checkbox.name不同

var g_readonly = false;

var curNode;

function Node(aId, aText){
    this.nodeId = aId;
    this.isOpen = false;
    this.nodeText = aText;
    this.childNodes = new Array();
    this.childCount = 0;
    this.checked = false;
    this.level = 0;
    this.parent = null;
}

Node.prototype.addChild = function(aChildNode){
    this.childNodes[this.childCount++] = aChildNode;
}


function dispNode(aNode){
   //var atxt = !aNode.link ? '<font style="cursor:hand" onclick="expand(this.previousSibling)">' + aNode.nodeText + '</font>' : '<a id="a' + aNode.nodeId + '" href="' + aNode.link + '" target="' + targetFrame + '" onclick="change(this);">' + aNode.nodeText + '</a>';
    var atxt = '<font style="cursor:hand" onclick="expand(this.previousSibling)">' + aNode.nodeText + '</font>';
    if (g_hasCheckbox) atxt = '<input type="checkbox" style="width:25px;" name="defItem1" value="' + aNode.link + '" onclick="return selectChanged(this)" ' + (aNode.checked ? 'checked' : '') + '>' + atxt;
    if (aNode.childCount > 0){
        var folderImg = aNode.isOpen ? imgFolderOpen : imgFolderClose;
        //document.write('<img id="' + aNode.nodeId + '" style="cursor:hand" onclick="expand(this)" src="<%=request.getContextPath()%>/images/system.gif">' + atxt);
        document.write('<img id="' + aNode.nodeId + '" style="cursor:hand" onclick="expand(this)" src="'+folderImg+'">' + atxt);
    } else
        document.write('<img src="' + imgText + '">' + atxt);
}


function selectChanged(obj){

    if (g_readonly) return false;
    if (obj.checked){ // 选择所有父节点,因此需要增加 Node.parent 属性


                  var objParent = obj.parentNode;
                  if (objParent || objParent.tagName == 'DIV'){

                      var nodeParent = eval(objParent.id.substring(3)); // div.id 是 'div' + aNode.nodeId

                      while (nodeParent){
                var objImg = document.getElementById(nodeParent.nodeId);
                objImg.nextSibling.checked = true;
                nodeParent = nodeParent.parent;
                      }
                  }
    }

    var divId = 'div' + obj.previousSibling.id;
    var divObj = document.getElementById(divId);

    if (!divObj) return;
    var childs = divObj.getElementsByTagName('INPUT');
    for (var i = 0; i < childs.length; i++) childs[i].checked = obj.checked;
}

function change(obj){
    if (curNode) curNode.style.color = clUnSelected;
    curNode = obj;
    obj.style.color = clSelected;
}

function expand(obj){
    while (obj.tagName != 'IMG') obj = obj.previousSibling;
    var divId = 'div' + obj.id;
    var divObj = document.getElementById(divId);

    if (divObj) with (divObj){
        if (style.display == 'none'){
            obj.src = imgFolderOpen;
            style.display = 'block';
        } else {
            obj.src = imgFolderClose;
            style.display = 'none';
        }
    }
}

function makeTree(aNode, aLevel){
    if (aLevel == 0){
        aNode.isOpen = true; //默认根节点展开

        dispNode(aNode);
    }
    var dispMode = aNode.isOpen ? 'block' : 'none';

    document.write('<div id="div' + aNode.nodeId + '" style="display:' + dispMode + '">');
    var tmpNode;
    for (var i=0; i < aNode.childCount; i++){
        tmpNode = aNode.childNodes[i];
        tmpNode.parent = aNode;
        tmpNode.level = aLevel + 1;

        for (var j=0; j <= aLevel; j++)
            document.write('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp');

        dispNode(tmpNode);
        document.write('<br>');

        if (tmpNode.childCount > 0) makeTree(tmpNode, aLevel+1);
    }
     document.write('</div>');
}
</script>

 <SCRIPT LANGUAGE="JavaScript">
                       g_readonly = false; //<!-- 控制checkbox的可编辑状态 %=isShowState% -->

g_hasCheckbox = true;

g_checkboxName = 'selItemB';

g_checkboxNameLevel = true;

 

//<!-- 从数据库获取数据,生成树 %=Tree.genTree()%-->

var node_root = new Node('node_root', '部门列表');

<%
  int i=0;
  int j=0;
  for(Iterator iter = dfiItemData.iterator();iter.hasNext();){
    DfiItemDataDTO dataDTO = (DfiItemDataDTO)iter.next(); 
      %>
       var node_<%=i%> = new Node('node_<%=i%>', '<%=dataDTO.getDefItem1()%>');
       node_root.addChild(node_<%=i%>);
      <%
      for(Iterator iter1 = userList.iterator();iter1.hasNext();){
        UserDTO userDTO = (UserDTO)iter1.next(); 
        if(userDTO.getBelongPart().equals(dataDTO.getDefItem1())){
      %>
        var nodeCH_<%=j%>= new Node('nodeCH_<%=j%>', '<%=userDTO.getUname()%>');
        nodeCH_<%=j%>.link='<%=userDTO.getEMail()%>';
        node_<%=i%>.addChild(nodeCH_<%=j%>);
      <%
      }
      j++;
      }
     
      i++;
    }
%>
    makeTree(node_root , 0);
  </SCRIPT>
     <script src='<%=request.getContextPath()%>/views/common/scripts/openWindow.js'></script>
  </head>
  <body>
  <TABLE id="dataList" bgcolor="#638EA5" border="0" width="100%" cellspacing="1" cellpadding="0">
    <TR align="center">
        <TD><html:submit value=" OK " onclick="callback()" style="width: 50px;"/></TD>
     </TR>
  </TABLE>
  
  </body>
</html>

<think>我们正在讨论JavaScript中处理checkbox选中事件的实现方法。需要参考之前的内容,但注意之前引用的内容并没有直接关于checkbox事件处理,因此我们需要根据标准JavaScript和jQuery知识来回答。用户要求的是checkbox的checked事件处理程序的示例代码,我们可以分别用原生JavaScript和jQuery来实现。在引用[2]中提到了jQuery的事件绑定,引用[3]提到了radiobutton的复位,其中涉及了checked属性,但不直接相关。我们将提供两种方式:1.原生JavaScript:使用addEventListener监听change事件,或者通过onchange属性。2.jQuery:使用.change()方法或.on('change',handler)方法。注意:checkbox的状态变化通常监听change事件,也可以使用click事件,但change事件更准确(因为状态改变可能是通过键盘操作等)。示例代码将包括:-获取checkbox元素-绑定事件-在事件处理函数中检查checked属性同时,根据用户之前的问题,我们还需要提供相关问题。结构如下:一、原生JavaScript实现1.通过onchange属性(内联方式)2.通过addEventListener方法(推荐方式)二、jQuery实现1.使用.change()方法2.使用.on('change',handler)方法每个部分给出简短示例代码。最后,生成相关问题。</think> ### JavaScript 处理 Checkbox 选中事件的实现方法 在 JavaScript 中处理 checkbox 的选中状态变化事件,主要通过监听 **`change` 事件** 或 **`click` 事件** 实现。以下是原生 JavaScript 和 jQuery 的完整实现示例: --- #### 一、原生 JavaScript 实现 ##### 1. 基础事件监听(推荐) ```html <input type="checkbox" id="subscribeCheckbox"> 订阅邮件通知 <script> const checkbox = document.getElementById("subscribeCheckbox"); // 监听 change 事件(兼容键盘操作) checkbox.addEventListener('change', function(e) { if (this.checked) { console.log("已订阅 ✔️"); // 执行订阅逻辑 } else { console.log("已取消订阅 ❌"); // 执行取消逻辑 } }); </script> ``` ##### 2. 多选框批量处理 ```html <input type="checkbox" name="fruit" value="apple"> 苹果 <input type="checkbox" name="fruit" value="banana"> 香蕉 <input type="checkbox" name="fruit" value="orange"> 橙子 <button id="confirm">提交</button> <script> document.getElementById("confirm").addEventListener('click', () => { const selected = []; // 遍历所有同名checkbox document.querySelectorAll('[name="fruit"]:checked').forEach(checkbox => { selected.push(checkbox.value); }); console.log("已选水果:", selected.join(", ")); // 示例:苹果, 橙子 }); </script> ``` --- #### 二、jQuery 实现(需引入库) ##### 1. 简化事件绑定[^2] ```javascript $(function() { $("#subscribeCheckbox").change(function() { if ($(this).is(':checked')) { $("#status").text("已订阅"); // 更新UI反馈 } else { $("#status").text("未订阅"); } }); }); ``` ##### 2. 动态生成复选框的事件代理 ```javascript // 动态添加的checkbox也有效 $(document).on('change', '.dynamic-checkbox', function() { console.log(`选项 ${this.value} 状态: ${this.checked ? "选中" : "未选"}`); }); ``` --- #### 三、核心注意点 1. **事件选择** - `change` 事件:更准确(兼容键盘空格键切换) - `click` 事件:可能误触(如点击 label 也会触发) - 优先使用 `change` 事件[^1] 2. **状态判断** 通过 `element.checked`(原生)或 `$(el).is(':checked')`(jQuery)获取状态,而非直接依赖事件对象。 3. **性能优化** 批量操作时使用事件委托(`event delegation`),避免循环绑定: ```javascript // 监听父元素而非每个checkbox document.getElementById("checkboxGroup").addEventListener('change', e => { if (e.target.matches('input[type="checkbox"]')) { console.log(e.target.value, e.target.checked); } }); ``` --- #### 实用场景示例:全选/反选 ```html <input type="checkbox" id="selectAll"> 全选 <div id="itemList"> <input type="checkbox" class="item" value="1"> 选项1 <input type="checkbox" class="item" value="2"> 选项2 </div> <script> const selectAll = document.getElementById("selectAll"); selectAll.addEventListener('change', () => { const isChecked = selectAll.checked; document.querySelectorAll('.item').forEach(checkbox => { checkbox.checked = isChecked; }); }); </script> ``` > **原理**:全选框的 `change` 事件触发时,遍历并同步子复选框的 `checked` 属性。 --- ### 关键知识点总结 1. **事件类型**:主要使用 `change` 事件 2. **状态检测**:`element.checked` 返回布尔值 3. **jQuery 语法糖**:`$(el).change()` ≈ `addEventListener('change')`[^2] 4. **现代替代方案**:可使用 `MutationObserver` 监听 DOM 属性变化
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值