Jquery 全选、反选问题解析

  最近工作中,需要使用Jquery实现复选框的全选和反选,本人虽然不是专职撸前端的,但这个小问题感觉也没什么难度,下面直接上代码:

        <div id="list">
       <ul class="mui-table-view textOverflow" id="notesList" >
                <li><input type="checkbox" name="notices" value="1"> 篮球</li>
                <li><input type="checkbox" name="notices" value="1"> 足球</li>
                <li><input type="checkbox" name="notices" value="1"> 乒乓球</li>
                <li><input type="checkbox" name="notices" value="1"> 羽毛球</li>
                <li><input type="checkbox" name="notices" value="1"> 排球</li>
            </ul>
    </div>
    <input type="button" id="all" value="全选/全不选">
    <input type="button" value="全选" class="btn" id="selectAll">
    <input type="button" value="全不选" class="btn" id="unSelect"> 

  Jquery的代码是这样实现的:

$("#list :checkbox").each(function () {

                if ($(this).attr("checked") == true) {   

                    $(this).attr("checked",false) ;
                }
                else {
                     $(this).attr("checked",true);
                }
             }); 

  逻辑上是没什么问题的,但是结果却出乎意料,全选之后,再次点击,页面直接没反应了,首先检查了一遍代码,发现没有什么语法的问题,继续寻找问题,我用的是chrome 浏览器,进度debug模式,发现js脚本也没报错,我刚开始以为是浏览器的兼容性问题,使用IE10,火狐调试依然有这个问题,很是苦恼,就在网上寻找答案,有人提示说 attr和prop在jquery中的用法可能不太一样,于是就去寻找jquery API,

果然找到了 可用的信息,以下是官网文档说明:

Attributes vs. Properties

attributesproperties之间的差异在特定情况下是很重要jQuery 1.6之前 ,.attr()方法在取某些 attribute 的值时,会返回 property 的值,这就导致了结果的不一致。从 jQuery 1.6 开始, .prop()方法 方法返回 property 的值,而 .attr() 方法返回 attributes 的值。

例如, selectedIndextagNamenodeNamenodeTypeownerDocumentdefaultChecked, 和 defaultSelected 应使用.prop()方法进行取值或赋值。 在jQuery1.6之前,这些属性使用.attr()方法取得,但是这并不是元素的attr属性。他们没有相应的属性(attributes),只有特性(property)。

例如,考虑一个DOM元素的HTML标记中定义的<input type="checkbox" checked="checked" /> ,并假设它是一个JavaScript变量命名的e

elem.checked true (Boolean) 将随着复选框状态的改变而改变
$(elem).prop("checked") true (Boolean) 将随着复选框状态的改变而改变
elem.getAttribute("checked") "checked" (String) 复选框的初始状态;不会改变
$(elem).attr("checked") (1.6) "checked" (String) 复选框的初始状态;不会改变
$(elem).attr("checked") (1.6.1+) "checked" (String) 将随着复选框状态的改变而改变
$(elem).attr("checked") (pre-1.6) true (Boolean) 将随着复选框状态的改变而改变

根据W3C的表单规范 ,在checked属性是一个布尔属性, 这意味着,如果这个属性(attribute)是目前存在, 即使,该属性没有对应的值,或者被设置为空字符串值,或甚至是"false",相应的属性(property)为true。 这才是真正的所有布尔属性(attributes)。

然而,要记住的最重要的概念是checked特性(attribute)不是对应它checked属性(property)。特性(attribute)实际对应的是defaultChecked属性(property),而且仅用于设置复选框最初的值。checked特性(attribute)值不会因为复选框的状态而改变,而checked属性(property)会因为复选框的状态而改变。因此,  跨浏览器兼容的方法来确定一个复选框是否被选中,是使用该属性(property):

  • if ( elem.checked )
  • if ( $(elem).prop("checked") )
  • if ( $(elem).is(":checked") )

对于其他的动态属性,同样是true,比如 selected 和 value.

以上API说的很清楚,checked是布尔属性,而checked特性不是对应它checked属性,它对应的是defaultChecked属性,即它是不会随着复选框的状态而改变的。

此时我看了我的Jquyer 版本

<script type="text/javascript" src="jquery-1.11.1/jquery.min.js"></script>

1.11.1比1.6.1高了好几个版本,我首先把上面的代码的attr方法全部替换成prop方法,测试,通过,好使

然后我又从网上下载一个比1.6.1版本低的jquery,用以上的代码,也可以实现 全选/反选。

时间: 2024-11-06 17:47:57

Jquery 全选、反选问题解析的相关文章

jQuery全选反选插件的写法

jQuery全选反选插件,经易让你实现一个表单列表数据的全选与取消全选功能,内含示例,小巧实用.自动判断当前选中数量,加上全选.在没有jQuery之前,我们需要一大段js代码来实现这种效果.有了jQuery这个强大的库之后,我们可以很方便的开发实现这种效果的jQuery插件.我将它命名为jQuery.fn.check插件.前端框架分享 在构建我们的插件之前,我们想考虑一下其功能需求: 所有复选框的状态都随全选复选框的状态而发生变化:如果所有复选框都被选中时,全选复选框立即处于选中状态:如果当前选

jquery 全选 反选 取消 批量删除

首选引入jquery 全选 //全选 function myall(){ $("input[name='d[]']").each(function(index,e){ $(this).prop('checked',true); }); } 取消 //当true改为false时为取消 // function no(){ // $("input[name='d[]']").each(function(index,e){ // $(this).prop('checked'

jQuery全选/反选checkbox

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content=""> <meta name="Author" content=""> <meta name="Keywords&

jquery全选反选

//全选反选$(document).on("click",".all",function(){    if($(".all").is(":checked")){        $(".bll checkbox").prop("checked", true);    }else    {        $(".bll checkbox").prop("chec

简单的jquery全选反选案例

本demo适合刚学习jQuery的战友学习. 一个星期平均有4次晚上是吃  某荔村肠粉,所以内容就是我晚上经常点吃的那些.一般我都是吃14块钱. 效果如图: HTML代码: 1 <ul id='food'> 2 <li><input type="checkbox" value='8'>8元 红豆沙</li> 3 <li><input type="checkbox" value='5'>5元 青菜

关于jquery全选反选 批量删除的一点心得

废话不多说直接上代码: 下面是jsp页面的html代码: <table id="contentTable" class=""> <thead> <tr> <th><input type="checkbox" id="All" value="全选/全不选" />全选/全不选</th> </tr> </thead>

JQuery全选/反选设置

/**  * HTML代码  */ <div class="checkbox-filter">     <label class="select"><span>近一年</span></label>     <label class="cut"></label>     <label val="1Min" class="cb&qu

jquery实现全选/反选功能

<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>多选框全选/反选</title> <script src="http://res01.xesimg.com/jquery/jquery.min.js">&l

jQuery 复选框全选/取消全选/反选

jQuery实现的复选框全选/取消全选/反选及获得选择的值. 完整代码: <!DOCTYPE html> <html> <head> <script type="text/javascript" src="../js/jquery-1.9.1.js"></script> <script type="text/javascript"> $(document).ready(fun