原生javascript自定义input[type=checkbox]效果

上文已经讲input[type=radio]的做法发布,在我做input[input=checkbox]时候,觉得会和radio做法差不多,结果是有相似之后,但也有很大不同。

不同点有

1)checkbox自带冒泡和捕获事件,结果就是点击一下包裹checkbox的label会发生两次事件,也就是checkbox选中了,然后又不选中了,所以在对label绑定事件时候,需要停止冒泡

2)选中chekbox需要使用chekbox自带的checked属性,设置该属性的选中和被选中状态,这个与radio一致

代码如下

  1 <!DOCTYPE html>
  2 <html lang="en">
  3
  4 <head>
  5     <meta charset="UTF-8">
  6     <title>自定义checkbox</title>
  7     <style type="text/css">
  8     #ceshi label input {
  9         display: none;
 10     }
 11
 12     #ceshi label span {
 13         display: inline-block;
 14         width: 18px;
 15         height: 18px;
 16         border-radius: 50%;
 17         border: 2px solid #ddd;
 18         box-sizing: border-box;
 19         position: relative;
 20         top: 3px;
 21         margin-right: 6px;
 22     }
 23
 24     #ceshi label span.active {
 25         border: 3px solid red;
 26     }
 27     </style>
 28 </head>
 29
 30 <body>
 31     <form id="ceshi" action="test.php" method="get">
 32
 33         <label>
 34             <span></span>
 35             <input type="checkbox" name="t1" value="这是测试1">这是测试1
 36         </label>
 37         <label>
 38             <span></span>
 39             <input type="checkbox" name="t2" value="这是测试2">这是测试2
 40         </label>
 41         <label>
 42             <span></span>
 43             <input type="checkbox" name="t3" value="这是测试3">这是测试3
 44         </label>
 45         <input type="submit" name="" value="提交">
 46     </form>
 47     <script type="text/javascript">
 48         //原生js实现的jquery的siblings()函数
 49         HTMLElement.prototype.siblings = function() {
 50             let arr = []; //保存兄弟节点
 51             let prev = this.previousSibling; //o的前一个同胞节点
 52             //先往上查询兄弟节点
 53             while (prev) {
 54                 if (prev.nodeType == 1 && prev.tagName == this.tagName) {
 55                     arr.unshift(prev); //数组首部插入数组,保证节点顺序
 56                 }
 57                 prev = prev.previousSibling; //把上一节点赋值给prev
 58             }
 59             //往下查询兄弟节点
 60             let next = this.nextSibling; //o的后一个同胞节点
 61             while (next) {
 62                 if (next.nodeType == 1 && next.tagName == this.tagName) {
 63                     arr.push(next); //数组尾部插入,保证节点顺序
 64                 }
 65                 next = next.nextSibling; //下一节点赋值给next,用于循环
 66             }
 67             return arr;
 68         }
 69         //判断HTMLElement是否含有某个class
 70         HTMLElement.prototype.hasClass = function(cls) {
 71             return this.className.match(new RegExp(‘(\\s|^)‘ + cls + ‘(\\s|$)‘));
 72         }
 73         //HTMLElement对象添加类
 74         HTMLElement.prototype.addClass = function(cls) {
 75             if (!this.hasClass(cls)) this.className += " " + cls;
 76         }
 77         //HTMLElement对象删除类
 78         HTMLElement.prototype.removeClass = function(cls) {
 79             if (this.hasClass(cls)) {
 80                 var reg = new RegExp(‘(\\s|^)‘ + cls + ‘(\\s|$)‘);
 81                 this.className = this.className.replace(reg, ‘ ‘);
 82             }
 83         }
 84         //实现函数
 85         function nativeSelfRadio(dom) {
 86             //减少对dom的访问
 87             var span=dom.getElementsByTagName("span")[0];
 88             var input=dom.getElementsByTagName("input")[0];
 89             //有则删除或者不选中,没有则添加或者选中
 90             if (span.hasClass("active")) {
 91                 span.removeClass("active");
 92                 input.checked=false;
 93             }else{
 94                 span.addClass("active");
 95                 input.checked=true;
 96             }
 97
 98
 99         }
100         //绑定事件
101         var len=document.getElementById("ceshi").getElementsByTagName("label");
102         for (var i = 0; i < len.length; i++) {
103             //避免返回该页面,隐藏的checkbox依然选中
104             len[i].getElementsByTagName("input")[0].checked=false;
105             len[i].onclick=function(e){
106                  nativeSelfRadio(this);
107                  e.preventDefault();
108             }
109         }
110
111     </script>
112 </body>
113
114 </html>

本文结束。

原文地址:https://www.cnblogs.com/zhensg123/p/8656133.html

时间: 2024-10-12 10:14:38

原生javascript自定义input[type=checkbox]效果的相关文章

自定义input[type=&quot;checkbox&quot;]的样式

对复选框自定义样式,我们以前一直用的脚本来实现,不过现在可以使用新的伪类 :checkbox 来实现. 如果直接对复选框设置样式,那么这个伪类并不实用,因为没有多少样式能够对复选框起作用.不过,倒是可以基于复选框的勾选状态借助组合选择符来给其他元素设置样式. 很多时候,无论是为了表单元素统一,还是为了用户体验良好,我们都会选择 label 元素和 input[type="checkbox"] 一起使用.当<label>元素与复选框关联之后,也可以起到触发开关的作用. 思路:

关于input 的选中,自定义input[type=&quot;checkbox&quot;]样式

原文 1.css 呈现   选中后 的input的样式可以用 /*背景图*/      background:url('../pc/images/archives/icon_choosed.png') no-repeat center center;  ) 代码 1 /*input 选中前的样式*/ 2 input[type="checkbox"] + label::before { 3 content: "\a0"; /*不换行空格*/ 4 display: in

input[type=checkbox]

一个问题,今天用jquery-1.11.3.min.js时遇到的关于input复选框的问题. 类似于以下代码: <ul class="demo">  <li><label ><input type="checkbox"/>首页</label></li>  <li><label ><input type="checkbox"/>关于</

&lt;input type=&quot;radio&quot; &gt;与&lt;input type=&quot;checkbox&quot;&gt;值得获取

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html> <html> <head> <meta http-equiv="content-

关于input[type=&#39;checkbox&#39;]全选的问题

今天在做一个全选功能的时候,发现了一个问题,就是如果我在选择全选之前,我就已经选择了一个input,然后我再去选择全选并且以后再取消全选的时候,这个我之前选择的input始终处于选择状态,但是他的checked的值一直是在true和false之间变化,当checked=false的时候,仍然是被选中的.到现在还没处理好这个问题.希望看到的哪位大神能给个好的解决办法,实在感激.下面是类似的代码. <!DOCTYPE html><html lang="en"><

jsp &lt;input type=&quot;checkbox&quot;&gt;标记的空指针异常

今天看到书上的一段代码是这样的: 这是<input  type="checkbox">标记的代码 <br>选择你喜欢的歌手: <input type="checkbox" name="singer" value="张">张歌手 <input type="checkbox" name="singer" value="李">

jsp &lt;input type=&quot;checkbox&quot; name=&quot;fileId&quot;&gt; 是否选中

jsp <input type="checkbox" name="fileId"> 是否选中 var a = document.getElementsByName("fileId");for(k in a){ if(a[k].checked){ alert(是); }else{ alert(否); } }

jQuery操作&lt;input type=&quot;checkbox&quot;&gt;

<input type="checkbox">: 1 2 3 4 5 2012欧洲杯"死亡之组"小组出线的国家队是:<br> <input type="checkbox" name="nation" value="Germany">德国 <input type="checkbox" name="nation" value=&q

jQuery操作 input type=checkbox的实现代码

jQuery操作 input type=checkbox的实现代码 jQuery操作 input type=checkbox的实现代码,需要的朋友可以参考下,这边脚本之家推荐大家看我们以前发布的文章 复制代码 代码如下: <input type="checkbox">: 2012欧洲杯"死亡之组"小组出线的国家队是:<br> <input type="checkbox" name="nation"