Javascript jQuery没有';不允许动态事件侦听器
无论何时Javascript jQuery没有';不允许动态事件侦听器,javascript,jquery,web,Javascript,Jquery,Web,无论何时动作发生变化,事件都会按照旧动作进行;它不会动态变化。我还尝试: var action = 'click'; if (action == 'click') { $('#element').on(action, function() { // do something... }) } else if (action == 'mouseenter') { $('#element').on(action, function() {
动作
发生变化,事件都会按照旧动作进行;它不会动态变化。我还尝试:
var action = 'click';
if (action == 'click') {
$('#element').on(action, function() {
// do something...
})
} else if (action == 'mouseenter') {
$('#element').on(action, function() {
// do something completely different...
})
}
对于
智能雪花
:我需要根据动作
的不同,而不是同时处理一个元素。而操作本身可由客户端更改
编辑#2:我不想根据元素上使用的事件得出不同的结果。如果客户端选择“播放模式”,则操作设置为mouseenter,在这种情况下,#元素不应可单击*且仅在悬停时操作 您可以通过查看bind()
和unbind()
来动态更改函数。为了更好地跟踪,我当然也会考虑向它们添加名称空间
我在下面内联了jquery示例:
解除绑定演示
钮扣{
保证金:5px;
}
按钮#一个{
颜色:红色;
背景:黄色;
}
什么都不做。。。
绑定点击
解除绑定单击
点击
函数aClick(){
$(“div”).show().fadeOut(“慢”);
}
$(“#绑定”)。单击(函数(){
$(“theone”)
.bind(“单击”,单击)
.text(“可以单击!”);
});
$(“#解除绑定”)。单击(函数(){
$(“theone”)
.unbind(“单击”,单击)
.text(“什么也不做…”);
});
您可以通过这种方式拥有多个事件。然后根据e.type的值使用if-else语句
$('#element').on(action, function() {
if (action == 'click') {
// do something...
} else if (action == 'mouseenter') {
// do something else...
}
});
编辑:jsFiddle
HTML
您可以尝试以下方法:
var action = 'click';
$('div').on('click mouseover mouseout',function(e){
if(e.type == action)
//The event is equal to the expected action, handle accordingly
})
$('button').on('click',function(){
action = $(this).attr('id');
})
点击
激活点击事件
激活鼠标事件
$(“按钮”)。单击(函数()
{
var action=this.id;//您可以使用任何其他条件来匹配它
$(“#元素”).off();//删除所有委托事件
如果(操作=='单击')
{
$('#元素')。关于(操作,函数(){
警报(“点击调用”);
});
}else if(action=='mouseenter'){
$('#元素')。关于(操作,函数(){
警报(“已调用鼠标器”);
});
}
});
示例:您所面临的是预期的行为。因为,您仅在每次检查时注册背靠背事件。因此,首先,它将注册单击事件。一旦操作更改为mouseenter
,它将注册mouseenter
事件(我假设一旦操作更改,您将触发该代码)
您需要做的是在注册新事件之前从元素中删除现有事件。您可以在文档中阅读更多信息。您甚至可以在上面的链接中找到一些工作示例
即
我的答案是不要这样。。。实际上,您并不是在动态添加事件侦听器,您只是在毫无理由地添加逻辑运算符。ryan0319,那么正确的方法是什么呢?@PyRoss您需要编辑此问题,以便更清楚地了解所需的结果。我需要根据操作
的不同,对一个元素进行不同的处理,不是同时发生的。而操作本身可以由客户端更改。这不是我想要做的。我不想根据元素上使用了什么事件而得到不同的结果。如果客户端选择,比如说“播放模式”,那么action
被设置为mouseenter
,在这种情况下#元素
不应该再被点击*(点击时不应该有任何效果),只在悬停时操作,反之亦然。实际上,我认为这就是你想要做的,您只需要识别用例并扩展它。当事件发生并且您正在检查e.type时,只需在相同的if语句中添加一个“and”条件,以检查“action”是否是相同的事件。添加了一个jsfiddle。
<button id="click">
click
</button>
<button id="mouseover">
mouseover
</button>
<button id="mouseout">
mouseout
</button>
var action = 'click';
$('div').on('click mouseover mouseout',function(e){
if(e.type == action)
//The event is equal to the expected action, handle accordingly
})
$('button').on('click',function(){
action = $(this).attr('id');
})
<div id="element">
Click
</div>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<button id="click">
Activate Click Event
</button>
<button id="mouseenter">
Activate mouseEnter Event
</button>
<script>
$("button").click(function()
{
var action = this.id; // you may use any other criteria to match this up
$('#element').off(); // removes all delegated events
if (action == 'click')
{
$('#element').on(action, function() {
alert('click invoked');
});
} else if (action == 'mouseenter') {
$('#element').on(action, function() {
alert('mouseenter invoked');
});
}
});
</script>
function actionChanged() {
if(action == "mouseenter") {
$( "body" ).off( "click", "#element", clickFunction );
$( "body" ).on( "mouseenter", "#element", mouseEnterFunction );
} else if (action == 'click') {
$( "body" ).off( "mouseenter", "#element", mouseEnterFunction );
$( "body" ).on( "click", "#element", clickFunction );
}
}