论遇到的attr的坑

解决input值undefined问题
本文介绍了一种在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,所以还是都用正规的,否则一个小坑,就可能跌很久。。。。

### attr 在编程中的含义及使用方法 #### 1. **jQuery 中的 `attr` 方法** 在 jQuery 中,`attr` 方法是一个强大的工具,用于获取或设置 HTML 元素的属性。它不仅可以处理标准的 HTML 属性(如 `id`、`class` 等),还可以操作自定义属性。通过回调函数,可以基于当前属性值动态生成新的属性值,从而增强代码的灵活性和可扩展性[^1]。 ```javascript // 获取属性值 $("element").attr("attributeName"); // 设置属性值 $("element").attr("attributeName", "value"); // 使用回调函数动态设置属性值 $("element").attr("attributeName", function(index, oldValue) { return newValue; }); ``` #### 2. **Python 中的 `attr` 和 `attrs`** 在 Python 中,`attr` 和 `attrs` 是两个不同的库或模块。`attr` 是一个早期的库,而 `attrs` 是其后续更成熟的版本。两者都用于简化类的定义,减少样板代码。 - **问题背景**:当使用 `sklearn` 的 `LabelEncoder` 时,如果 `attr` 版本较低(如 0.3.1),可能会遇到类似 `attr.ib` 不认识 `convert` 参数的问题。解决方法是卸载旧版 `attr` 并安装新版 `attrs`,确保版本兼容性(如 19.1.0)。此外,Jupyter Notebook 的闪退问题也可能与 `attr` 或 `attrs` 的版本冲突有关[^2]。 - **解决方案**: ```bash pip uninstall attr pip install attrs==19.1.0 ``` #### 3. **C/C++ 中的属性 (`attr`)** 在 C/C++ 中,`attr` 指的是属性Attributes),它们为类型、对象、代码等引入了由实现定义的特性。属性提供了一种统一化的语法来支持各种语言扩展(如 GNU 的 `attribute((…))` 和微软的 `__declspec()`)。这些属性可以应用于几乎所有的程序元素,但具体的有效范围取决于实现[^3]。 - **语法示例**: ```cpp [[nodiscard]] int compute_value(); // 建议不要忽略返回值 [[deprecated]] void old_function(); // 标记为过时的函数 ``` #### 4. **JavaScript 中的 `attr` 和 `prop` 区别** 在 JavaScript 中,`attr` 和 `prop` 都可以用于操作 DOM 元素的属性,但它们的行为有所不同。`attr` 主要用于操作 HTML 属性,而 `prop` 则直接操作 DOM 属性。对于布尔值属性(如 `checked`),`prop` 返回的是布尔值,而 `attr` 返回的是字符串或 `undefined`[^4]。 - **代码示例**: ```javascript console.log($("input").prop("checked")); // true 或 false console.log($("input").attr("checked")); // "checked" 或 undefined ``` #### 5. **线程属性 (`pthread_attr`)** 在 POSIX 线程编程中,`pthread_attr` 是一个结构体,用于定义线程的属性(如分离状态、堆栈大小等)。通过 `pthread_attr_init` 初始化属性,并使用 `pthread_attr_setdetachstate` 设置线程的分离状态。分离状态决定了线程是否需要显式调用 `pthread_join` 来回收资源[^5]。 - **代码示例**: ```c #include <pthread.h> pthread_attr_t attr; pthread_t thread; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&thread, &attr, thread_function, NULL); pthread_attr_destroy(&attr); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值