快速解决js开发下拉框中blur与click冲突

在开发中我们会经常遇到blur和click冲突的情况。下面叙述了开发中常遇到的“下拉框”的问题,并提供了两种解决方案。

一、blur和click事件简述

blur事件:当元素失去焦点时触发blur事件;其为表单事件,blur和focus事件不会冒泡,其他表单事件都可以。
click事件:当点击元素时触发click事件;所有元素都有此事件,会产生冒泡。

示例1:blur事件为表单事件


1

2

3

4

5

6

7

8

9

10

11

12

13

<input type="text" id="tel">

<script>

  document.addEventListener("blur", function(){

    console.log("my document blur");

  });

  var ipt = document.getElementById("tel");

  ipt.addEventListener("blur", function(){

    console.log("my input blur");

  });

</script>

// 输出结果:document为非表单元素

my input blur

示例2:click事件可冒泡

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

<input type="text" id="tel">

<script>

  document.addEventListener("click", function(){

    console.log("my document click");

  });

  var ipt = document.getElementById("tel");

  ipt.addEventListener("click", function(){

    console.log("my input click");

  });

</script>

// 输出结果:

my input click

my document click

示例3:点击某元素导致前一个元素失去焦点,blur事件优先于click事件


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<input type="text" id="ipt">

<input type="button" id="btn" value="点我">

<script>

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

  ipt.addEventListener("blur", function(){

    console.log("my input blur");

  });

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

  btn.addEventListener("click", function(){

    console.log("my button click");

  });

</script>

// 输出结果:

my input blur

my button click

二、下拉框blur和click事件冲突,导致不能正常选择值

实际开发中,我们会经常遇到某一下拉列表框,点击其他元素消失列表框;点击下拉框子元素使其生效的需求。这就会面临冲突问题。


1

2

3

4

5

6

7

8

9

10

<!-- DOM结构示意 -->

<input type="text" placeholder="请选择姓氏" readonly>

<div class="search-list" data-status="hide">

  <ul>

    <li><a href="javascript:">赵</a></li>

    <li><a href="javascript:">钱</a></li>

    <li><a href="javascript:">孙</a></li>

    <li><a href="javascript:">李</a></li>

  </ul>

</div>

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

/** 说明:

 * 目前通过ul外层div自定义属性“data-status”控制其是否显示 

 */

(function($){

  $("input").focus(function(){

    // input框获取焦点,展示下拉框

    $(".search-list").attr("data-status", "show");

  }).blur(function(){

    // input框失去焦点,隐藏下拉框

    $(".search-list").attr("data-status", "hide");

  });

  // 选择对应选项,并赋值给input框

  $(".search-list li a").click(function(){

    console.log("执行");

    $("input").val($(this).text());

  });

})(jQuery);

执行上述代码,会出现一个问题,并不能正确获取下拉框中某值。 
原因:由于JavaScript为单线程,同一时间只能执行处理一个事件。由上述示例3,可得知“blur优先于click执行”。而在本示例中,由于blur处理程序,会将对应的下拉框展示区隐藏,所以导致其后续click事件并不会执行。上述console的信息也不会被输出。

解决方案1:对blur事件进行延迟,让click先执行。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

(function($){

  $("input").focus(function(){

    // input框获取焦点,展示下拉框

    $(".search-list").attr("data-status", "show");

  }).blur(function(){

    setTimeout(function(){

      // input框失去焦点,隐藏下拉框

      $(".search-list").attr("data-status", "hide");

    }, 300);

  });

  // 选择对应选项,并赋值给input框

  $(".search-list li a").click(function(){

    console.log("执行");

    $("input").val($(this).text());

  });

})(jQuery);

三、使用mousedown让其优先执行

示例4:将示例3中的click事件改为mousedown

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<input type="text" id="ipt">

<input type="button" id="btn" value="点我">

<script>

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

  ipt.addEventListener("blur", function(){

    console.log("my input blur");

  });

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

  btn.addEventListener("mousedown", function(){

    console.log("my button mousedown");

  });

</script>

// 输出结果:

my button mousedown

my input blur

mousedown事件:当鼠标指针移动到元素上方,并按下鼠标按键时,会发生mousedown事件。
mouseup事件:当在元素上放松鼠标按钮时,会发生mouseup事件。

注意: 
(1)mousedown与click 事件不同,mousedown事件仅需要按键被按下,而不需要松开即可发生。 
(2)mouseup与click事件不同,mouseup事件仅需要放松按钮。当鼠标指针位于元素上方时,放松鼠标按钮就会触发该事件。

补充:mousedown、mouseup、click

?


1

2

3

4

5

6

7

8

9

10

11

<input type="button" id="btn" value="点我">

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

btn.addEventListener("mousedown", function(){

  console.log("my button mousedown");

});

btn.addEventListener("click", function(){

  console.log("my button click");

});

btn.addEventListener("mouseup", function(){

  console.log("my button mouseup");

});

输出结果:
my button mousedown
my button mouseup
my button click

所以,其执行顺序为:

mousedown >> mouseup >> click

解决方案2:将click事件改为mousedown,让其优先于blur事件执行

?


1

2

3

4

5

6

7

8

9

10

11

12

13

(function($){

  $("input").focus(function(){

    // input框获取焦点,展示下拉框

    $(".search-list").attr("data-status", "show");

  }).blur(function(){

    // input框失去焦点,隐藏下拉框

    $(".search-list").attr("data-status", "hide");

  });

  // 选择对应选项,并赋值给input框

  $(".search-list li a").mousedown(function(){

    $("input").val($(this).text());

  });

})(jQuery);

补充: js、jquery 中 blur事件和click事件冲突

问题说明:
在表单验证中,我们往往会在输入框失去焦点时触发一个blur事件,但当失去焦点后点击了一个按钮,这时blur事件和click事件就都触发了,由于js是单线程的所以就出现了问题,现在需要让blur先执行验证,然后在触发click事件。

解决方法:

给按钮的click事件设置延迟执行setTimeOut(fn,100),延迟时间的设置要大于blur事件的执行时间,这样就会在blur事件执行完后在执行click事件。

原文链接:http://blog.csdn.net/ligang2585116/article/details/51764828

时间: 2024-12-26 16:54:05

快速解决js开发下拉框中blur与click冲突的相关文章

下拉框选择blur与click冲突问题

缘由:今天在做下拉框选择时,遇到click和blur冲突问题:具体现象如下 1.intput框获取焦点(focus事件)时显示隐藏的下拉框,失去焦点(blur事件)则隐藏下拉框 2.点击选择(click事件)下拉框内容时获取值,然后intput失去焦点(blur事件)隐藏下拉框 3.发现click事件无效,blur事件会优先于click事件执行,导致click事件无效 解决:使用mousedown替换click使点击选择事件优先执行 mousedown事件:当鼠标指针移动到元素上方,并按下鼠标按

利用js取到下拉框中选择的值

现在的需求是:下拉框中要是选择加盟商让其继续选择学校,要是选择平台管理员则不需要选择学校.隐藏选择下拉列表. 选择枚举值: /// <summary> /// 平台角色 /// </summary> public enum AdministratorRole { [Display(Name = "平台管理员")] PlatformAdministrator = 1, [Display(Name = "加盟商")] JoiningTrader

JavaScript解决select下拉框中的内容太长显示不全的问题

JavaScript解决select下拉框中的内容太长显示不全的问题 1.说明 有些情况下,select下拉框的内容过长,导致部分看不见: 现在通过鼠标事件,让下拉框中的内容显示完全 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html

下拉框中选项的快速定位

对于选项很多的下拉框 <select>,人工定位到想要的项目是很费劲的.浏览器其实原生支持下拉选择框根据键盘输入自动定位到相应条目的. 通过输入条目字母定位到下拉框中条目的位置 方便是方便,有个问题是连续输入不能间隔太久,这个间隔实测中感受是非常短的,如果想找的条目比较难输入,就无法在短时间内完成这个操作. 那有没有相应 API 修改这个间隔时间呢?不能,至少我还没找到. <datalist> 其实 HTML5 中提供了另外一个元素,<datalist>.用它结合一个文

让下拉框中同时显示Key与Value

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4296020.html 作为开发人员,希望看到下拉框中选项的Key,一般GUI安装后,下拉框是不显示Key的,只有Value: 通过下面设置后,就可以显示Key了:   这样就知道了后台真实值了

JavaScript向select下拉框中添加和删除元素

JavaScript向select下拉框中添加和删除元素 1.说明 a   利用append()方法向下拉框中添加元素 b   利用remove()方法移除下拉框中最后一个元素 2.设计源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xm

jquery选中将select下拉框中一项后赋值给text文本框

jquery选中将select下拉框中一项后赋值给text文本框,出现无法将第一个下拉框的value赋值给文本框 因为select默认选中第一项..在选择第一项时,便导致无法激发onchange事件.所以无法进行赋值给文本框 解决方法. select下拉框设置第一项做一个无用的占位option <script type="text/javascript">     function changeSelect(obj) {         var _this = obj;  

JavaScript获取select下拉框中的第一个值

JavaScript获取select下拉框中的第一个值 1.说明 获取select下拉框中的第一个值 2.实现源代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtm

用JS让下拉框改变网页背景颜色

<HTML> <HEAD> <TITLE>石家庄渣浆泵配件</TITLE> </HEAD> <SCRIPT> <!-- function bgChange(selObj) { newColor = selObj.options[selObj.selectedIndex].text; document.bgColor = newColor; selObj.selectedIndex = -1; } //--> </SC