`
yuanbian007
  • 浏览: 19579 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

搜索提示时jquery的focusout和click事件冲突问题完美解决

阅读更多

      在主流的搜索引擎上搜索时,输入内容,往往会弹出智能提示。输入框为input,智能提示区域为suggest。接下来一般有两种操作:

       1.选择某一提示,则把内容复制到input中,自动关闭suggest;

       2.点击网页其他地方,自动关闭suggest。

 

       实现第一个可以用click事件,在suggest中增加鼠标click事件,在处理中将点击的内容写到input中,然后关闭suggest。单独测试无问题;

       实现第二个可以在input元素上增加focusout事件或者blur事件,在input中丢失焦点的时候,关闭suggest。单独测试无问题。

  

       但是放在一起的时候,就会出现问题,只响应了丢失焦点事件(关闭了suggest),却没有响应内容点击事件(没有获取点击的suggest内容)。

       不明白为什么会冲突,在网上搜,也搜到了一些同样的问题,有人建议使用blur,但是blur跟focusout是一样的道理,都不行。

     

       思前想后,忽然想到click事件的触发条件,你点击一个按键,触发一次点击事件,而一次点击包括:鼠标点下去,鼠标松开。而jquery的click事件是鼠标松开后才触发的(事实上button元素和href元素的点击事件都是这样),这样一想就明白刚刚出现的冲突问题了,你点中suggest中的某一提示,这时候input丢失焦点事件触发,关闭了suggest区域,而这个时候你的鼠标才松开(电脑反应速度要快于鼠标点击松开速度),完成点击,但此时鼠标已经不在suggest要选择的提示上面了,所以也就无法触发suggest里的点击事件。

 

        想明白了这点,问题就好解决了,把suggest中的响应事假改成mousedown,这样在鼠标点的时候就会触发,测试了一下,果然成功了,mousedown事件和focusout事件都得到了正确处理。

//input的丢失焦点事件
$("#input_area").focusout(function(){
    $("#suggest_div").hide();
});

//suggest区域的点击事件
$("#suggest_div li").mousedown(function(){
    $("#input_area").val($(this).text());
    $("#suggest_div").hide();
});

 

       将click换成mousedown就完全ok了,简单到我都不好意思说,但是有的时候,也不容易想到哇!

 

       另外,在网上还找到了别的方法,一个是

        $("#input_area").keypress(function() {
            $("#suggest_div").slideDown();
        }).blur(function() {
            $("#suggest_div").slideUp();
        });

 

 

       这种方法用隐藏动画造成了延迟,使得suggest区域的click事件可以触发。但是slide可不适应所有情况,而且把功能成功与否建立在动画隐藏的速度快慢上,个人觉得也不太合适。

 

       另一种方法是将input和suggest用一个div包起来,事件直接加在div上面。这个未测试过,不过理论上应该也是可行的。

 

 

1
1
分享到:
评论

相关推荐

    jQuery详细教程

    jQuery 使用名为 noConflict() 的方法来解决该问题。 var jq=jQuery.noConflict(),帮助您使用自己的名称(比如 jq)来代替 $ 符号。 亲自试一试 结论 由于 jQuery 是为处理 HTML 事件而特别设计的,那么当您遵循...

    jQuery 1.4.1 中文参考

    8.5.14 focusout(fn) 139 8.5.15 keydown() 139 8.5.16 keydown(fn) 139 8.5.17 keypress() 140 8.5.18 keypress(fn) 140 8.5.19 keyup() 141 8.5.20 keyup(fn) 141 8.5.21 load(fn) 141 8.5.22 mousedown(fn) 141 ...

    详解通过focusout事件解决IOS键盘收起时界面不归位的问题

    今天在开发一个移动端的 H5 页面时,遇到了 IOS 上键盘收起时界面无法归位的问题。下面详细描述下问题和症状: 页面结构 出问题的页面是一个表单结构。即类似于一个 div 下有4个 input 表单的结构,用于用户填写邮寄...

    JQuery的ON()方法支持的所有事件罗列

    自从jQuery添加了on()和off()方法之后,基本跟事件有关的操作我不会再使用其他诸如$(‘xxx’).click(function(){});之类的了。 不过jQuery的api里面没有说on里面到底可以绑定多少个事件,今天看jQuery1.8.3的源码...

    jQuery 1.5 API 中文版

    $.blur,.mousedown,.change,.mouseenter,.click,.mouseleave,.dblclick,.mousemove,.error,.mouseout,.focus,.mouseover,.focusin,.mouseup,.focusout,.resize,.keydown,.scroll,.keypress,.select,.keyup,.submit,....

    JQuery中Bind()事件用法分析

    本文实例分析了JQuery中Bind()事件用法。分享给大家供大家参考。具体分析如下: 我们先看一下它的定义: .bind( eventType [, eventData], handler(eventObject)) .Bind()方法的主要功能是在向它绑定的对象上面提供...

    jquery1.11.0手册

    jQuery 1.11.0 速查表 核心 jQuery 核心函数 jQuery([sel,[context]]) jQuery(html,[ownerDoc])1.8* jQuery(callback) jQuery.holdReady(hold) jQuery 对象访问 each(callback) size() length selector ...

    C#控件中失去焦点Focus事件与获得焦点Focus事件

    C#控件 失去Focus焦点事件与获得焦点事件 文本框失去焦点事件 LostFocus GotFocus事件 供大家学习,减为1分了。。。。

    Angular单元测试之事件触发的实现

    =在angular项目中时常有一些click、input、focusout等事件操作,那么如何在单元测试中触发这些事件呢? 一、触发Click事件 // 方法一 const ele = fixture.debugElement.query(By.css("#id")); ele....

    jquery常用方法及使用示例汇总

    mouseover()/mouserout() 当鼠标进入/离开某个元素或它的后代元素时触发mouseover/mouseout事件。 mouseover事件大多数时候会与 mouseout 事件一起...focusin()和focusout() .focusin():一个元素或它的子元素得到焦

    JavaScript焦点事件、鼠标事件和滚轮事件使用详解

    一般利用这些事件与document.hasFocus()方法和document.activeElement属性配合。主要有: blur:元素失去焦点,不会冒泡; DOMFocusIn:同HTML事件focus,于DOM3遭废弃,选用focusin; DOMFocusOut:同HTML事件blur...

    JavaScript事件类型中焦点、鼠标和滚轮事件详解

    本文针对JavaScript 事件中“事件类型”下“焦点、鼠标和滚轮事件”的注意要点进行整理,分享给大家供大家参考,具体内容如下 一、焦点事件 一般利用这些事件与document.hasFocus()方法和document.activeElement属性...

    Gravy:主干的小型抽象层

    为了实现这一点,我在input和textarea元素上设置了focusout事件,这些元素将Event focusout到验证序列中。 根据验证结果,将调用成功、错误或清除方法来通知用户。 如何配置肉汁: 将其作为依赖项包含在内.. 在...

    jQuery 常见小例汇总

    //这段代码展示了在用户未输入值时, //如何在文本类型的input域中保留 //一个默认值 wap_val = []; $(.swap).each(function(i){ wap_val[i] = $(this).val(); $(this).focusin(function(){ if ($(this).val() == ...

    track-focus:跟踪焦点事件,以获得更好的辅助功能样式

    我创建了一个新版本的trackFocus,该版本包括更多的常规事件检测(包括触摸和指针),仅向主体添加单个属性,而不是在类中乱扔DOM,并公开了用于编写脚本的小型API。 看看 。 追踪焦点 trackFocus会在元素获得焦点时...

    responsiveTextBox

    仅当用户按 Enter 键或单击发出请求的框时,如果您仅使用“keyout”事件...每次按键后都会有一个请求制成... 什么是最好的选择??...我们想使用“focusout”事件是的,但也使用“keyout”事件但有一点大细节.........

Global site tag (gtag.js) - Google Analytics