onclick和onblur冲突问题的快速解决方法


Posted in Javascript onApril 28, 2016

新浪首页的搜索框里面有一个使用ajax的下拉框。我们需要实现一个点击下拉框里面的一项,让搜索框里面的值变成这一项,同时下拉框消失的效果,但同时在点击其他地方的时候,这个下拉框也要消失。大致如图:

onclick和onblur冲突问题的快速解决方法

我们同时使用onblur和onclick来使下拉框隐藏,但是更大的问题出现了,这两个功能相冲突,onblur过于强悍,根本没有onclick方法实现的机会,搜索框无法获取点击项的内容。这个就是我们想要解决的onclick和onblur冲突问题。

对应这个问题,这里我们介绍两种解决办法:

1. 使用setTimeout来使onblur时间延期执行,使onclick执行完后再执行onblur。(其中setTimeout的时间设定应该在100ms以上,否则依旧不行)示例代码如下:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title></title>
  <style>
    *{ margin: 0; padding: 0; list-style: none; }
    form{
      width:500px;
      margin:0 auto;
      position:relative;
      zoom:1;
    }
    form:after{
      clear:both;
      content:"";
      display:block;
    }
    .text{
      float:left;
      border:1px solid #cccccc;
      padding-left:14px;
      width:300px;
      height:34px;
      line-height:34px;
      font-size:14px;
    }
    .button{
      width:50px;
      height:34px;
      border:1px solid #cccccc;
      line-height:34px;
      font-size:14px;
      color:#ffffff;
      background:#ff8400;
    }
    ul{
      position:absolute;
      top:36px;
      left:0;
      width:300px;
      border-right:1px solid #cccccc;
      border-left:1px solid #cccccc;
      background:green;
      display:none;
    }
    li{
      font-size:14px;
      line-height:34px;
      height:34px;
      color:#000000;
      border-bottom:1px solid #cccccc;
    }
    li:hover{
      background:yellow;
      color:red;
      cursor:pointer;
    }
  </style>
  <script>
    window.onload=function(){
      var oText=document.getElementById('text');
      var oUl=document.getElementById('ul');
      var aLi=oUl.getElementsByTagName('li');
      var timer=null;
      oText.onfocus=function(){
        this.value='';
        oUl.style.display='block';
        for(var i=0;i<aLi.length;i++){
          aLi[i].onclick=function(){
            clearTimeout(timer);
            oText.value=this.innerHTML;
            oUl.style.display='none';
          };
        }
      };
      oText.onblur=function(){
        timer=setTimeout(function(){
          oUl.style.display='none';
          if(!oText.value){
            oText.value='请输入关键字';
          }
        },120);
      };
    };
  </script>    
</head>
<body>
<form>
  <input type="text" value="请输入关键字" id="text" class="text"/>
  <input type="button" value="搜索" class="button"/>
  <ul id="ul">
    <li>返回窗口是否已被关闭</li>
    <li>返回窗口的文档显示区的高度</li>
    <li>返回窗口的文档显示区的宽度。</li>
    <li>设置或返回窗口的名称。</li>
    <li>返回窗口的外部高度。</li>
  </ul>
</form>
  
</body>
</html>

2. 使用document.onmousedown来代替onblur实现隐藏下拉框功能

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title></title>
  <style>
    *{ margin: 0; padding: 0; list-style: none; }
    form{
      width:500px;
      margin:0 auto;
      position:relative;
      zoom:1;
    }
    form:after{
      clear:both;
      content:"";
      display:block;
    }
    .text{
      float:left;
      border:1px solid #cccccc;
      padding-left:14px;
      width:300px;
      height:34px;
      line-height:34px;
      font-size:14px;
    }
    .button{
      width:50px;
      height:34px;
      border:1px solid #cccccc;
      line-height:34px;
      font-size:14px;
      color:#ffffff;
      background:#ff8400;
    }
    ul{
      position:absolute;
      top:36px;
      left:0;
      width:300px;
      border-right:1px solid #cccccc;
      border-left:1px solid #cccccc;
      background:green;
      display:none;
    }
    li{
      font-size:14px;
      line-height:34px;
      height:34px;
      color:#000000;
      border-bottom:1px solid #cccccc;
    }
    li:hover{
      background:yellow;
      color:red;
      cursor:pointer;
    }
  </style>
  <script>
    window.onload=function(){
      var oText=document.getElementById('text');
      var oUl=document.getElementById('ul');
      var aLi=oUl.getElementsByTagName('li');
      var timer=null;
      oText.onfocus=function(){
        this.value='';
        oUl.style.display='block';
        for(var i=0;i<aLi.length;i++){
          aLi[i].onclick=function(){
            clearTimeout(timer);
            oText.value=this.innerHTML;
            oUl.style.display='none';
          };
        }
      };
      
      document.onmousedown=function(ev){
        var oEvent=ev||event;
        var target=oEvent.target||oEvent.srcElement;
          if(target.parentNode!==oUl&&target!==oText){
            oUl.style.display='none';
          }
        
      };
      oText.onblur=function(){
        if(!oText.value){
          oText.value='请输入关键字';
        }  
      };
    };
  </script>    
</head>
<body>
<form>
  <input type="text" value="请输入关键字" id="text" class="text"/>
  <input type="button" value="搜索" class="button"/>
  <ul id="ul">
    <li>返回窗口是否已被关闭</li>
    <li>返回窗口的文档显示区的高度</li>
    <li>返回窗口的文档显示区的宽度。</li>
    <li>设置或返回窗口的名称。</li>
    <li>返回窗口的外部高度。</li>
  </ul>
</form>
  
</body>
</html>

以上这篇onclick和onblur冲突问题的快速解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
node.js中的fs.lchmod方法使用说明
Dec 16 Javascript
Jquery结合HTML5实现文件上传
Jun 25 Javascript
谈谈AngularJs中的隐藏和显示
Dec 09 Javascript
学习Javascript闭包(Closure)知识
Aug 07 Javascript
AngularJS API之copy深拷贝详解及实例
Sep 14 Javascript
jquery实现下拉菜单的手风琴效果
Jul 23 jQuery
es6中的解构赋值、扩展运算符和rest参数使用详解
Sep 28 Javascript
vue注册组件的几种方式总结
Mar 08 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
Sep 19 Javascript
在React项目中使用Eslint代码检查工具及常见问题
Oct 10 Javascript
json解析大全 双引号、键值对不在一起的情况
Dec 06 Javascript
Webpack的Loader和Plugin的区别
Nov 09 Javascript
如何使用jquery修改css中带有!important的样式属性
Apr 28 #Javascript
JavaScript String 对象常用方法总结
Apr 28 #Javascript
JavaScript Math 对象常用方法总结
Apr 28 #Javascript
非常漂亮的相册集 使用jquery制作相册集
Apr 28 #Javascript
jQuery事件绑定on()与弹窗实现代码
Apr 28 #Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
Apr 28 #Javascript
JS模仿手机端九宫格登录功能实现代码
Apr 28 #Javascript
You might like
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
2013/06/01 PHP
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
简单理解PHP的面向对象编程方式
2016/05/17 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
JavaScript中BOM对象原理与用法分析
2019/07/09 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
Python脚本判断 Linux 是否运行在虚拟机上
2015/04/25 Python
Windows下PyMongo下载及安装教程
2015/04/27 Python
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
Python实现多线程的两种方式分析
2018/08/29 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
传播学专业毕业生自荐信
2013/11/04 职场文书
城管年度个人总结
2015/02/28 职场文书
钱学森观后感
2015/06/04 职场文书
2015年度环卫处工作总结
2015/07/24 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery
Springboot使用Spring Data JPA实现数据库操作
2021/06/30 Java/Android
Jedis操作Redis实现模拟验证码发送功能
2021/09/25 Redis
Python查找算法的实现 (线性、二分,分块、插值查找算法)
2022/04/24 Python
MySQL如何使备份得数据保持一致
2022/05/02 MySQL