我有两个事件绑定到两个对象,一个在另一个内部,具有相同的大小。我们称之为container
和content
。这两个事件都有不同的功能。 content
上的事件默认设置,因为我无法删除它,我需要一种方法来阻止它(或暂时取消它)。
我希望点击它们只会触发与container
相关的事件。可能与否。实现它的最佳方式是什么?
以下示例。如果一切正常,单击白色方块应变为绿色,否则变为红色。
$(document).on('click', '#container', goGreen )
$(document).on('click', '#content', goRed )
function goGreen( event )
{
$('#content').addClass('green')
showClasses()
// Now stop!!!
// Don't run the click event on #content!!!
}
function goRed( event )
{
$('#content').addClass('red')
showClasses()
}
function showClasses()
{
$('#classes').html( $('#content').attr('class') )
}
#content {
display: inline-block;
width: 100px;
height: 100px;
border: 1px solid #000;
cursor: pointer;
}
.green {
background-color: lightgreen;
}
.red {
background-color: tomato;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="container">
<a id="content"></a>
</div>
<p id="classes"></p>
答案 0 :(得分:1)
从您的评论中澄清,您不希望执行content
上的处理程序,但您希望事件冒泡到父级。在这种情况下,您可以在content
侦听器函数本身中停止事件处理。 (虽然我觉得你根本不应该在content
上有听众,因为你没有执行它)
$(document).on('click', '#container', goGreen )
$(document).on('click', '#content', goRed )
function goGreen( event )
{
$('#content').addClass('green')
showClasses()
// Now stop!!!
// Don't run the click event on #content!!!
}
function goRed( event )
{
if(event.target.id === 'content')
return;
$('#content').addClass('red')
showClasses()
}
function showClasses()
{
$('#classes').html( $('#content').attr('class') )
}
#content {
display: inline-block;
width: 100px;
height: 100px;
border: 1px solid #000;
cursor: pointer;
}
.green {
background-color: lightgreen;
}
.red {
background-color: tomato;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="container">
<a id="content"></a>
</div>
<p id="classes"></p>
答案 1 :(得分:1)
您应该使用event.stopPropagation()
来阻止进一步执行被触发的事件。这是一个可以帮助您的工作演示:https://jsfiddle.net/uogt1tp7/
答案 2 :(得分:0)
一个选项是使用css并应用于内容pointer-events: none
,但请记住,这将禁用该元素上的所有指针事件。
答案 3 :(得分:0)
正如您在评论中提到的,您希望针对特定条件停止goRed
方法,然后在您的函数中执行此操作。
if(event.target.id=='content') return; // Add your condition here and return.
而不是event.target.id=='content'
条件检查您希望它执行的条件。
<强>更新强>
您可以检查此条件$(this).parent().is('#container')
以检查您的内容是否在container
内。
<强>段强>
$(document).on('click', '#container', goGreen )
$(document).on('click', '.content', goRed )
function goGreen( event )
{
$(this).find('.content').addClass('green')
}
function goRed( event )
{
if($(this).parent().is('#container')) return; // Add your condition here and return.
$(this).addClass('red')
}
.content {
display: inline-block;
width: 100px;
height: 100px;
border: 1px solid #000;
cursor: pointer;
}
#container{
display: inline-block;
padding: 3px;
border:2px solid red;
}
.green {
background-color: lightgreen;
}
.red {
background-color: tomato;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="container">
<a class="content"></a>
</div>
<a class="content"></a>