在处理表单登录的过程中,我们遇到了一个问题。 当我们在输入框中输入内容并且输入框获得焦点时,输入框旁边会出现一个图标,用于删除输入的内容,所以删除该图标会绑定一个点击风暴,但是当我们点击该图标时,它还会触发输入的模糊风暴。 模糊风暴会在输入失去焦点时隐藏删除的图标,但是模糊风暴是在图标的点击风暴之前执行的,所以此时点击图标并不会删除输入框中已经输入的内容,但是图标消失了,所以这个结果不是我们想要的,那么如何解决这个问题呢?
我们先来看看模糊和点击风暴
模糊:当元素失去焦点时触发模糊; 早些时候,模糊仅发生在表单元素上。 在新浏览器中,该波形可以用于任何元素,模糊和焦点波形不会冒泡jquery 让 失去焦点,其他形式的波形都可以。
点击风暴:点击元素时触发点击风暴; 所有元素都会有这场风暴,并且会形成泡沫。
问题原因:
这是因为blur事件是在click事件之前触发的jquery 让 失去焦点,而javascript是单线程的,一次只能处理一个事件,所以当执行blur时,后面的click事件不会被执行。
方案一:如果点击事件在blur事件之前触发,就没有问题,所以可以在blur事件中添加一个定时器来延迟触发
/*删除图标的点击事件*/
$(".delete-icon").on("click",function () {
$(this).prev("input").val("").focus();
});
/*输入框失去焦点的blur事件*/
$("input[name='username'],input[name='password']").on("blur",function () {
var $this = $(this);
setTimeout(function(){
$this.parent().removeClass("active");
$this.next(".delete-icon").hide();
},250)
});
缺点:设置延时多长时间是一个不可兼得的问题。 如果时间太紧,无法保证100%触发点击风暴。 如果时间太长,会造成冻结感,影响用户体验。
方案二:将clickstorm改为mousedownstorm,mousedownstorm先于blurstorm执行
/*删除图标的点击事件*/
$(".delete-icon").on("mousedown",function () {
$(this).prev("input").val("").focus();
});
/*输入框失去焦点的blur事件*/
$("input[name='username'],input[name='password']").on("blur",function () {
var $this = $(this);
$this.parent().removeClass("active");
$this.next(".delete-icon").hide();
});
缺点:按下鼠标会触发风暴,不收起或长按也会触发,可能会导致用户体验不佳
方案三:给图标添加mousedown事件,在里面执行event.preventDefault(),阻止浏览器的默认事件,这样按钮点击时输入框就不会失去焦点
/*阻止浏览器默认事件*/
$(".delete-icon").on("mousedown",function(e) {
e.preventDefault();
})
/*删除图标的点击事件*/
$(".delete-icon").on("click",function () {
$(this).prev("input").val("").focus();
});
/*输入框失去焦点的blur事件*/
$("input[name='username'],input[name='password']").on("blur",function () {
var $this = $(this);
$this.parent().removeClass("active");
$this.next(".delete-icon").hide();
});
解决方案4:动态绑定模糊。 当鼠标步入输入框的父元素时,去除输入绑定模糊。 当鼠标移出输入框的父元素时,将模糊绑定到输入。
/*动态绑定blur事件*/
$(".login-con li").mouseenter(function(){
$(this).find("input").unbind("blur");
});
$(".login-con li").mouseleave(function(event){
$(this).find("input").bind("blur");
});
/*删除图标的点击事件*/
$(".delete-icon").on("click",function () {
$(this).prev("input").val("").focus();
});
/*输入框失去焦点的blur事件*/
$("input[name='username'],input[name='password']").on("blur",function () {
var $this = $(this);
$this.parent().removeClass("active");
$this.next(".delete-icon").hide();
});
推荐方法3和方法4
原作者技术博客:
一位1995年出生的后端女孩,爱读书、爱交友,在这里记录一下工作中遇到的问题,希望能给看到的大家带来一点帮助。
欢迎留言
发表评论