【原】相煎何太急——input的blur事件与button的click事件

先来一段引子,最近在写手机h5页面,主要是一些登陆注册方面的,最绕不开的就是表单元素。

我想实现的是:在输入框后边有一个删除图标,当输入东西的时候触发事件,显示删除图标,点击该图标会删除之前输入的内容,离开输入框,该图标消失。

<div class="wrapper">
    <div class="count">
        <label for="person">手机号</label>
        <input id="person" type="text" placeholder="请输入手机号">
        <i class="r btn_delete delete1"><img src="../imgs/btn_Eliminate.png"></i>
    </div>
    <div class="count">
        <label for="pwd">密&nbsp;&nbsp;&nbsp;&nbsp;码</label>
        <input id="pwd" type="text" placeholder="6-18位,建议数字、字母、符号组合">
        <i class="r btn_delete delete2"><img src="../imgs/btn_Eliminate.png"></i>
        <i class="r hide_switch"><img src="../imgs/btn_display_switch.png"></i>
    </div>
    <div class="confirm">
        <label for="msg">短信验证码</label>
        <input id="msg" type="text" placeholder="请输入短信验证码">
        <i class="r btn_delete delete3"><img src="../imgs/btn_Eliminate.png"></i>
        <button class="r receive_msg">获取验证码</button>
    </div>
</div><div class="log">     <button class="btn_register">立即注册</button></div>

之前的预想是:为输入框添加focus和blur事件;

$("#person, #modify_name").focus(function(event) {
        event.preventDefault();
        $(this).prev().css("color", "#f68121");
        if ($(this).val() === person_val) {
            $(this).val("").css("color", "#000").keyup(function() {
                $(".btn_delete").css("visibility", "visible").bind("click", function(event) {
                    event.preventDefault();
                    $("#person").val("").focus();
                    $(".btn_delete").css("visibility", "hidden");
                });
            });
        }
    });

    $("#person, modify_name").blur(function(event) {
        event.preventDefault();
        //$(".btn_delete").css("visibility", "hidden");
        $(this).prev().css("color", "#000");
        if ($(this).val() === "") {
            $(this).css("color", "#acacac").val(person_val);
        }
    });

但是遇到了问题:当我输入后点击删除图标,同时也触发了blur事件,此时图标消失,也就点击不到图标了,但是如果不在blur时让图标消失,则每一次输入完成后input失去焦点,图标就一直显示着。

这个问题向个梗,一直卡着,直到今天。。。我又遇到了另外一个问题!!

问题描述:当我在输入框输入完内容后,直接点击注册按钮,第一次点击,没反应,每一次都是焦点在input时点击button,需要点击两次,button才会有所反应;

这时我才意识到,这是blur抢占了click的风头,那么我就得去blur里找问题,果然,如果我给blur的执行加一个延时....

$("#person, #pwd, #msg, #mail").focus(function(event) {
        event.preventDefault();

        if ($(this).attr("placeholder") === person_plc) {
            that = $(this);
        } else if ($(this).attr("placeholder") === pwd_plc) {
            that = $(this);
        } else {
            that = $(this);
        }

        that.prev().css("color", "#f68121");
        that.css("color", "#000").keyup(function() {
            that.next(".btn_delete").css("visibility", "visible").bind("click", function(event) {
                $(this).prev().css("color", "#acacac").val("").blur().prev().css("color", "#000");
                $(".btn_delete").css("visibility", "hidden");
            });
        });
    })

    $("#person").blur(function(event) {
        event.preventDefault();
        setTimeout(function() {
            // console.log("blur");
            $(".btn_delete").css("visibility", "hidden");
            $("#person").prev().css("color", "#000");
            if ($("#person").val() === "") {
                 $("#person").css("color", "#acacac");
             }
        }, 100);
    });

万事大吉,一下子世界都安静了。。。

然后就没有然后了,连之前的删除小图标也听话了,一blur就能隐藏,可是我的js代码重复代码非常之多,如下:

var person_val = $("#person").val();
    var person_plc = $("#person").attr("placeholder");
    var pwd_plc = $("#pwd").attr("placeholder");
    var that;

    $("#person, #pwd, #msg, #mail").focus(function(event) {
        event.preventDefault();

        if ($(this).attr("placeholder") === person_plc) {
            that = $(this);
        } else if ($(this).attr("placeholder") === pwd_plc) {
            that = $(this);
        } else {
            that = $(this);
        }

        that.prev().css("color", "#f68121");
        that.css("color", "#000").keyup(function() {
            that.next(".btn_delete").css("visibility", "visible").bind("click", function(event) {
                $(this).prev().css("color", "#acacac").val("").blur().prev().css("color", "#000");
                $(".btn_delete").css("visibility", "hidden");
            });
        });
    })

    $("#person").blur(function(event) {
        event.preventDefault();
        setTimeout(function() {
            // console.log("blur");
            $(".btn_delete").css("visibility", "hidden");
            $("#person").prev().css("color", "#000");
            if ($("#person").val() === "") {
                 $("#person").css("color", "#acacac");
             }
        }, 100);
    });

    $("#pwd").blur(function(event) {
        event.preventDefault();
        setTimeout(function() {
            // console.log("blur");
            $(".btn_delete").css("visibility", "hidden");
            $("#pwd").prev().css("color", "#000");
            if ($("#pwd").val() === "") {
                 $("#pwd").css("color", "#acacac");
             }
        }, 100);
    });

    $("#msg").blur(function(event) {
        event.preventDefault();
        setTimeout(function() {
            // console.log("blur");
            $(".btn_delete").css("visibility", "hidden");
            $("#msg").prev().css("color", "#000");
            if ($("#msg").val() === "") {
                 $("#msg").css("color", "#acacac");
             }
        }, 100);
    });

并且,我甚至都不知道第一个问题是怎么被解决的,在此也想向大家请教一下,为什么加一个定时之后,我再用$(this)就取不到当前的对象,必须得像$("#person")这样重新取,导致我还得为每一个input添加一个blur事件,不能集中处理,或者,其实这段代码是可以简化的,只是我还没想到。。。还请各方同学多多指教。

本文原创,转载请注明出处。

时间: 2024-08-07 12:40:57

【原】相煎何太急——input的blur事件与button的click事件的相关文章

给js创建的一个input数组绑定click事件

</pre><pre name="code" class="javascript"><html> <body> <input type="button" name="input[]" value="按钮1" /><br /> <input type="button" name="input[]&quo

[原] MSSQL MDF文件太大问题

USE 你的库名; GO -- 数据库空间使用情况 EXEC sp_spaceused; -- 查下文件空间使用情况 SELECT file_id, name, [文件大小(MB)] = size / 128., [未使用空间(MB)] = (size - FILEPROPERTY(name, N'SpaceUsed')) / 128. FROM sys.database_files -- 表空间使用情况 DECLARE @tb_size TABLE( name sysname, rows in

我们总是太急,没有耐心。

有没有觉得,工作了一段时间,很不开心? 有没有觉得,自己入错了行? 有没有觉得,自己没有得到应有的待遇? 是否觉得工作像一团乱码, 每天上班都是一种痛苦? 是否很想换个工作? 并不是每次闯红灯都会被汽车撞, 并不是每个错误都会被惩罚, 并不是你的每一分努力都会得到回报, 并不是你的每一次坚持都会有人看到, 并不是你每一点付出都能得到公正的回报, 并不是你的每一个善意都能被理解... 这个,就是世道. 好吧,世道不够好, 可是,你有推翻世道的勇气吗? 如果没有,你有更好的解决办法吗? 有很多时候,

以input=file方式,获取文件时,在IE下8无法通过某个按钮click事件间接触发input=file的change事件

最近在项目中遇到了许多上传问题,公司内部的组件,通过form上传,需要使用input=file触发选择文件, 因为input=file在各个浏览器中显示的样式是不同的,谷歌,火狐,IE都有所不同,而且不太美观,所以为了解决 这一个问题,一开始采用了隐藏input=file 然后通过一个显示的button间接触发input=file的click事件如下 <input type="file" id="upload" style="display:none

html5与js关于input[type=&#39;text&#39;]文本框value改变触发事件一些属性的区别oninput,onpropertychange,onchange和文本框的value点击全选状态onclick=&quot;select();&quot;。做购物车页面时会要用到。

关于input[type='text']文本框value改变触发事件一些属性的区别oninput,onpropertychange,onchange和文本框的点击全选状态onclick="select();".做购物车页面时会要用到. input[type='text']文本框value改变触发事件一些属性的区别oninput,onpropertychange,onchange: 1.onchange事件与onpropertychange事件的区别:onchange事件在内容改变(两次

input失去焦点和获得焦点jquery焦点事件

input失去焦点和获得焦点jquery焦点事件插件,鼠标在搜索框中点击的时候里面的文字就消失了. 我们在做网站的时候经常会用到搜索框的获得焦点和失去焦点的事件,因为懒,每次都去写非常的烦,于是就一劳永逸,遇到类似情况就来调用一下就OK 了 相关js代码: 1 <html xmlns="http://www.w3.org/1999/xhtml"> 2 <head> 3 <meta http-equiv="Content-Type" co

25.Unity3D手机中Input类touch详解-Unity触屏事件解析到底(Twisted Fate)

首先贴一下Unity支持的模型文件类型,以前没有收集过. Unity支持两种类型的3D文件格式: 1.  通用的"出口型"3D文件 如.fbx..dae..3ds..dxf..obj等文件格式. 2.  3D软件专用的3D文件格式 如Max, Maya, Blender,Cinema4D, Modo, Lightwave & Cheetah3D 等软件所支持的格式,如.MAX, .MB, .MA等等. Unity3D手机中Input类touch详解: 1.Input.touch

js(jquery)解决input元素的blur事件和其他非表单元素的click事件冲突的方法

HTML结构:很简单,就一个input,一个div,能说明问题就OK了: <input type="text" value="默认值"><br/><br/><div>搜索</div> 想要实现的结果: 1.input框获取焦点时value为“”,失去焦点时value为“默认值”:-----这个很好实现: 2.当在input框中输入要搜素的内容后,点击div搜索,要求控制台打印输出要搜素的内容(当然每个项目的

input中的内容改变时触发的事件

onchange事件在内容改变(两次内容有可能相等)且失去焦点时触发: onpropertychange事件是实时触发,每增加或删除一个字符就会触发,通过js改变也会触发该事件,但是该事件是IE专有. oninput事件是IE之外的大多数浏览器支持的事件,在value改变时实时触发,但是通过js改变value时不会触发:基本写原生常用的是oninput. oninput与onpropertychange失效的情况: oninput事件: 1.当脚本中改变value时,不会触发: 2.从浏览器的自