论遇到的attr的坑

本文介绍了一种在JavaScript中处理input元素时遇到的值为undefined的问题,并详细解释了如何通过改变属性设置方法从attr切换到prop来解决这个问题。

首先呢是要做一个表单,提交,本没什么难的,其中有一个重量需要实时计算,结果问题就来了。

想要实现类似这样的效果 ,这里写图片描述
用的input,但是input 隐藏掉了,用label指向,但是写的时候 label没有套住input,

<input type="radio" name="material" value="304" id="a304" checked />
<label for="a304" class="on">304</label>

然后在label点击的时候 js里的事件如下:

    $('label').click(function(){
        $(this).addClass('on').siblings().removeClass('on');
        $(this).siblings('input').attr('checked',false);
        $(this).prev().attr('checked',true);
        count_weight(); 

    })
    function count_weight(){
        console.log('count');
        var material = $("input[name='material']:checked").val();
        var meshNumber = $("input[name='meshNumber']:checked").val();

        var wireDia = $("input[name='wireDia']:checked").val();
        var swidth = $("input[name='swidth']:checked").val();

        var res = meshNumber*meshNumber*wireDia*swidth*15;
        $('#weight').html(res);
        $("input[name='weight']").val(res);
    }

注意上面用的是attr,导致在这个坑里待了很久,count_weight,是计算重量的,根据用户选择的数据实时的计算,
刚开始的问题就是 比如目数,重复点击一个目数,重量里就是空值 ,后来发现,目数这里val()得到的值是undefined,在控制台里直接用$(“input[name=’meshNumber’]:checked”).val()都可以得到值 ,然后就纳闷了,为什么是undefined,后来在设置input选中的时候,由attr改用prop

$('label').click(function(){
        $(this).addClass('on').siblings().removeClass('on');
        $(this).siblings('input').prop('checked',false);
        $(this).prev().prop('checked',true);
        count_weight(); 

    })

问题解决。
attr与prop的区别在于:


对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。
对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法。


对于 Input select这一类表单控件,都用prop,如果用attr取得值,就会得到undefined,如果用attr设置值 的时候 ,用val()就会得到 undefined
我之所以只在重复点击的时候有问题,是因为浏览器之间的差异,我测试的时候是在微信web开发者工具里测试的,那个里面在重复点击的时候有问题,不重复的时候没问题,然后写了个demo在本地chrome浏览器里测试 用attr设置的值,用val()获取都是undefined

还有一点就是我的label没有包住input,label与Input有两种联系


显式的联系:

<label for="SSN">Social Security Number:</label>
<input type="text" name="SocSecNum" id="SSn" />

隐式的联系:

<label>Date of Birth: <input type="text" name="DofB" /></label>

我用的第二种,不用for应该 也可以,最后我的测试结论是
如果label包住了Input,我用attr设置值也Ok的,如果没有包住Input,那么用attr设置就会有bug,所以还是都用正规的,否则一个小坑,就可能跌很久。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值