Javascript Rails check partial在ajax调用后已完全加载

Javascript Rails check partial在ajax调用后已完全加载,javascript,jquery,ruby-on-rails,ajax,Javascript,Jquery,Ruby On Rails,Ajax,我在ajax调用后渲染一个部分: show.js.erb $("#notice_feed").html("<%=j render 'shared/notice_feed' %>") <ol class="notices" id="notice_list"> <%= render @notices %> </ol> 当您单击名称时,它会正确地向下滚动,但有时只会停止滚动正确的@通知,而其他@通知。我怀疑问题在于jquery是在整个部分列表完成

我在ajax调用后渲染一个部分:

show.js.erb

$("#notice_feed").html("<%=j render 'shared/notice_feed' %>")
<ol class="notices" id="notice_list">
  <%= render @notices %>
</ol>
当您单击名称时,它会正确地向下滚动,但有时只会停止滚动正确的
@通知
,而其他
@通知
。我怀疑问题在于jquery是在整个部分列表完成呈现之前调用的。我试着用

$(window).on("load", function() {
  ...
};
但这不会触发,大概是因为它在加载原始页面时已经触发了

如何使用jquery检查ajax调用后的部分内容是否已完全加载


或者,有没有更好的方法来识别div并准确地滚动到它?

您可以通过两种方式来实现这一点:

轨道方式:

在js上创建一个调用动画滚动的方法,如下所示:

name.on('click', function() {
  scrolling_to(this.className);
});
function scrollin_to(name){
  $("#absolute-div").animate({scrollTop: $('#notice_' + name).offset().top -200 }, 500); 
}
然后,在show.js.erb中执行以下操作:

 scrolling_to(@notice_show.name);
Js方式:

使用ajax调用rails路由:

jQuery.ajax({
          type: 'get',    
          url: 'your url here',
          dataType: 'json',
          cache: false,
          success: function(data, textStatus){
            $("#notice_feed").html(data.msg);
            $("#absolute-div").animate({scrollTop: $('#notice_' + data.name).offset().top -200 }, 500);
          }
        });
Rails显示方法:

def show
  data ={
   msg: @notice_feed
   name: @notice_feed.name
  }
render json: data;
end

解决了。我将
.offset()
更改为
.position()
。现在它工作得很好

name.on('click', function() {
  $("#absolute-div").animate({scrollTop: $('#notice_' + this.className).position().top -200 }, 500); 
});

我需要的是
@notices
相对于父对象的位置,而不是文档(jQuery)。

很容易找到,所以您可能想将其用作允许单击的门?您正在使用的当前检查无法判断是否有更多的分区要加载。也许您可以尝试使用
$(function(){//Handler for.ready()called.})而不是
$(窗口)。在(“加载”,function(){…};
上,我在ajax调用后呈现部分:这是在回调中还是在内联中?如果是在回调中,则将其他代码放在同一回调中。如果不是,则应该是。ajax点击控制器的
show
操作,然后调用
show.js.erb
name.on('click', function() {
  $("#absolute-div").animate({scrollTop: $('#notice_' + this.className).position().top -200 }, 500); 
});