使用事件代理 让input获得焦点 focus 后 但是像下面代码这样做 会导致alert一直弹出

发布于 2022-09-06 02:16:12 字数 1076 浏览 23 评论 0

想用事件代理给input添加焦点和取消焦点事件,但是我这样写了之后会导致,alert弹窗一直出现,一直弹窗。这样写的代码确实不好,但是我想知道问题出在了哪里(Ps:给个链接也行。。。)。谢谢各位。

<body>
        <form>
            <table>
                <tr>
                    <td>名称:</td>
                    <td><input type="text"></td>
                </tr>
                <tr>
                    <td></td>
                    <td><p>必填,长度为4-10个字符</p></td>
                </tr>
            </table>
            <button>提交</button>
        </form>
<script>
    document.getElementsByTagName('table')[0]
        .addEventListener('focus',function (event) {
                var event=event||window.event,//兼容ff
                    target=event.target||event.srcElement;//兼容ie
                if (target.nodeName.toLocaleLowerCase()==="input"){
                    alert(target.nodeName);
                }
        },true);//我查到了,onfocus,onchange等事件是不会在dom树上冒泡的
</script>

页面图片一直没法上传。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梨涡 2022-09-13 02:16:12

首先你点击input触发了focus事件,出现弹窗,点击确认后弹窗关闭是会让input再次获得焦点的,这又触发focus,导致不停弹窗,你可以验证一下弹窗关闭input是否会再次获得焦点

 var i=0;
 document.getElementsByTagName('table')[0]
        .addEventListener('focus',function (event) {
                i++;
                var event=event||window.event,//兼容ff
                    target=event.target||event.srcElement;//兼容ie
               if(i<=2){
                if (target.nodeName.toLocaleLowerCase()==="input"){
                    alert(target.nodeName);
                }
               }
        },true);
萌化 2022-09-13 02:16:12

上面分析的是正确的。另外一种方法:可以自己写弹窗,封装成公用的方法,一来比原生弹窗美观,二来自己可以做额外处理(加回调什么的,同时不会阻断程序运行。)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文