- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有一个分配鼠标悬停的函数,这会向触发它的 div 添加一个悬停工具提示 div 和一个 mouseout 事件,以便我可以删除工具提示。
问题是 mouseout 事件会触发,但当我将鼠标移动到 div 之外的任何位置时,它会不断触发,因此鼠标的每个像素移动都会触发数百次。
这是设置:
function ToolTip(data)
{
var div = createDiv();
div.className = 'ToolTip';
div.innerHTML = 'This is a tooltip!';
addChild(div,document.body); // appends to given element
this.addEventListener('mouseout',function(){removeToolTip(div);},false);
}
function removeToolTip(el)
{
console.log('test');
this.removeEventListener('mouseout',removeToolTip,false);
removeDiv(el); //removes perfectly fine
}
for(var i=0;i<data.length;i++)
{
var div = document.getElementById('id'+i);
(function(i){
div.addEventListener("mouseover",function(){ToolTip(data[i]);},false);
})(i);
}
我不明白为什么 mouseout 不断触发,我在控制台日志中得到 test
所以它应该删除事件监听器。我哪里出错了?
最佳答案
您的事件处理逻辑非常困惑。
首先,您要向一系列 div 中的每一个添加鼠标悬停事件处理程序。
然后,每次触发 mouseover 事件时(可能会多次),您都会调用 ToolTip()
,这会在 this
上添加一个 mouseout 事件,该事件看起来是 window
对象,因为 ToolTip()
只是一个普通的函数调用,因此 this
要么是全局对象,要么是 undefined
(严格模式)。
然后,在 removeToolTip()
中,您尝试调用 removeEventListener('mouseout', ...)
,但这不起作用,因为您向其传递与使用的 addEventListener()
不同的函数。 removeEventListener()
要求您传入与传递给 addEventListener()
完全相同的函数,否则它不会执行任何操作。因此,由于您传递的是不同的函数,因此不会删除任何内容,并且您会累积 mouseout 事件以及所有窗口对象。
从结构上来说,您需要修复:
确保您在正确的对象上安装事件处理程序。您的函数中的 this
并不是您想要的。我建议您停止在这些函数中使用 this
并将您想要操作的对象作为参数传递给这些函数。
将实际的命名函数(不是匿名函数)传递给 addEventListener()
,以便稍后可以将其与 removeEventListener()
一起使用。
当您调用 removeEventListener()
时,您必须传递与 addEventListener()
中使用的完全相同的命名函数引用。
确保您也尝试在正确的对象上调用 removeEventListener()
。
有关如何在函数调用中设置 this
的更多信息,请参阅 this prior answer 中的五个编号点。 .
关于javascript - Mouseout 持续不断地发射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24522488/
我正在尝试使用 DynamicMethod 并尝试使用 IL 来创建一些对象。我想创建以下非常基本的对象: new Queue(new List{100}); 我已经使用 ILDASM 查看生成此代码
这是我stackoverflow的第一个问题!我有一个显示 mpl 图 Canvas 的 PyQT gui。我已将主轴周围的边距设置为 0,因此绘图将完全填满图形 Canvas 和包含它的小部件。问题
我的环境是 Windows 7,安装了 scala 2.11.4(运行良好),Java 1.8 我已经尝试过 spark-1.2.0-bin-hadoop2.4 和 spark-1.2.1-bin-h
对于我的生活,我无法弄清楚为什么我不能发送或捕获一些数据。 toggleNavigation() 触发,但我不确定 .emit() 是否真的在工作。 最终我想折叠和展开导航,但现在我只想了解如何将数据
我试图在 VUE 3 中传递一个 emit prop,每次传递它时我仍然得到 false,并且 prop 无法切换。 Accordion .vue
我有一个 View 模型,它采用初始 ViewState对象并具有可公开访问的 state可以收集的变量。 class MyViewModel(initialState: ViewState) : V
现在在玩 RxJava,偶然发现了以下问题: 我有 2 个不同的流: 带有项目的流 Stream(只有 1 个项目),它发出第一个流的转换信息。 所以基本上我有项目流,我希望所有这些项目与第二个流中的
我有一个 API 登录服务,它使用 http 服务来执行登录逻辑(LoginApiService、login-api.service.ts): login(data: LoginCredentials
我们有微服务架构,我们通过网络进行服务间调用。我们在顶层服务中使用 RxJava,这会导致向底层服务创建大量并行请求。因此,我收到“没有到主机的路由错误”或“连接错误”。为此,我想减慢 RxJava
Vue.component('rating-edit', { template:` {{rating.remark}} Sav
我最近购买了 Dream Cheeky Thunder 导弹发射器,我希望通过我的树莓派来控制它。 使用来自报复的代码(https://raw.githubusercontent.com/codeda
我制作了这段代码来记录发送到我的机器人的 DM: client.on('messageCreate', async message => { if (message.author.bot) r
我需要从服务器代码、路由器/ Controller 上的任何位置发出来自服务器的套接字。我检查了一些线程和谷歌,但没有按预期工作。 app.js var app = require('express'
我是一名优秀的程序员,十分优秀!