Javascript 当在元素外部单击时,如何调用函数并避免触发“在内部单击”事件?
我的页面上有类为“”的文件夹。文件夹ico”。当我单击某个文件夹时,通过调用函数addTinyMenuInsideIco()显示该文件夹中的小菜单。现在,如果我单击除“单击的文件夹”或“单击的文件夹的元素”之外的任何元素,则应使用removeinymenuinsideico()删除微小菜单。不幸的是,$('body')。在('click')上,函数(e){}…在单击文件夹后会自动触发。有没有正确操作的提示Javascript 当在元素外部单击时,如何调用函数并避免触发“在内部单击”事件?,javascript,jquery,Javascript,Jquery,我的页面上有类为“”的文件夹。文件夹ico”。当我单击某个文件夹时,通过调用函数addTinyMenuInsideIco()显示该文件夹中的小菜单。现在,如果我单击除“单击的文件夹”或“单击的文件夹的元素”之外的任何元素,则应使用removeinymenuinsideico()删除微小菜单。不幸的是,$('body')。在('click')上,函数(e){}…在单击文件夹后会自动触发。有没有正确操作的提示 <div class="folder-ico"> <div cl
<div class="folder-ico">
<div class="folder-image">
<h2>Ico 1</h2>
</div>
<div class="folder-ico">
<div class="folder-image">
<h2>Ico 2</h2>
</div>
<!-- ... -->
<div class="folder-ico">
<div class="folder-image">
<h2>Ico n</h2>
</div>
<script>
$('.folder-ico').on('click', whenClickOnIco);
function whenClickOnIco ()
{
if(!$(this).hasClass('clicked'))
{
// Add class '.clicked'
$(this).addClass('clicked');
// Add tiny menu inside ico.
addTinyMenuInsideIco();
// Remember 'old this'
let tempThis = this;
// Add click event to all body elements.
$('body').on('click',function(e)
{
// Clicked on some body element except class '.clicked'.
if(!$(e.target).hasClass('clicked'))
{
// Remove class '.clicked'.
$(tempThis).removeClass('clicked');
// Remove tiny menu inside ico.
removeTinnyMenuInsideIco();
// Unbind click event.
$('body').unbind('click');
// Add event click to unbinded elements.
$('.folder-ico').on('click', whenClickOnIco);
}
})
}
}
</script>
Ico 1
Ico 2
图标
$('folder ico')。在('click',whenClickOnIco');
函数whenClickOnIco()
{
if(!$(this).hasClass('clicked'))
{
//添加类“.clicked”
$(this.addClass('clicked');
//在ico中添加小菜单。
addTinyMenuInsideIco();
//还记得“旧的这个”
让他=这个;
//将单击事件添加到所有主体元素。
$('body')。在('click',函数(e)上
{
//单击了除类“.Clicked”之外的某些主体元素。
if(!$(e.target).hasClass('clicked'))
{
//删除类“.clicked”。
$(testhis).removeClass('clicked');
//移除ico内的小菜单。
移除InneymenuInsideico();
//取消绑定单击事件。
$('body')。解除绑定('click');
//添加事件单击以取消绑定元素。
$('folder ico')。在('click',whenClickOnIco');
}
})
}
}
在事件调用中尝试以下代码:event.preventDefault();
或者,可以通过添加
event.stopPropagation();
在事件调用中尝试以下代码:
event.preventDefault();
或者,可以通过添加
event.stopPropagation();
这种行为被称为“冒泡”(我建议您阅读) 该思想的要点是:当在内部元素中激发事件时,事件首先被激发到元素中,然后按顺序被激发到父元素中 大多数情况下,这是强大的。例如,如果我有一个内置图像的按钮,我希望单击图像以触发按钮的单击事件侦听器。不幸的是,有时,就像您的情况一样,您不希望这样。幸运的是,有一个解决方案 正如您所知,js中的每个事件侦听器都有一个
事件
参数。该参数有一个名为stopPropagation()
的方法,用于停止冒泡。因此,您需要执行以下操作:
ICKONICO(e)时的功能
{
e、 停止传播();
// ...
});
这种行为称为“冒泡”(我建议您阅读)
该思想的要点是:当在内部元素中激发事件时,事件首先被激发到元素中,然后按顺序被激发到父元素中
大多数情况下,这是强大的。例如,如果我有一个里面有图像的按钮,我希望单击该图像来触发按钮的单击事件侦听器。不幸的是,有时候,就像你的情况一样,你不想这样。幸运的是,有一个解决办法
您可能知道,js中的每个事件侦听器都有一个event
参数。此参数有一个名为stopPropagation()
的方法,用于停止冒泡。因此,您需要做的是:
ICKONICO(e)时的功能
{
e、 停止传播();
// ...
});
preventDefault()
在这里不相关。preventDefault()
在这里不相关。我应该学习冒泡,但是将e.stopPropagaton()添加到whenClickOnIco()不起作用。无论如何,在我的情况下,把点击放在点击中是一个好的解决方案吗?也许还有另一种方法?@Tomasz使用stopPropagation()显示完整的代码。@Tomasz还有一种更简单的方法在jquery中执行一次性事件,使用once()
而不是on()
。干得好。如果在文件夹上按更长时间,则会激活“小菜单”。我加了e.stopPropagation();在tapLongPress(e)功能开始时。尝试取消注释('body')。在('click')上,函数(e)并运行。PS:我还注意到,在长时间按下并释放鼠标后,whenClickOnCatFolder会激发并添加。选定的folder cat类不太好…我应该了解冒泡,但会将e.stopPropagaton()添加到whenClickOnIco()中不起作用。无论如何,在我的情况下,将单击放在单击内是一个好的解决方案吗?也许还有其他方法可以做到吗?@Tomasz使用stopPropagation()显示完整的代码。@Tomasz还有一种更简单的方法可以在jquery中执行一次性事件,使用once()
而不是on()
。给你。如果你在文件夹上按的时间更长,小菜单就会激活。我在tapLongPress(e)函数的开头添加了e.stopPropagation();尝试取消注释('body')。打开('click',函数(e)和run.PS:我还注意到,在长时间按下并释放鼠标后,当ClickKoncatFolder启动并添加.selected folder cat类时,这是不好的。。。