js获取html input 单选框值的问题

news/2024/12/29 13:19:00/

测试代码:

ratio.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="ratio.js"></script>
</head>
<body><input type="radio" name="travelmode" id="DRIVING" value="DRIVING" checked/><label for="DRIVING">DRIVING</label><input type="radio" name="travelmode" id="BICYCLING" value="BICYCLING" /><label for="BICYCLING">BICYCLING</label><input type="radio" name="travelmode" id="TRANSIT" value="TRANSIT" /><label for="TRANSIT">TRANSIT</label><input type="radio" name="travelmode" id="WALKING" value="WALKING" /><label for="WALKING">WALKING</label>
</body>
</html>

ratio.js

var radios = document.getElementsByName("travelmode");
console.log(radios)
console.log(radios.length)
for (var i = 0; i < radios.length; i++) {if(radios[i].checked){console.log("当前选中的值为:", radios[i].value)}
}

测试:

使用浏览器打开ratio.html,并按F12查看Console控制台输出如下图:

发现问题

console.log(radios)语句能看到数据NodeList(4)有数据,且length的值为4

而console.log(radios.length) 打印radios.length的结果却为0

因为ratios.length的实际值为0,所以程序没有进入for循环语句。

原因

    经过一番折腾,发现原来是因为js加载的顺序问题。js在head里引入,而ratio在head之后的body标签里,程序按顺序加载,js在input标签之前加载,自然加载不到input标签的数据。

解决问题

方法1.把js放在input标签之后,当input标签加载完成后,再加载js脚本。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>    
</head>
<body><input type="radio" name="travelmode" id="DRIVING" value="DRIVING" checked/><label for="DRIVING">DRIVING</label><input type="radio" name="travelmode" id="BICYCLING" value="BICYCLING" /><label for="BICYCLING">BICYCLING</label><input type="radio" name="travelmode" id="TRANSIT" value="TRANSIT" /><label for="TRANSIT">TRANSIT</label><input type="radio" name="travelmode" id="WALKING" value="WALKING" /><label for="WALKING">WALKING</label><script src="ratio.js"></script>
</body>
</html>

方法2.引入js的script标签加上defer属性,当页面已完成加载后,才会执行js脚本。

<script src="ratio.js" defer></script>

任选方法1和方法2其中一种方法解决,浏览器打开效果如下:

可以看到打印radios.length的结果却为4,for循环语句也执行了。

总结

从这个问题可以看出,js加载的先后顺序对程序还是有较大的影响的,这也是为什么建议把引入js的语句放在body最后的原因了。

完成!enjoy it! 


http://www.ppmy.cn/news/150926.html

相关文章

Nginx通过SplitClient进行AB测试以及负载均衡分流

文章目录 前言一、Split Clients是什么&#xff1f;二、使用步骤2.1 根据User-Agent进行分流2.2 根据Cookie进行分流2.3 根据IP地址进行分流2.4 根据时间进行分流2.5 根据随机数进行分流 总结 前言 Nginx是一个被广泛应用的Web服务中间件&#xff0c;今天分享一下如何用它做AB…

继电器带大功率容性负载,启动过程拉弧解决办法

1.选择固态继电器&#xff0c;没有火花了&#xff0c;价格贵。 2.单个200w开关电源&#xff0c;通电瞬间就有40A左右的电流&#xff0c; 建议选择大容量的触点。 3.分时启动&#xff0c;选择不同梯度的延时继电器。我目前用的是这种。 4.并联RC吸收&#xff0c;但是效果不明显。…

600W个微信红包封面,人人都能领取到!!!

过年啦&#xff0c;祝大家春节快乐 牛年大吉&#xff0c;万事如意&#xff01; 别忘了春节还有红包封面领取 新的一年愿大家财运亨通&#xff01; 新年过完了&#xff0c;整理情绪上班了&#xff0c;祝福没有断&#xff0c;问候也依然。努力工作多表现&#xff0c;年后年终奖永…

600W 28KHZ/40KHZ 超声波电路线路板PCB设计

600W 28KHZ/40KHZ 超声波电路线路板PCB采用高精度的运行芯片&#xff0c;在追频率的速度和精度来说得到了很大的提高&#xff0c;特别是水位发生变化或者有清洗篮子的时候能快速找到频率。由于采用了高精度的运行芯片在很多的功能上可以实现&#xff0c;特别是脉冲超声波和加强…

mysql存储过程批量插入数据,构造 15w,150w,600w表

#构造15万(customer表)&#xff0c;150万(orders表)&#xff0c;600万(LINEITEM表)数据差异较大的三张表&#xff0c; #只有数据量最大的表包含主键索引&#xff0c;对上述表进行三表联合查询&#xff0c;对比之前版本查询所耗时间 ##########################################…

天合光能分布式组件如何?600W+分布式大势所趋,引领未来!

7月23日至25日&#xff0c; 2022第十七届中国(济南)国际太阳能利用大会暨中国&#xff08;山东&#xff09;国际新能源产业博览会在济南高新国际会展中心成功举办&#xff0c;天合光能携P型至尊550W——670W系列超高功率组件&#xff0c;N型至尊双面双玻组件以及天合富家原装家…

KDSL-82轻型升流器

一、产品概述 KDSL-82 1000A大电流发生器是一种作为检验用的电流源&#xff0c;大电流试验器采用ARM芯片控制输出工艺和大容量的环形变压器&#xff0c;并且配有液晶屏显示的表计&#xff0c;同时显示一、二次电流、变比和秒表接点(或电位)的动作时间。外配铝合金机箱&#xff…

PW5100-50原厂DC-DC的同步升压转换器芯片兼容替换

概述 PW5100-50是一款高效率、 低功耗、 低纹波、 高工作频率的 PFM 同步升压 DC/DC 变换器。 输出电压可选固定输出值&#xff0c; 从 3.0V 至 5.0V 的固定输出电压. PW5100-50仅需要三个外围元件&#xff0c; 就可将低输入电压升压到所需的工作电压。 系统的工作频率高达 …