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 相关文章推荐
Javascript &amp; DHTML 实例编程(教程)DOM基础和基本API
Jun 02 Javascript
jquery创建一个ajax关键词数据搜索实现思路
Feb 26 Javascript
jquery $(document).ready()和window.onload的区别浅析
Feb 04 Javascript
jquery实现清新实用的网页菜单效果
Aug 28 Javascript
javascript日期操作详解(脚本之家整理)
Sep 05 Javascript
如何使用AngularJs打造权限管理系统【简易型】
May 09 Javascript
node.js发送邮件email的方法详解
Jan 06 Javascript
js中DOM三级列表(代码分享)
Mar 20 Javascript
基于IView中on-change属性的使用详解
Mar 15 Javascript
JavaScript文本特效实例小结【3个示例】
Dec 22 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
Mar 01 Javascript
微信小程序表单验证WxValidate的使用
Nov 27 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
谈谈PHP的输入输出流
2007/02/14 PHP
php中定时计划任务的实现原理
2013/01/08 PHP
PHP代码优化之成员变量获取速度对比
2014/02/28 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
基于jQuery制作迷你背词汇工具
2010/07/27 Javascript
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
javascript + jquery实现定时修改文章标题
2014/03/19 Javascript
18个非常棒的jQuery代码片段
2015/11/02 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
Angular ng-class详解及实例代码
2016/09/19 Javascript
微信小程序实战之运维小项目
2017/01/17 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
2019/06/27 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
使用Angular material主题定义自己的组件库的配色体系
2019/09/04 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
Python配置mysql的教程(推荐)
2017/10/13 Python
在Python 字典中一键对应多个值的实例
2019/02/03 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
python调用函数、类和文件操作简单实例总结
2019/11/29 Python
Python实现代码块儿折叠
2020/04/15 Python
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
高分子材料与工程专业推荐信
2013/12/01 职场文书
大学军训感言
2014/01/10 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
浅谈Redis的几个过期策略
2021/05/27 Redis
浅析MySQL如何实现事务隔离
2021/06/26 MySQL