js 检测 checkbox 状态时遇到的“诡异”问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
abccba
V2EX    Javascript

js 检测 checkbox 状态时遇到的“诡异”问题

  •  
  •   abccba 2015-04-03 14:32:24 +08:00 4833 次点击
    这是一个创建于 3845 天前的主题,其中的信息可能已经有所发展或是发生改变。

    环境:Firefox 31.3.0 (Linux/Windows)

    通过按钮是否被选中控制另一个组件是否显示,以下代码不work,可能是什么原因呢?
    调试发现,无论check或者uncheck按钮,$('#op-checkbox').checked总是为假。

    $('#op-checkbox').click(function(){ if( $('#op-checkbox').checked ){ alable.show(); } else{ alable.hide(); } }); 
    第 1 条附言    2015-04-03 15:26:44 +08:00
    jquery-1.11.1
    第 2 条附言    2015-04-03 15:48:16 +08:00
    本人又二逼一回,感谢大家帮助!已经找到原因了。非常感谢各位朋友的!
    26 条回复    2015-04-03 18:43:29 +08:00
    jianghu52
        1
    jianghu52  
       2015-04-03 14:38:34 +08:00
    jquery的经典问题啊。你那个checked都不是标准属性。
    jquery判断checked的三种方法:

    .attr('checked'): //看版本1.6+返回:"checked"或"undefined" ;1.5-返回:true或false
    .prop('checked'): //16+:true/false
    .is(':checked'): //所有版本:true/false//别忘记冒号哦

    另外,如果
    <input type='checkbox' checked>
    <input type='checkbox' checked="checked">
    这样两个checkbox,用attr 得到的返回值好像还不一样。具体怎么不一样忘记了。
    zkd8907
        2
    zkd8907  
       2015-04-03 14:41:15 +08:00
    jquery对象$(xxx)是不包含原生js的element方法和属性的。
    不过你可以使用下面的几个方法做到类似的判断。
    if ( $(elem)[0].checked )
    if ( elem.checked )
    if ( $(elem).prop("checked") )
    if ( $(elem).is(":checked") )
    sneezry
        3
    sneezry  
       2015-04-03 14:42:58 +08:00
    感觉随着浏览器标准统一jQuery会用的越来越少了。
    unknownservice
        4
    unknownservice  
       2015-04-03 14:45:38 +08:00
    用$.prop,读取和设置都是,否则会有兼容问题。
    learnshare/td>
        5
    learnshare  
       2015-04-03 14:50:47 +08:00
    prop 是运行状态,attr 是标签属性。checked 是什么东西?
    abccba
        6
    abccba  
    OP
       2015-04-03 14:55:13 +08:00
    @jianghu52 @zkd8907 谢谢,两位说的方法还是不work呀,好奇怪。

    .attr('checked') 和 .prop('checked') 还有if ( $(elem)[0].checked ) 无论选中或者不选中,都返回 "undefined"
    .is(':checked') 永远返回false.

    哪里姿势不对。。。快疯了。。。
    br00k
        7
    br00k  
       2015-04-03 15:02:04 +08:00
    $('#op-checkbox:checked').length
    jianghu52
        8
    jianghu52  
       2015-04-03 15:03:00 +08:00
    @abccba 把你的代码贴出来吧。
    需要两部分。
    1.所有引用的js文件名
    2.你的checkbox 的html代码
    qianleilei
        9
    qianleilei  
       2015-04-03 15:04:07 +08:00
    Solution 1:

    $('#op-checkbox')[0].checked
    yizi
        10
    yizi  
       2015-04-03 15:09:57 +08:00
    jQuery是什么版本的?1.7.1的话 is(':checked') 应该没问题的呀。
    abccba
        11
    abccba  
    OP
       2015-04-03 15:37:28 +08:00
    @Yokira 谢谢,是1.11.1版本的。


    @qianleilei 额,还是不行。。。

    @jianghu52 简化整合到1个html文件了,我这里无论怎么点击,都是"undefined",无法区分选中和未选中。。。求帮忙看看,谢谢啦。

    <html>

    <head>
    <script type="text/Javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.1.js"></script>
    <script>
    $(document).ready(function(){
    $('#op-checkbox').change(function(){
    if( $('#op-checkbox').attr('checked') ){
    alert("hi, checked");
    } else{
    alert("hello, unchecked");
    }
    });
    });
    </script>
    </head>

    <body>
    <label id="op-checkbox"><input type="checkbox">op</label>
    </body>

    </html>
    tobeyouth
        12
    tobeyouth  
       2015-04-03 15:37:44 +08:00
    用 @qianleilei 的方法就可以
    checked是dom对象的属性,所以用 $('#op-checkbox')[0] 找到dom对象就行了。
    abccba
        13
    abccba  
    OP
       2015-04-03 15:41:24 +08:00
    @jianghu52 额,上面的贴的有点问题,判断是否checked的是这一句:
    if( $('#op-checkbox').attr('checked') === "undefined" )



    @unknownservice 额,好吧,我研究研究,谢谢。
    x6doooo
        14
    x6doooo  
       2015-04-03 15:43:35 +08:00   1
    -.-||
    这个
    $('#op-checkbox').attr('checked')
    改成
    $('#op-checkbox input').prop('checked')
    abccba
        15
    abccba  
    OP
       2015-04-03 15:44:31 +08:00
    @tobeyouth 好像真不行,无论怎样都选中或者未选中,都是"undefined" :( thx.
    yizi
        16
    yizi  
       2015-04-03 15:46:24 +08:00
    这是什么写法,为什么要把input用label包起来。。
    你这样用$('#op-checkbox')拿到的是label。。。。
    unknownservice
        17
    unknownservice  
       2015-04-03 15:48:02 +08:00
    你这都在label上,当然没有checked了,取下面的input啊。
    jianghu52
        18
    jianghu52  
       2015-04-03 15:50:03 +08:00   1
    幸好让你把代码贴出来了。
    你一直在判断的都是lable的属性。当然没有checked的属性了。
    你给checkbox一个ID,或者像@x6dooo 写的那样,应该就没有问题了。
    abccba
        19
    abccba  
    OP
       2015-04-03 15:50:58 +08:00
    @Yokira @unknownservice 我脑残了,copy来的代码然后改的。谢谢。
    f0rger
        20
    f0rger  
       2015-04-03 15:51:24 +08:00
    取到的是label,又不是checkbox。当然永远是undefined了
    tobeyouth
        21
    tobeyouth  
       2015-04-03 15:51:44 +08:00
    @abccba 是不是页面里多个 $('#op-checkbox')
    你可以这样写:
    $('#op-checkbox').click(function(){
    if( this.checked ){
    alable.show();
    } else{
    alable.hide();
    }
    });
    yizi
        22
    yizi  
       2015-04-03 15:52:18 +08:00
    @abccba 抱歉,可以用label把input包住~~
    crs0910
        23
    crs0910  
       2015-04-03 15:55:12 +08:00
    你在逗我? <label id="op-checkbox">
    $('#op-checkbox') 连 input 都没选到.
    abccba
        24
    abccba  
    OP
       2015-04-03 15:59:48 +08:00
    @tobeyouth 额,是有多个checkbox,分别对应多个“块”,每个checkbox负责一个“块”的显示。
    jinganchuqi
        25
    jinganchuqi  
       2015-04-03 18:17:19 +08:00
    if($("input:checkbox:checked").val()){
    ###
    }
    这样应该可以的!
    andy12530
        26
    andy12530  
       2015-04-03 18:43:29 +08:00
    disabled
    readonly
    autofocus
    checked
    这种属性级的用prop,
    如果是自定义属性,用attr.
    数据型的用data
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     819 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 21:29 PVG 05:29 LAX 14:29 JFK 17:29
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86