自定义“mouseenter"函数没有触发
Custom "mouseenter" function doesn't fire
这是JSFiddle。
我试图使mouseenter
工作在Chrome, Firefox等使用以下功能:
var addMouseenter = (function () {
var contains = function (parent, elem) {
return parent.contains ? parent.contains(elem) :
!!(parent.compareDocumentPosition(elem) & 16);
},
wrap = function (elem, method) {
return function (e) {
if (elem === e.target && !contains(elem, e.relatedTarget)) {
method.call(elem, e);
}
};
};
return function (elem, listener) {
var listener2 = wrap(elem, listener);
elem.addEventListener('mouseover', listener2, false);
};
}());
一切都很好,直到我遇到这个特殊的情况:
- 元素A具有以下自定义
mouseenter
侦听器之一 - 元素A包含元素B
- 元素B正对着元素A的边缘
- 在同一条边输入元素A
我的期望是mouseover
事件将在元素B上触发,并向上冒泡到元素a。然而,情况似乎并非如此。我用Chrome 13和Firefox 3.6进行了测试,得到了同样的结果。我搞砸了什么吗?
如果你不反对使用jQuery:
$(document).ready(function() {
$('#first').mouseover(function (e) {
if ($(e.target).attr('id') != 'second') {
alert('hello');
}
});
});
在你的JSFiddle中试过了,它工作了:当你进入绿色方块时,它不会开火;当你从外面进入红色方块时,它会开火;当你从绿色方块进入红色方块时,它会开火。这就是你想要的,对吗?
新JSFiddle或者保持你的javascript方法:
// Misc set-up stuff
var greet = function () { alert('Hi, my name is "' + this.id + '."'); },
first = document.getElementById('first'),
second = document.getElementById('second');
// The Actual Function
var addMouseenter = (function () {
var contains = function (parent, elem) {
return parent.contains ? parent.contains(elem) :
!!(parent.compareDocumentPosition(elem) & 16);
},
wrap = function (elem, method) {
return function (e) {
//if (elem === e.target && !contains(elem, e.relatedTarget)) {
if (elem === e.target && (e.target != second)) {
method.call(elem, e);
}
};
};
return function (elem, listener) {
var listener2 = wrap(elem, listener);
elem.addEventListener('mouseover', listener2, false);
};
}());
// GOGOGO
addMouseenter(first, greet);
http://jsfiddle.net/AUc88/我的自定义函数没有触发的原因是它没有工作。
我更新了小提琴,显示一切都是应该的。
我的错误只是检查e.target
是否与我附加侦听器的元素相同。我需要检查的是它们是否相同或,如果e.target
是元素的子元素。
当您快速地将鼠标移到两个方块上时,它只在内部方块上注册mouseover
事件,并且由于我的侦听器附加到外部方块上,因此elem === e.target
测试失败。
wrap
函数中的if
代码改成了:
if ((elem === e.target || contains(elem, e.target)) &&
!contains(elem, e.relatedTarget)) {
e.stopPropagation();
method.call(elem, e);
}
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- 如何通过hover()或mouseenter函数更改选项值,例如
- Javascript mouseenter() 悬停函数不起作用
- jQuery 超时函数从未在 mouseEnter mouseleave 上调用过
- mouseenter和mouseleave函数的一些问题
- 如何停止jQuery函数mouseenter()和mouseleave()的重复
- 如何在此脚本中为mouseenter函数添加延迟
- 这个对象位于.mouseenter()函数中
- 与mouseenter关联的调用函数
- 自定义“mouseenter"函数没有触发
- 为什么mouseenter会触发函数,而你却没有'不要将鼠标悬停在元素上
- jQuery mouseEnter 函数 - 如果颜色还没有,则更改颜色
- Mouseenter内部函数不改变属性