2013-04-30 98 views
1

这段代码有什么问题吗?jquery off没有触发

$(document).ready(function() { 

    if($("#textbox-id-recipient").val()) { 
     console.log("In"); 


     $(document).on("click", "#textbox-id-recipient", function(event) { 
      addEmail($(this)); 
     }); 

     $('#textbox-id-recipient').trigger('click'); 

     $("#textbox-id-recipient").off("click"); 
    } 

... 
}); 

因此,页面刷新后,如果文本框有什么东西,它会触发点击事件,触发“开”事件之一,但它应该后起飞的事件,但不知何故,当我手动点击文本框,on事件仍然触发

+1

您从未将事件绑定到该元素。你将它绑定到文档... – Ian 2013-04-30 00:40:20

+1

我会好奇你为什么要绑定到'document'。既然你已经知道这个元素在那里,似乎没有任何事件委派需要。 – 2013-04-30 00:41:32

+0

尝试通过使用此代码删除处理程序。它应该工作:$(document).off(“click”,“#textbox-id-recipient”) – jmartsch 2013-04-30 00:44:01

回答

2

评论

考虑到这声明:

$(document).on("click", "#textbox-id-recipient", function(event) { 
    addEmail($(this)); 
}); 

你点击处理程序绑定到document,当click事件冒泡从哪里开始点击一路被调用。

$('#textbox-id-recipient').trigger('click'); 

这将模拟您的元素上的单击事件;如果事件没有处理,jQuery会通过父项将元素树向上展开,直到达到document

$("#textbox-id-recipient").off("click"); 

即使上面点击触发按预期工作,.off()只会看看目前的元素,也就是说,它不会自动执行“泡沫起来”。

替代1

因此,你应该禁用你连接它在相同的元素上单击处理程序,即:

$(document).off("click", "#textbox-id-recipient"); 

顺便说一句,知道标识符必须是唯一的,你可能以及直接在#textbox-id-recipient上附加事件处理程序,除非元素仅在以后添加。

$('#textbox-id-recipient').on('click', function(event) { 
}); 

替代2

另外,如果点击只能一次处理,使用.one()

$('#textbox-id-recipient').one('click', function(event) { 
}); 

或者,如果你想使用事件委派:

$(document).one('click', '#textbox-id-recipient', function(event) { 
}); 
2

将您的事件绑定到元素,而不是文档。

$('#textbox-id-recipient').on("click", function(event) { 
    addEmail($(this)); 
}); 

$('#textbox-id-recipient').trigger('click'); 

$("#textbox-id-recipient").off("click"); 
+1

绑定到文档没有什么问题,所以处理程序也绑定到动态添加的元素。我知道......网页上只能有一个ID。只是说。 – jmartsch 2013-04-30 00:51:00

+0

我没有说与文档绑定有什么问题。 – 2013-04-30 03:29:30

3

使用.one()

if($("#textbox-id-recipient").val()) { 
    console.log("In"); 

    $("#textbox-id-recipient").one("click", function(event) { 
     addEmail($(this)); 
    }); 

    $('#textbox-id-recipient').triggerHandler('click'); 
} 

演示:Fiddle