什么是事件代理(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中focus和blur事件的应用方法,展示了如何通过这两个事件来改善用户填写表单的体验。通过使用jQuery的事件绑定方法,我们可以轻松地在用户交互时提供及时的反馈和动态变化,从而...
本压缩包包含的资源是基于jQuery的一个插件,专门用于表单验证,它根据元素的`focus`和`blur`事件来触发验证过程。 `focus`事件在用户将焦点转移到某个元素(如输入框)时触发,而`blur`事件则在用户焦点离开该元素...
JavaScript事件代理(Event Delegation)是一种优化前端性能和提高代码可维护性的技术。它基于事件冒泡或捕获机制,允许我们为父...通过阅读和分析这个示例,你可以更深入地理解如何在实际项目中有效地使用事件代理。
在例子中,一个列表和一个表单分别使用了mouseover、mouseout、focusin、focusout以及focus、blur事件进行处理,以适应不同浏览器的事件处理机制。 4. 事件委托的优势 - 减少内存占用:不需要为每个元素单独绑定...
在DOM2级事件处理方法中,我们使用`addEventListener`方法添加事件监听器: ```javascript document.getElementById('myInput').addEventListener('blur', validateInput); ``` `onblur`事件通常与`onfocus`事件...
本篇文章将探讨如何在Vue中使用Mint UI的Field组件来监听并处理`blur`和`focus`事件。 `blur`事件发生在元素失去焦点时,而`focus`事件则在元素获得焦点时触发。在Vue中,我们可以直接通过Mint UI的Field组件的事件...
2.在实例中添加指令 directives: { 'mtfocus' (el, binding, vnode) { let mtinput = el.querySelector('input') mtinput.onfocus = function () { ...//如果要对节点的数据进行更改,且更改要映射到页面上,则...
在Angular中,我们可以使用事件绑定语法来监听和响应这些事件。对于 `blur` 事件,我们可以这样绑定: ```html (blur)="onBlurMethod()"> ``` 在这个例子中,`onBlurMethod()` 是一个Angular组件的方法,当 `<div>`...
在开发中我们会经常遇到blur和click冲突的情况。下面叙述了开发中常遇到的“下拉框”的问题,并提供了两种解决方案。 一、blur和click事件简述 blur事件:当元素失去焦点时触发blur事件;其为表单事件,blur和focus...
- 在绑定 focus 和 blur 事件时,确保传递的参数是正确的选择器,以便选中正确的元素。 - 使用 .ready() 方法确保在 DOM 完全加载之后再绑定事件,避免因为 DOM 元素还未加载完成而导致的事件绑定失败。 - 使用 ....
然而,在IE6中,存在一个已知的bug,当用户点击一个`textarea`元素时,这不仅会导致`textarea`的`focus`事件被触发,还意外地引发了整个窗口的`blur`事件,从而导致`focus`和`blur`事件的配对混乱。这个问题会影响到...
在layui框架中,动态绑定事件通常使用jQuery来进行。但是,由于兼容性问题,移动端iOS不支持直接在body上使用事件委托,因此,我们需要将事件监听的目标改为其他元素,例如.setBox。 在实际操作中,我们可以通过...
接下来,我们来探讨如何使用JavaScript中的blur和focus事件。这两个事件分别在文本框失去焦点和获得焦点时触发。在blur事件的事件处理函数中,我们会检查文本框的内容,如果为空,则设置文本框的前景色为浅色(如...
在`Blur_Image_c/C++_blur_`这个项目中,可能包含了一些示例代码和资源,用于演示如何在C++中利用OpenCV库实现图像模糊效果。通过学习这些示例,你可以更深入地理解如何在实际代码中应用这些模糊算法。建议首先阅读...
在TextBox中,两个关键的事件是`focus`和`blur`。 1. `focus`事件:当TextBox获得焦点,即用户开始在该文本框内输入时,会触发这个事件。我们可以利用这个事件来执行一些预处理操作,比如设置默认值、显示提示信息...
我们可以通过在文本框的data-options中指定events属性来绑定blur事件,如:<input class="easyui-textbox" data-options="events:{blur:getStaffno}" id="staffno"name="staffno" value="${user.staffno}"/> ...
在JavaScript中,click和blur是两种常见的事件,它们分别用于处理不同的交互情况。click事件通常在用户点击元素时触发,而blur事件则在元素失去焦点时发生。在某些特定的场景下,理解这两种事件的执行顺序是至关重要...