Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Rails 4:DOM已经准备好,AJAX响应会导致重复_Javascript_Jquery_Html_Ruby On Rails_Ajax - Fatal编程技术网

Javascript Rails 4:DOM已经准备好,AJAX响应会导致重复

Javascript Rails 4:DOM已经准备好,AJAX响应会导致重复,javascript,jquery,html,ruby-on-rails,ajax,Javascript,Jquery,Html,Ruby On Rails,Ajax,问题 有没有一种好的技术可以避免在AJAX响应中调用相同的代码javascript(jquery) 示例 假设我有这些视图和js文件 index.html.erb <div class="listing_users"> <%= render @users %> </div> 当我通过AJAX创建一个新用户时,我让rails在我的create.js.erb响应中呈现它 $(".listing_users").append("<%= j(render(

问题

有没有一种好的技术可以避免在AJAX响应中调用相同的代码javascript(jquery)

示例

假设我有这些视图和js文件

index.html.erb

<div class="listing_users">
  <%= render @users %>
</div>
当我通过AJAX创建一个新用户时,我让rails在我的
create.js.erb
响应中呈现它

$(".listing_users").append("<%= j(render(:partial => @users)) %>")
$(".listing_users").css({"background-color": "red"})
只要在DOM就绪时调用它,并在AJAX响应中调用它即可。但是,这也会调用代码两次。

您可以在ready处理程序和ajax回调之间共享一个

这个对象的
done
方法将包含您的代码,而您可以从ajax回调和ready处理程序中调用它的resolve方法

即使多次请求,也只能执行一次解析

代码示例:

// jquery must have been included here
var g_cbguard = new Deferred();
g_cbguard
    .done(function () {
        // your code that shall be executed only once
    })
;
// ...

// ready handler
$(document).ready(function () {
    // ...
    g_cbguard.resolve();
    // ...
});
// ...

// somewhere else in your ajax call
$.ajax(
    //...)
).done( function () {
    g_cbguard.resolve();
});
// ...

回答得很好。我不知道
jquery'deferred'对象
。它不像我在rails中使用AJAX那样工作,但我正在研究如何在rails中使用它
$(".listing_users").append("<%= j(render(:partial => @users)) %>")
$(".listing_users").css({"background-color": "red"})
function set_red(){
  $(".user").css({"background-color": "red"})
}
// jquery must have been included here
var g_cbguard = new Deferred();
g_cbguard
    .done(function () {
        // your code that shall be executed only once
    })
;
// ...

// ready handler
$(document).ready(function () {
    // ...
    g_cbguard.resolve();
    // ...
});
// ...

// somewhere else in your ajax call
$.ajax(
    //...)
).done( function () {
    g_cbguard.resolve();
});
// ...