单击后从#id中删除jQuery事件(或阻止第二次单击)

时间:2013-03-15 12:50:29

标签: jquery ajax modal-dialog jquery-ui-dialog

人!

我正在尽力解决下面的问题,但经过几个小时后,我无法看到正确的路径!让我解释一下:

  • 我有一个元素a-href(#opener),当点击它时,会触发一个jQueryUI模式对话框,它通过ajax在div(#target)中加载一个URL。
  • 一切都很完美,但我想让它发生一次!
  • 加载模态窗口后,我能够为我的#opener a-href设置一个类(.deactivated)并删除id(#opener)以防止再次触发该动作,但是它不起作用。 .. a-href保持可点击状态并打开模态窗口(#target)多次点击它!
  • 我找到的唯一解决方案是使用$(this).fadeOut();从DOM中完全删除a-href。 ---,但它真的很难看,因为我的链接#opener只是在空气中消失了。

有什么想法吗? 非常感谢你。 -G。

<script>
$(document).ready(function() {
    $('#opener').click (function() {

        $('#target').load ('http://my.url', function(){
            $('#target').dialog({
                title: 'My Title',
                draggable: true,
                dialogClass:'My Class',
                modal: true,
                hide: { effect: 'fade', speed: 'fast' },
                show: { effect: 'fade', speed: 'fast' },
                closeOnEscape: true,
                closeText: 'Close',
                beforeClose: function(event, ui) { 
                   'window.location.reload(true)'
                },
            });//end dialog   
        });
        $(this).addClass('.deactivated');
        $(this).removeAttr('id');
    });
});

4 个答案:

答案 0 :(得分:8)

从元素中删除ID不会删除绑定在该元素上的任何处理程序(除非您使用了“事件委托”)。

使用.one(而不是.on或过时的.bind)绑定点击事件,然后在第一次触发后自动取消绑定处理程序:

$('#opener').one('click', ...)

或者在点击处理程序中禁用该事件:

$('#opener').on('click', function() {
    ...
    $(this).off('click').addClass('.deactivated');
});

注意:最好始终使用较新的.on(或.one)和.off函数,而不是.bind.click等。它使事件处理代码更加一致,并避免混淆.click如何用于注册事件处理程序或(无参数)触发事件处理程序。

答案 1 :(得分:4)

<强>描述

  

.one(),将处理程序附加到元素的事件。处理程序是   每个元素最多执行一次。

$('#opener').one('click',function(){
     //your code
    });

答案 2 :(得分:2)

您可以使用.one()函数设置一个仅触发一次的事件处理程序,然后将其自行删除:

$('#opener').one('click', function(event) {
    // your code here
});

答案 3 :(得分:2)

使用one

$('#opener').one("click", function() {

});

http://api.jquery.com/one/