jQuery在点击内覆盖.click事件

bra*_*rad 21 jquery

我有这些功能:

TargetWorksheet.toggle_child_locations = function(id){
  $("#location-children-"+id).slideToggle("slow"); 
}

TargetWorksheet.get_child_locations = function(id, lvl){
  //Ajax grab all children and targets, and display children
  $.get('child_locations',{ location_id: id, level: lvl}, function(data){
    $("#location-children-"+id).append(data);
    TargetWorksheet.toggle_child_locations(id);
  });

  //Change onClick to just toggle since child data will now be loaded
  $("#location-toggle-"+id).click(function(){
    TargetWorksheet.toggle_child_locations(id);
  });
}
Run Code Online (Sandbox Code Playgroud)

这个电话:

$(function(){
  TargetWorksheet.toggle_child_locations(2);
  $("#location-toggle-2").click(function(){
    TargetWorksheet.get_child_locations(2,1);
  });
});
Run Code Online (Sandbox Code Playgroud)

所以我将点击事件附加到我的"+"链接(#location-toggle-2),该链接切换子数据.在第一次单击时,我想进行ajax调用以检索子数据,但是我只想覆盖#location-toggle-2上的.click,以便它现在只是切换,并且不会进行ajax调用.上面的代码不起作用,它似乎没有覆盖.click,并且每次都进行ajax调用.

有谁知道如何覆盖项目的.click事件?我也尝试 $("#location-toggle-"+id).click(TargetWorksheet.toggle_child_locations(id)); 过,由于某种原因,它一直在递归地翻转.

思考?

Dav*_*ard 67

你唯一缺少的是每次调用时都会添加一个新的处理程序,而不是覆盖现有的处理程序..click()

您可以$("#location-toggle-"+id).unbind()在添加新元素之前清除该元素上的处理程序,它应该按预期工作.

  • 最好使用`unbind("click");`,这将取消绑定`click`事件类型.这在使用像`button()`这样的JQueryUI小部件时特别有用,在这种情况下你只想取消绑定点击并保留其他事件,如`hover`等等. (9认同)
  • 不要忘记链接.我通常这样做:`$("#myElement").off("click").on("click",handler);`这使代码更清洁 (6认同)