如何在使用Ajax加载的元素上调用JavaScript

如何在使用Ajax加载的元素上调用JavaScript,javascript,jquery,ruby-on-rails,ajax,Javascript,Jquery,Ruby On Rails,Ajax,我有一些功能,我想在文档准备好时以及在调用Ajax之后使用,因为需要选择的页面中加载了新项目 我可以通过这样做来实现这一点: var ready; ready = function(){ //my code here }; $(document).ready(ready) $(document).ajaxComplete(ready) 但这会导致一个问题,即每个Ajax调用似乎都会为函数的运行增加另一个时间。在第一次AjaxComplete调用之后,它运行一次、两次、三次,以此类推 当用

我有一些功能,我想在文档准备好时以及在调用Ajax之后使用,因为需要选择的页面中加载了新项目

我可以通过这样做来实现这一点:

var ready;
ready = function(){
  //my code here
};

$(document).ready(ready)
$(document).ajaxComplete(ready)
但这会导致一个问题,即每个Ajax调用似乎都会为函数的运行增加另一个时间。在第一次AjaxComplete调用之后,它运行一次、两次、三次,以此类推

当用户在页面上时,我如何优雅地让所有代码以我想要的方式在任何时候运行一次

顺便说一句,这是一个RubyonRails应用程序


非常感谢。

您正在寻找jQuery的
.delegate
功能。is所做的是绑定到父元素,每当在其内部触发事件时,它都会检查生成事件的子元素是否与您提供的选择器匹配;如果它这样做了,它将触发处理器。例如,下面的示例导致单击表中所有现有和未来的
td
s以切换“所选”类:

因此,如果您向表中添加新行,单击它将切换“已选择”,即使在调用委托时该行不存在


让我知道这是否有意义,或者您是否有任何问题:)

神奇的词语是事件委派。不完全是,它只将其绑定到一个元素,即表。当事件传播到表中时,jQuery测试
event.target
是否匹配给定的选择器(
“td”
),如果匹配,则运行回调,使
this
等于
event.target
。这在用例中非常有效。我将把它保留一段时间,看看是否有其他解决方案可以在更一般的意义上应用,而不是改变所有的函数。感谢您的快速回复@KevinB我的意思是,它比字面上更有效地绑定,但更新了答案以反映内部工作。现在看起来好点了吗?(如果有任何您想添加的内容,请随意编辑)是的,那更好。:)
$( "table" ).delegate( "td", "click", function() {
  $( this ).toggleClass( "chosen" );
});