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 );
    }
}