0

我使用以下代码作为调试 - 我只是想观察单选按钮的点击并适当地设置它们的样式。

$("#item-select-form label.radio").click(function() {
  var child_input, input_id;
  console.log("clicked!");
  child_input = $(this).children("input");
  input_id = child_input.attr("id");
  return console.log(input_id);
});

代码似乎工作正常。我得到了“点击!” 我看到了孩子输入的正确 id。但是,这段代码被执行了两次,我不知道为什么(如果这有什么不同,我正在使用 Rails)。

我如何追踪它的调用位置和原因?

4

2 回答 2

1

如果您在 ajax 响应上绑定此事件,它将被触发多次,您应该在再次绑定之前取消绑定该事件(如果在它不会导致错误之前没有绑定),您的代码也有改进,你可以使用这个:

$("#item-select-form").find("label.radio").click...

或者

$("#item-select-form").click(function(e){ 
    var elemPressed = $(e.target);
    if( elemPressed ).is("label.radio") ){
      //do your stuff
    }
});

这两种技术都比您的原始选择器(使用sizzle )和第二个(我最喜欢的)更快让我们为页面的整个部分创建一个事件,而不是创建多个事件(从而降低性能)到 DOM

于 2012-12-22T01:02:26.170 回答
1

这几乎可以肯定是因为该事件被多次绑定。jQuery 执行所有绑定的事件处理程序。

为了确保它只执行一次,你应该只绑定一次。或者你应该unbind在再次绑定之前处理任何绑定的处理程序。例如:

// unbind the previously bound handler
$("#item-select-form label.radio").unbind('click');

// bind your click
$("#item-select-form label.radio").click(function() {
...
});
于 2012-12-22T00:49:31.580 回答