2014-05-21 212 views
1

我一直试图删除点击事件处理程序后点击一次,以防止事件多次发射。点击后立即删除点击事件处理程序

我试过.unbind().off().one()并把每个在功能的各个不同的地方,但似乎没有工作。

如果我使用.off(),我得到一个undefined is not a function错误。

如果我使用.one()如果我点击另一个按钮,我想基本上打开事件。所以如果我点击选择,我希望它只触发一次,但如果我然后点击取消选择,我想选择再次点击。

我试过做下面的事,但奇怪的代码甚至没有触发,所以我一直被迫使用click()

$().on('click', function()... 

我应该使用哪个函数,应该在哪里放?

(function($) { 

Drupal.behaviors.wysiwyg = { 
    attach: function(context, settings) { 

     var toggle = function(state) { 
      $('#wysiwyg-profile-form .buttons-and-plugins input:checkbox').attr('checked', state); 
     } 

     $('#wysiwyg-select-all').click(function(){ 
    toggle(true); 
      return false; 
     }); 

     $('#wysiwyg-unselect-all').click(function(){ 
    toggle(false); 
      return false; 
     }); 
    } 
} 

}(jQuery)) 
+0

_If我使用.off()我得到一个未定义不是函数错误._您正在使用哪个版本的jQuery? – Satpal

+0

@Satpal版本1.9 – Keven

+0

除非您共享该代码,否则我们无法告诉您使用'.off()'或'.one()'有什么问题。 – Blazemonger

回答

1

检查是否适用于您。还要确保jquery版本在“开”,“关”工作时高于1.7。

(function($) { 

    Drupal.behaviors.wysiwyg = { 
    attach: function(context, settings) { 
    var counter = 0; 
     var toggle = function(state) { 
     $('#wysiwyg-profile-form .buttons-and-plugins input:checkbox').attr('checked', state); 
     } 

     $(document).off('click',"#wysiwyg-select-all").on('click', "#wysiwyg-select-all", function(e) { 
     toggle(true);    
     return false; 
     }); 

     $(document).off('click',"#wysiwyg-unselect-all").on('click', "#wysiwyg-unselect-all", function(e) { 
     toggle(false);  
     return false; 
     }); 
    } 
    } 

}(jQuery)) 
+0

感谢您询问我的jQuery版本是否高于1.7。我意识到事实上,我的版本太低了。一旦我更新到1.9,我不再有'.on('click')'的未定义错误,所以现在'.off()''.on()'工作。我喜欢这种情况下的链接,所以我会给你。 – Keven

0

事情是这样的:

$("#wysiwyg-select-all").one("click", function() { 
    toggle(true); 
    return false; 
}); 
+0

我刚刚更新了我的问题,但是如果我使用'.one()'我想要事件被再次触发,如果其他事件被触发。合理? – Keven

+0

那么...重新绑定它?你是那个说你想解除它的人。 –

+0

我试过重新绑定它无济于事。在这种情况下我会怎么做?创建一个包装函数,然后在事件内部调用它? – Keven

0

添加一个类名点击按钮,然后删除类一旦其点击一次。

$('#wysiwyg-select-all .myclassname').on('click', function(){ 
    toggle(true); 
    $(this).removeClass('myclassname'); 
    $('#wysiwyg-unselect-all').addClass('secondclassname'); 
    return false; 
}); 

$('#wysiwyg-unselect-all .secondclassname').on('click', function(){ 
    toggle(false); 
    $('#wysiwyg-select-all').addClass('myclassname'); 
    $(this).removeClass('secondclassname'); 
    return false; 
}); 
+1

除非您使用事件委派,否则这将不起作用。 – Barmar

0

这应该用于动态创建的元素工作:

(function ($) { 

    Drupal.behaviors.wysiwyg = { 
     attach: function (context, settings) { 

      var toggle = function (state) { 
       $('#wysiwyg-profile-form .buttons-and-plugins input:checkbox').attr('checked', state); 
      }; 

      $(document).on("click", "#wysiwyg-select-all", selectFn()); 
      $(document).on("click", "#wysiwyg-unselect-all", unselectFn()); 
     } 
    }; 

}(jQuery)); 


function selectFn() { 
    $(document).off("click", '#wysiwyg-select-all', "**"); 
    $(document).on("click", "#wysiwyg-unselect-all", unselectFn()); 
    toggle(true); 
    return false; 
} 

function unselectFn() { 
    $(document).off("click", '#wysiwyg-unselect-all', "**"); 
    $(document).on("click", "#wysiwyg-select-all", selectFn()); 
    toggle(false); 
    return false; 
} 
+0

我试过了。它抛出'Uncaught TypeError:未定义不是函数'错误。 – Keven

+0

已更新为@aecend评论 – MattSizzle

+0

更新为动态元素 – MattSizzle

1

修订

我与几个其他这些家伙们暗示的东西乱搞,我认为这正是你需要做什么:

(function ($) { 

    Drupal.behaviors.wysiwyg = { 
     attach: function (context, settings) { 

      var selectFn = function() { 
       toggle(true); 
       return false; 
      } 

      var unselectFn = function() { 
       toggle(false); 
       return false; 
      }  

      var toggle = function (state) { 
       $('#wysiwyg-profile-form .buttons-and-plugins input:checkbox').attr('checked', state); 
       if (state) { 
        $(document).off("click", '#wysiwyg-select-all,#wysiwyg-unselect-all', "**"); 
        $(document).on("click", "#wysiwyg-unselect-all", unselectFn; 
       }else{ 
        $(document).off("click", '#wysiwyg-select-all,#wysiwyg-unselect-all', "**"); 
        $(document).on("click", "#wysiwyg-select-all", selectFn; 
       } 
      }; 

      $(document).on("click", "#wysiwyg-select-all", selectFn); 
      $(document).on("click", "#wysiwyg-unselect-all", unselectFn); 

     } 
    }; 

}(jQuery)); 

它切换按钮事件的绑定,并将与动态创建的元素一起使用。这是Matt Green的答案的一个衍生物,但我注意到他的几个问题,即他在事件绑定中调用selectFn和unselectFn而不是引用它们。

+0

第二个不适合我...它仍然进入循环。 – Keven

+0

@Kevin,我改变了它存储引用的方式并将变量移入全局范围。你介意尝试吗? – aecend

+0

我做了你所说的,并且它不再击中'toggle(true)',但是,这并不意味着点击甚至还没有被解雇?它看起来像点击事件仍然被击中,但当它被击中时没有任何反应。 – Keven

0

为什么不使用任何全局变量作为标志。点击事件设置为true。

if (btn1Clicked) 
    return; 
btn1Clicked=true; 

并重新启用只是将其设置为false。 如果需要,您可以使用return false而不是return。

+0

“为什么不使用任何全局变量作为标志”,因为应该避免使用全局变量,除非绝对需要 – MattSizzle

+0

@MattGreen以及它为什么如此。 –

+0

如果全局变量在您认为是唯一的名称空间中受到保护,则可以使用全局变量,并且仅在有益时才使用。主要问题是全局变量可能使一段代码更可能与其他代码片段发生冲突(如果不使用不同的名称空间或非常独特的名称)。出于这个原因和其他原因,最好在实际上不需要时避免全局变量。 – MattSizzle

相关问题