`
ayue222
  • 浏览: 49636 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何在事件代理中正确使用 focus 和 blur 事件

阅读更多
什么是事件代理(Event Delegation)?

如果不太了解的朋友,可详细阅读:《Event delegation in JavaScript》,这里不再累述。

首先让我们一起来回顾一些常识:

通常支持事件冒泡(Event Bubbling)的事件类型为鼠标事件和键盘事件,例如:mouseover, mouseout, click, keydown, keypress。
接口事件则通常不支持事件冒泡(Event Bubbling),例如:load, change, submit, focus, blur。
很明显:focus 和 blur 都属于不支持冒泡的接口事件。既然都不支持冒泡,那又如何实现事件代理呢?

可以换个角度,逆向思维,尝试事件捕获(Event Capturing,除了IE,现在流行的标准浏览器均支持)。

测试后会发现,如果你捕获 focus 或 blur 事件,目标元素的祖先元素均执行事件函数。至于为什么?或许是实现的一个 BUG。

el.addEventListener('focus', focusHandler, true);
el.addEventListener('blur', blurHandler, true);


那对于 IE ,我们如何实现呢?

非常幸运,IE 下支持 focusin 和 focusout 事件,非常类似于 focus 和 blur 事件,唯一不同的是,这两种事件支持事件冒泡(Event Bubbling)。

el.onfocusin = focusHandler;
el.onfocusout = blurHandler;


很完美的解决方案:

if (document.addEventListener) {
    el.addEventListener('focus', focusHandler, true);
    el.addEventListener('blur', blurHandler, true);
} else {
    el.onfocusin = focusHandler;
    el.onfocusout = blurHandler;
}


当你下次看到 YUI 2.8 的 event/event-debug.js 源码中下面几段代码时,一定会清晰很多:

    // String constants used by the addFocusListener and removeFocusListener methods
     FOCUSIN = "focusin",
     FOCUSOUT = "focusout";
        ....
     _specialTypes: {
         focusin: (isIE ? "focusin" : "focus"),
         focusout: (isIE ? "focusout" : "blur")
      },
        ....
    addListener: function (el, sType, fn, obj, overrideContext) {
        var capture = ((sType == FOCUSIN || sType == FOCUSOUT) && !YAHOO.env.ua.ie) ? true : false;
        return this._addListener(el, this._getType(sType), fn, obj, overrideContext, capture);
    }


分享到:
评论

相关推荐

    jQuery中blur和focus

    jQuery中blur和focus事件的应用,相关事例和代码

    jQuery focus和blur事件的应用详解

    在本篇文章中,我们详细讨论了jQuery中focus和blur事件的应用方法,展示了如何通过这两个事件来改善用户填写表单的体验。通过使用jQuery的事件绑定方法,我们可以轻松地在用户交互时提供及时的反馈和动态变化,从而...

    jquery插件-表单验证 根据focus blur

    本压缩包包含的资源是基于jQuery的一个插件,专门用于表单验证,它根据元素的`focus`和`blur`事件来触发验证过程。 `focus`事件在用户将焦点转移到某个元素(如输入框)时触发,而`blur`事件则在用户焦点离开该元素...

    js事件代理demo

    JavaScript事件代理(Event Delegation)是一种优化前端性能和提高代码可维护性的技术。它基于事件冒泡或捕获机制,允许我们为父...通过阅读和分析这个示例,你可以更深入地理解如何在实际项目中有效地使用事件代理。

    javascript委托(Delegate)blur和focus用法实例分析

    在例子中,一个列表和一个表单分别使用了mouseover、mouseout、focusin、focusout以及focus、blur事件进行处理,以适应不同浏览器的事件处理机制。 4. 事件委托的优势 - 减少内存占用:不需要为每个元素单独绑定...

    form表单中的onblur事件

    在DOM2级事件处理方法中,我们使用`addEventListener`方法添加事件监听器: ```javascript document.getElementById('myInput').addEventListener('blur', validateInput); ``` `onblur`事件通常与`onfocus`事件...

    Vue中mintui的field实现blur和focus事件的方法

    本篇文章将探讨如何在Vue中使用Mint UI的Field组件来监听并处理`blur`和`focus`事件。 `blur`事件发生在元素失去焦点时,而`focus`事件则在元素获得焦点时触发。在Vue中,我们可以直接通过Mint UI的Field组件的事件...

    vue 表单输入框不支持focus及blur事件的解决方案

    2.在实例中添加指令 directives: { 'mtfocus' (el, binding, vnode) { let mtinput = el.querySelector('input') mtinput.onfocus = function () { ...//如果要对节点的数据进行更改,且更改要映射到页面上,则...

    div+blur+event+angular2

    在Angular中,我们可以使用事件绑定语法来监听和响应这些事件。对于 `blur` 事件,我们可以这样绑定: ```html (blur)="onBlurMethod()"> ``` 在这个例子中,`onBlurMethod()` 是一个Angular组件的方法,当 `<div>`...

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

    在开发中我们会经常遇到blur和click冲突的情况。下面叙述了开发中常遇到的“下拉框”的问题,并提供了两种解决方案。 一、blur和click事件简述 blur事件:当元素失去焦点时触发blur事件;其为表单事件,blur和focus...

    jquery focus(fn),blur(fn)方法实例代码

    - 在绑定 focus 和 blur 事件时,确保传递的参数是正确的选择器,以便选中正确的元素。 - 使用 .ready() 方法确保在 DOM 完全加载之后再绑定事件,避免因为 DOM 元素还未加载完成而导致的事件绑定失败。 - 使用 ....

    IE6下focus与blur错乱的解决方案

    然而,在IE6中,存在一个已知的bug,当用户点击一个`textarea`元素时,这不仅会导致`textarea`的`focus`事件被触发,还意外地引发了整个窗口的`blur`事件,从而导致`focus`和`blur`事件的配对混乱。这个问题会影响到...

    layui动态绑定事件的方法

    在layui框架中,动态绑定事件通常使用jQuery来进行。但是,由于兼容性问题,移动端iOS不支持直接在body上使用事件委托,因此,我们需要将事件监听的目标改为其他元素,例如.setBox。 在实际操作中,我们可以通过...

    为TextBox装饰水印与(blur和focus)事件应用

    接下来,我们来探讨如何使用JavaScript中的blur和focus事件。这两个事件分别在文本框失去焦点和获得焦点时触发。在blur事件的事件处理函数中,我们会检查文本框的内容,如果为空,则设置文本框的前景色为浅色(如...

    Blur_Image_c/C++_blur_

    在`Blur_Image_c/C++_blur_`这个项目中,可能包含了一些示例代码和资源,用于演示如何在C++中利用OpenCV库实现图像模糊效果。通过学习这些示例,你可以更深入地理解如何在实际代码中应用这些模糊算法。建议首先阅读...

    asp.net中TextBox获得焦点和失去焦点——客户端JavaScript事件

    在TextBox中,两个关键的事件是`focus`和`blur`。 1. `focus`事件:当TextBox获得焦点,即用户开始在该文本框内输入时,会触发这个事件。我们可以利用这个事件来执行一些预处理操作,比如设置默认值、显示提示信息...

    easyui textbox失去焦点事件及获取文本框的内容

    我们可以通过在文本框的data-options中指定events属性来绑定blur事件,如:<input class="easyui-textbox" data-options="events:{blur:getStaffno}" id="staffno"name="staffno" value="${user.staffno}"/> ...

    Javascript中click与blur事件的顺序详析

    在JavaScript中,click和blur是两种常见的事件,它们分别用于处理不同的交互情况。click事件通常在用户点击元素时触发,而blur事件则在元素失去焦点时发生。在某些特定的场景下,理解这两种事件的执行顺序是至关重要...

Global site tag (gtag.js) - Google Analytics