javascript - radio按钮使用onclick和onfocus触发事件的区别
怪我咯
怪我咯 2017-04-11 10:26:02
[JavaScript讨论组]

做了一个计算运费的小应用,当点选地区的时候触发计算函数,计算函数会获取该地区对应的value,最后算出总运费。但当我使用onfocus事件来触发函数的时候,获取到的value是上一次的value,如下图,默认广州(value=1)为checked,当点击上海(value=4)的时候,打印出来的却是1(本应该是4),使用onclick事件或者再点击一次上海就正常(打印出4)了,我的设想是onfocus先于radio的checked,因此第一次点击(focus)上海时触发函数使用广州的value,函数执行后上海再被选中(checked),第二次点击上海执行函数时就使用上一次的value。描述可能不是很清晰,大神们试着输入1.3然后选择上海,出来的结果是6.5(错误),再选择上海才是9.5(正确)。基于这个案例希望大神解释下onfocus在这里的运作原理,能说下onclick和onfocus的区别更佳,现行致谢!




    
        
        
        运费计算器
        
    

    
        

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(2)
迷茫

我没有看明白你的意思,但是
1.代码中,fource 的value 不需要用for 去获取,

onfocus="javascript: getExFee(this);"

然后修改 getExFee() 函数 getExFee(obj) 并修改下面代码

region = obj.value;

            /*
            for (var i = 0; i < regions.length; i++) {
                if (regions[i].checked == true) {
                    region = regions[i].value;
                }
            }*/ 

2,每个 input 里去绑定 onfocus 太麻烦,可以用bind 或类似如下

var i = regions.length;
            while( i-- ){
                regions[i].onfocus=(getExFee(regions[i]));
            }

进行事件绑定

高洛峰

设置checked属性值(默认的行为),在focus事件处理函数处理完之后
getExFee(event)能获取触发focus事件的DOM元素,进而做相应的逻辑处理
focus事件是不支持冒泡的~~~

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<input id="heilongjiang" type="radio" name="region" value="7" onfocus="javascript: getExFee(event);">
<label for="heilongjiang">黑龙江</label>

    <input id="gansu" type="radio" name="region" value="10" onfocus="javascript: getExFee(event);">
    <label for="gansu">甘肃</label>

    <input id="neimenggu" type="radio" name="region" value="10" onfocus="javascript: getExFee(event);">
    <label for="neimenggu">内蒙古</label>

<input id="guangzhou" type="radio" name="region" value="1" checked="checked" onfocus="javascript: getExFee(event);">
<label for="guangzhou">广州</label>

    <input id="guangdong" type="radio" name="region" value="1" onfocus="javascript: getExFee(event);">
    <label for="guangdong">广东</label>

    <input id="shanghai" type="radio" name="region" value="4" onfocus="javascript: getExFee(event);">
    <label for="shanghai">上海</label>

    <input id="jiangsu" type="radio" name="region" value="4" onfocus="javascript: getExFee(event);">
    <label for="jiangsu">江苏</label>

<script>
    var regions = document.getElementsByName("region");

    function getExFee(event){
        //一个元素获取获取焦点,checked为false
        console.log("focused input[id=%s] checked:",event.target.id,event.target.checked);
        console.log("focused input[id=%s] value:",event.target.id,event.target.value);

    }
</script>
</body>
</html>

或者

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<input id="heilongjiang" type="radio" name="region" value="7" >
<label for="heilongjiang">黑龙江</label>

    <input id="gansu" type="radio" name="region" value="10" >
    <label for="gansu">甘肃</label>

    <input id="neimenggu" type="radio" name="region" value="10" >
    <label for="neimenggu">内蒙古</label>

<input id="guangzhou" type="radio" name="region" value="1" checked="checked" >
<label for="guangzhou">广州</label>

    <input id="guangdong" type="radio" name="region" value="1" >
    <label for="guangdong">广东</label>

    <input id="shanghai" type="radio" name="region" value="4" >
    <label for="shanghai">上海</label>

    <input id="jiangsu" type="radio" name="region" value="4" >
    <label for="jiangsu">江苏</label>

<script>
    var regions = document.getElementsByName("region");

    document.addEventListener("focus",function(event){
        var focusTargetDom=event.target;
        if(focusTargetDom.tagName.toLowerCase()=="input"&&focusTargetDom.getAttribute("name")=="region"){
            //一个元素获取获取焦点,checked为false
            console.log("focused input[id=%s] checked:",focusTargetDom.id,focusTargetDom.checked);
            console.log("focused input[id=%s] value:",focusTargetDom.id,focusTargetDom.value);
        }
    },true);
</script>
</body>
</html>
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号