spans[i]中和str[i]中的i没有办法与input[i]中的i共用

spans[i]中和str[i]中的i没有办法与input[i]中的i共用

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>Document</title>

    <style type="text/css">

        *{

            margin:0;

            padding: 0;

        }

        .wrapper{

            width: 800px;

            height: 600px;

            margin: 100px auto;

        }

        .wrapper header{

            width: 100%;

            height: 40px;

            color: white;

            background-color: #6495ED;

        }

        .wrapper header p{

            line-height: 40px;

            font-size: 20px;

            padding-left: 10px;

        }

        form{

            width:100%;

            height: 520px;

            background:#DEDEDE;

            text-align: center;

            padding:30px 0;

            margin:0 auto;

            position: relative;

        }

        form p{

            display: inline-block;

            position: absolute;

            right: 500px;

        }

        form div{

            margin-top: 10px;

        }

        form input{

            height: 25px;

        }

        form #sex{

            margin-left:-132px;

        }

        form #submit{

            width: 90px;

            height: 50px;

            font-size:20px;

            border-radius: 10px;

            background-color: #436EEE;

            color: white;

            margin-top: 20px;

        }

    </style>

</head>

<body>

    

    <div class="wrapper">

        <header>

            <p>用户注册</p>

        </header>

        <form id="form">

            <div>

                <p>用户名:</p><input type="text" name="name" id="username" ><span class="present"></span>

            </div>

            <div>

                <p>登录密码:</p><input type="text" name="name" id="pass" ><span class="present"></span>

            </div>

            <div>

                <p>确认密码:</p><input type="text" name="name" id="username" ><span class="present"></span>

            </div>

            <div>

                <p>姓名:</p><input type="text" name="name" id="username" ><span class="present"></span>

            </div>

            <div>

                <p>性别:</p><select id="sex"><option value="男" selected>男</option><option value="女">女</option></select><span></span>

            </div>

            <div>

                <p>身份证号码:</p><input type="text" name="name" id="username" ><span class="present"></span>

            </div>

            <div>

                <p>邮箱:</p><input type="text" name="name" id="username" ><span class="present"></span>

            </div>

            <div>

                <p>电话:</p><input type="text" name="name" id="username" ><span class="present"></span>

            </div>

            

            <input type="submit" value="提交" id="submit">

        </form>

        


    </div>


    <script type="text/javascript">

        var spans=document.getElementsByTagName("span");

        var forms=document.getElementById("form");

        var inputs=forms.getElementsByTagName("input");

     var submit=document.getElementById("submit");

     var input1=false;

     var input2=false;

        var input3=false;

        var input4=false;

        var input5=false;

        var input6=false;

     var input7=false;

        <!-- 各个需要验证的正则实例函数 --> 

        var reg=[/^[a-z]\w{5,17}$/i,//账号验证

                 /^\S[6,18]$/,//密码验证

                 /^\S[6,18]$/,//确认密码

                  /^[\u4e00-\u9fa5]{2,4}$/,//中文名验证

                 null,

                 /^\d{17}[0-9x]$|^\d(15)$/,//身份证号码验证

                 /^\w+@\w+\.[a-zA-Z_]{2,4}$/i,//邮箱验证

                 /^\d{11}$///电话号码验证

            ];

        var str=["6-20位字母、数字或“_”,字母开头",

                 "6-18位,包括数字字母或符号,中间不能有空格",

                 "请输入密码",

                 "真实姓名,两位到四位的中文汉字",

                 null,

                 "请输入18位的身份证号码",

                 "请输入邮箱",

                 "请输入电话号码"

            ];

            var str2={

                '1':"格式不正确",

                '2':"两次输入密码不一致",

            };

        <!-- input获得焦点之后的内容显示 --> 

        for( i=0;i<inputs.length;i++){

            inputs[i].onfocus=function(){


                spans[i].innerHTML=str[i];

            

        }





    </script>

</body>


</html>

就作用域而言,内部应该是能访问到外部,而且for定义的还是全局的变量,为什么无法访问呢

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

你好,for循环给每一个输入框绑定onfocus事件,可以这样理解:

http://img1.sycdn.imooc.com//climg/5d3121200001c91904380219.jpg

每个元素都会有onfocus事件,但是里面并没有保存循环的i值,所以当执行事件获取i值的时候找到的就是循环之后的i值。

如果外面加了立即执行函数,就会在每个事件作用域中保存循环的i值,这样就会对应起来。

可以再测试理解下。

好帮手慕星星 2019-07-18 14:32:40

同学你好,

onfocus事件中用到i的值,当前作用域中没有i值,就会沿着作用域向上找,找到的就是for循环完毕之后的i值,循环停止后i值为8,而数组(spans和str)长度为8,最后一项索引为7,所以元素是不存在的,使用innerHTML就会报错。之前在js变量,作用域部分是讲解过的,如果忘记了可以回顾一下哦。

这里可以使用立即执行函数,在当前作用域中保存每次循环的i值,参考:

http://img1.sycdn.imooc.com//climg/5d3010d2000188da05130195.jpg

修改之后测试效果:

http://img1.sycdn.imooc.com//climg/5d3010df00014db608040089.jpg

有布局问题,没有预留span标签的位置,所以内容显示出来会重新计算居中显示的位置,而p标签用的是定位,位置不会改变。建议提前预留span标签的位置,聚焦的时候添加内容就好,或者也改成定位,固定显示的位置,如下:

http://img1.sycdn.imooc.com//climg/5d30126f0001a7ee02920103.jpg

http://img1.sycdn.imooc.com//climg/5d3012780001a79906310088.jpg

自己试着改一改,祝学习愉快!

望采纳~

  • 提问者 慕用0863198 #1
    这里不是在循环过程中绑定,而在每一次循环的过程中寻找上一个未曾变化的i值不成立嘛 而加入function后是将i值传入一个单独的作用域,如果不加入function意味着i的作用域只是for循环完成之后的值?
    2019-07-18 21:17:10
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
组件化思想开发电商网页 18版
  • 参与学习           人
  • 提交作业       467    份
  • 解答问题       4826    个

本路径带你通过系统学习HTML5、JavaScript、jQuery的进阶知识,不仅如此,还会学习如何利用组件化的思想来开发网页,知识点+案例,使得所学可以更好的得到实践。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师