首先呢是要做一个表单,提交,本没什么难的,其中有一个重量需要实时计算,结果问题就来了。
想要实现类似这样的效果 ,
用的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,所以还是都用正规的,否则一个小坑,就可能跌很久。。。。