`
yuanbian007
  • 浏览: 19980 次
  • 性别: 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基础 选择器 事件

    8. **状态变化事件**:`$(selector).focusin(function)` 和 `$(selector).focusout(function)` 当元素获得或失去焦点时触发,`$(selector).mouseover(function)` 和 `$(selector).mouseout(function)` 当鼠标进入或...

    jquery实现输入框邮箱提示效果

    最后,为了让提示列表在没有输入或输入不符合规则时消失,我们还需要在`focusout`和`keyup`事件中处理隐藏逻辑: ```javascript $('#emailInput').on('focusout', function() { $('#emailSuggestions').hide(); })...

    JQuery参考手册.doc

    10. **focusin()** 和 **focusout()**: 分别在元素获得或失去焦点时触发。 11. **keydown()**, **keyup()** 和 **keypress()**: 用于键盘事件处理。 12. **load()**: 触发或绑定load事件,通常用于元素加载完成时。 ...

    jQuery详细教程

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

    w3school jQuery参考手册 飞龙整理 20141002

    本参考手册由W3School整理,旨在提供全面的jQuery选择器和事件方法的知识。 **jQuery 选择器** jQuery的选择器是基于CSS选择器进行扩展的,允许开发者更加精确地选取DOM(文档对象模型)中的元素。以下是一些基本...

    jquery validate (弹框)

    5. **验证事件**:`jQuery Validate`提供多种验证相关的事件,如`invalid.form`(表单验证失败时触发)、`focusout`(失去焦点时验证)等,可以绑定这些事件以执行额外操作。 6. **异步验证**:对于需要服务器端...

    jquery插件(form表单验证)

    在Web开发中,jQuery是一个非常流行的JavaScript库,它极大地简化了DOM操作、事件处理和Ajax交互等任务。jQuery插件是这个库的一大特色,开发者可以利用它们来扩展jQuery的功能,以满足特定的需求。本篇文章将深入...

    jQuery EasyValidator插件 表单验证

    插件提供了多种触发验证的事件,如`submitHandler`(表单提交时触发)、`focusout`(失去焦点时触发)和`keyup`(按键释放时触发)。开发者可以根据需求选择合适的事件绑定,以实现不同场景下的实时验证。 **验证...

    jquery tag插件input文本域输入文字创建标签文字效果

    - **事件处理**:如`keyup`事件用于检测用户输入,`focusout`事件用于在失去焦点时保存标签,`click`事件用于处理标签的删除。 3. **插件使用**: - **安装**:通常通过CDN链接或本地引入jQuery库和插件文件。 -...

    jQuery滑动表单验证效果.zip_jQuery滑动表单验证效果

    它可能利用CSS3动画或者jQuery插件实现了滑动验证的效果,比如当用户输入错误时,错误提示信息会以滑动的方式显示出来,增强了反馈的视觉吸引力。这种效果使得用户更容易注意到他们的错误,并且增加了表单的交互性。...

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

    - `focusout`:当任何子元素失去焦点时触发(jQuery 1.7+)。 2. **加载和更新事件**: - `load`:当元素(如图片或iframe)完成加载时触发。 - `unload`:当窗口或框架卸载时触发。 - `resize`:当窗口或元素...

    jQuery仿百度搜索框下拉代码.zip

    jQuery作为一款广泛使用的JavaScript库,提供了丰富的功能和便利的操作方式,使得实现类似百度搜索框的下拉提示功能变得轻松易行。本文将深入解析如何使用jQuery来仿制百度搜索框的下拉代码。 首先,我们需要理解...

    jQuery表单事件实例代码分享

    除了`.focusin()`和`.blur()`方法,jQuery还提供了`.focus()`、`.focusout()`、`.change()`、`.submit()`、`.click()`等多种事件方法,可以用于捕捉不同类型的用户操作。 例如,`.change()`方法可以用来捕捉文本...

    jquery验证框架使用

    1. **验证事件**:jQuery验证框架提供了`invalidHandler`、`submitHandler`等事件,可以在验证失败或成功时执行相应的处理函数。 ```javascript $("#myForm").validate({ invalidHandler: function(form, ...

    JQuery中的常用事件、对象属性与使用方法分析

    以下是一些常见的jQuery事件: 1. `.click()`: 当用户点击元素时触发。可以接受一个函数作为参数,用于处理点击事件,例如: ```javascript $('.target1').click(function() { // 处理点击事件的代码 }); ``` ...

    jquery1.5 参考文档

    通过以上详尽的解析,可以看出 jQuery 1.5 是一个功能强大且高度灵活的JavaScript库,它极大地简化了网页开发中的DOM操作、事件处理、动画效果和Ajax交互等任务。对于前端开发者而言,熟练掌握jQuery的各项功能是...

    jquery常用效果笔记

    通过添加类`alt`和`over`来改变表格行的背景颜色,分别对应于鼠标移入(`mouseover`)和失去焦点(`focusout`)时的状态。具体实现如下: ```javascript $(document).ready(function(){ // 监听获得和失去焦点,...

Global site tag (gtag.js) - Google Analytics