Javascript 当';鼠标输出';发生
我不知道为什么在Javascript 当';鼠标输出';发生,javascript,keypress,keydown,mouseleave,event-listener,Javascript,Keypress,Keydown,Mouseleave,Event Listener,我不知道为什么在mouseout事件发生时无法删除EventListener。 当一个表行悬停时,我想激活EventListener('keydown')。原因是我想使用“delete”键,在悬停行时删除悬停行。 我假设问题可能是由以下事实引起的:keydown事件附加到文档而不是执行它的特定元素。然而,将它添加到某个元素不是不可能吗 var table = document.querySelector('tbody'); var rows = table.querySelect
mouseout
事件发生时无法删除EventListener
。
当一个表行悬停时,我想激活EventListener('keydown')
。原因是我想使用“delete”键,在悬停行时删除悬停行。
我假设问题可能是由以下事实引起的:keydown
事件附加到文档
而不是执行它的特定元素。然而,将它添加到某个元素不是不可能吗
var table = document.querySelector('tbody');
var rows = table.querySelectorAll('tr');
for (i = 0; i < rows.length; i++)
{
var currentRow = table.rows[i];
var createClickHandler =
function(row, showHide)
{
return function()
{
console.log('showHide ',showHide);
if (showHide === 'hover' )
{
document.addEventListener('keydown' ,function(ev)
{
if (showHide == 'hover')
{
console.log('hover target ', ev.target);
}
},false);
return;
}
else if (showHide === 'leave')
{
document.removeEventListener('keydown' ,function(ev)
{
if (ev.target && showHide === 'leave')
{
console.log('out ',ev);
}
},false);
console.log('left');
}
};
};
currentRow.addEventListener('mouseover', createClickHandler(currentRow, 'hover'), false);
currentRow.addEventListener('mouseout', createClickHandler(currentRow, 'leave'), false);
}
应使用添加了addEventListener
的侦听器调用,而不是使用新函数。实际上,您是在告诉document
删除一个从未添加过的侦听器
这样做:
var listener=document.addEventListener('keydown',function(e){…});
document.removeEventListener('keydown',listener);
编辑:工作示例
var table=document.querySelector('tbody');
var rows=table.querySelectorAll('tr');
var log=document.getElementById('log');
对于(i=0;i
第1行
第2排
第3排
应使用添加了addEventListener的侦听器调用,而不是使用新函数。实际上,您是在告诉document
删除一个从未添加过的侦听器
这样做:
var listener=document.addEventListener('keydown',function(e){…});
document.removeEventListener('keydown',listener);
编辑:工作示例
var table=document.querySelector('tbody');
var rows=table.querySelectorAll('tr');
var log=document.getElementById('log');
对于(i=0;i
第1行
第2排
第3排
Ok,但我应该在哪里执行removeEventListener
?当我像你们展示的那样添加它时(在listener之后),它不起作用。我试着把它放在监听器中,但它也不起作用。请参阅我的最新答案。这只是基于您的示例的一个开始,您可能需要修改它以满足您的需要。当鼠标不在元素范围内时,您的代码段不会关闭keydown
事件。因此,即使执行了mouseout
事件,它仍在侦听keydown
事件,这是我不想听到的。我希望keydown
事件仅在mouseover
处于活动状态时执行。当鼠标处于关闭状态时,不应执行元素keydown
。让它适合你的需要是一个练习;)。为什么如果我console.log(listener)
,它会说undefined
,无论我把这个console.log放在哪里?好的,但是我应该在哪里执行removeEventListener
?当我像你们展示的那样添加它时(在listener之后),它不起作用。我试着把它放在监听器中,但它也不起作用。请参阅我的最新答案。这只是基于您的示例的一个开始,您可能需要修改它以满足您的需要。当鼠标不在元素范围内时,您的代码段不会关闭keydown
事件。因此,即使执行了mouseout
事件,它仍在侦听keydown
事件,这是我不想听到的。我希望keydown
事件仅在mouseover
处于活动状态时执行。当鼠标处于关闭状态时,不应执行元素keydown
。让它适合你的需要是一个练习;)。为什么如果我console.log(listener)
,无论我在哪里放置这个console.log,它都会显示undefined
?
var table = document.querySelector('tbody');
var rows = table.querySelectorAll('tr');
for (i = 0; i < rows.length; i++)
{
var currentRow = table.rows[i];
var createClickHandler =
function(row, showHide)
{
return function()
{
var delKey = function(ev)
{
console.log('hover target ', ev.target);
};
console.log('showHide ',showHide);
if (showHide === 'hover' )
{
//console.log('hovered ',row);
document.addEventListener('keydown' ,delKey,false);
document.addEventListener('keyup' ,function(){
document.removeEventListener('keydown',delKey,false);
console.log('removed event ');
},false);
document.body.addEventListener('click', function()
{
document.removeEventListener('keydown', delKey, false);
},false);
}
else if (showHide === 'leave')
{
console.log('hidden ');
}
};
};
currentRow.addEventListener('mouseover', createClickHandler(currentRow, 'hover'), false);
currentRow.addEventListener('mouseout', createClickHandler(currentRow, 'leave'), false);
}