先来一段引子,最近在写手机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事件,不能集中处理,或者,其实这段代码是可以简化的,只是我还没想到。。。还请各方同学多多指教。

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

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

  1. input 的blur事件之后button的onclick事件不执行解决方案

    最近发现网页程序中有个BUG,就是在input标签输入框中输入完数据后,直接点击“取消” 按钮的时候.出现网页崩死的情况: 经过小主酸菜我,各种方法的尝试后,找到一个初步可以解决的方案,在这里分享给大 ...

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

    <html> <body> <input type="button" name="input[]" value="按钮1 ...

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

    HTML结构:很简单,就一个input,一个div,能说明问题就OK了: <input type="text" value="默认值"><br ...

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

    关于input[type='text']文本框value改变触发事件一些属性的区别oninput,onpropertychange,onchange和文本框的点击全选状态onclick="s ...

  5. JS监听input框的回车事件、属性值改变事件

    一.介绍 在程序猿门的工作中,经常会遇见一些表单数据的提交,对于有表单的东西而言,input输入框是非常常见的,所以对于一些input的基本事件,我们需要去掌握 二.input的监听enter事件 比 ...

  6. jQuery实时监听input的值变化(input的值产生变化才会触发事件)

    //用于监听input的值变化(input的值产生变化才会触发事件) (function ($) { $.fn.watch = function (callback) { return this.ea ...

  7. 【JS】 伪主动触发input:file的click事件

    大家用到input:file标签时,对于input:file的样式难看的处理方法一般有2种: 采用透明化input:file标签的方法,上面放的input:file标签,下面放的是其他标签,实际点击的 ...

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

    input中的内容改变时触发的事件 1. onchange事件与onpropertychange事件的区别: onchange事件在内容改变(两次内容有可能相等)且失去焦点时触发:onproperty ...

  9. input中blur失去焦点事件与点击事件冲突时如何解决

    方法一 使用setTimeout $(function(){ $(".cy-name-input input").on({ focus:function() { $(". ...

随机推荐

  1. 【学】AngularJS日记(3)- $apply(), run()方法

    $scope.$apply()方法可以强制$apply()里运行的函数所改变的model里的数据直接反应到view里,因为在angular的环境中,有时会用到原生js或者jquery的时候,这些行为有 ...

  2. js嵌套对象相等比较的一种方法 (原创)

    做前端开发经常会遇到比较js对象是否相等的情况, 或者说其它问题往往会归结到这个问题上来:比如对象数组的去重复. 网上看到过很多例子, 但是基本上都是那种比较简单的对象结构, 而复杂的对象结构,比如对 ...

  3. android 学习第一天 了解事件机制,页面跳转等常用操作

    点击时间2种 第一种,通过初始化页面 写入点击事件 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedI ...

  4. Python基础(二)之集合

    集合以{}形式表现,一个集合中的元素各不相同,即集合体现为去重的特性.主要用于关系测试,常见的集合操作:交集.并集.插件.子集.父集.对称差集等. 设置集合: list_1 = [1,3,4,5,7, ...

  5. [JavaScript]配置日期选择控件

    我选择的日期控件是:bootstrap-datepicker(下载路径:https://github.com/Aymkdn/Datepicker-for-Bootstrap) 比较方便,实用.原来是英 ...

  6. 开源项目大全 >> ...

    http://www.isenhao.com/xueke/jisuanji/kaiyuan.php   监控系统-Nagios 网络流量监测图形分析工具-Cacti 分布式系统监视-zabbix 系统 ...

  7. 使用JQuery实现手风琴布局

    当鼠标在元素上悬停或移出时,可以通过JQuery的hover方法来给元素绑定两个处理方法,前者用于鼠标悬停,后者用于鼠标移出,因此根据这这特点再设置相应元素的css属性后就可以方便的实现手风琴布局,然 ...

  8. wcf 推送 与 广播

    原文地址:http://blog.csdn.net/is_zhoufeng/article/details/7641234 ////wcf 接口   #region << 版 本 注 释 ...

  9. Oracle 常见函数

    1.把数字转换为字符串:To_char(数字) 2.Oracle 拼接字符串: || ':' || select  字段1 || ':' || 字段2 from  table  :字段1:字段2 3. ...

  10. 剑指Offer:面试题30——最小的k个数(java实现)

    问题描述: 输入n个整数,找出其中最小的k个数 思路1: 先排序,再取前k个 时间复杂度O(nlogn) 下面给出快排序的代码(基于下面Partition函数的方法) public void Quic ...