Javascript and Ajax Calls



我有几个关于在ajax调用后加载javascript的问题。

所以我在轨道上使用 ruby,并且我通过 ajax 调用加载了不同的页面(我这样做是因为我有一个音频播放器,我想在页面重新加载时继续播放)。

问题是,当我使用 ajax 更改页面时,javascript 不会在新页面上重新加载(或工作)。

例如,我有一个网格系统,它使用 javascript 根据宽度设置网格图像的高度。除非我重新加载页面或将脚本放在 html 文件底部的脚本标记中,否则脚本不起作用。

有没有办法重新加载javascript?我已经尝试过location.reload(),但这只会刷新页面并破坏整个目的。谢谢!

下面是一个示例:

显示.js.erb

$('#results').html("<%= escape_javascript(render partial: 'songs/showcard', locals: { song: @song }) %>");

songs_controller

  def show
    respond_to do |format|
      format.js
      format.html
    end
  end

链接到显示页面

<%= link_to song, remote: true do %><%= song.title %><% end %>

这是我正在加载一个名为cardSize的文件的cardSize函数.js

$(document).ready(function cardSize () {
  var cardWidth = $('.card-image').width();
  $('.card-image').css({
    'height': cardWidth + 'px'
  });
});

在 UJS 文件show.js.erb中,您需要调用控制视图/网格的全局函数。

例如,如果用于控制高度等的全局方法是 implement_grid() ,则文件应如下所示:

$('#results').html("<%= escape_javascript(render partial: 'songs/showcard', locals: { song: @song }) %>");
implement_grid();

动态添加到 DOM 的项不一定会触发任何操作,除非您指定它们。您可以查看将侦听器绑定到div/table(网格)上的 html 修改,如果您希望将该代码保留在 UJS 文件之外,这将调用您正在寻找的高度变化。

此外,该$('#results')可以大大缩短:

$('#results').html("<%= j render 'songs/showcard', song: @song %>");

您遇到的问题似乎与涡轮链接有关。Turbolinks将刷新/更改文档<body>标签中的内容,而不是文档<head>标签中的脚本和样式表,这是Rails加载所有自定义编写的javascript的地方。

那么,当您将javascript粘贴到文件底部的<script>标签中时,为什么它会起作用呢?因为当您这样做时,<script>标签现在位于文档的<body>标签内。因此,当您更改页面时,脚本会重新加载,并且可以将事件处理程序正确绑定到页面上的 DOM 元素。

那么为什么它只有在您完全重新加载页面时才有效呢?因为你的jquery被包装在$(document).ready(...)中。当您手动刷新整个页面时,turbolinks 也会完全刷新并重新加载回 DOM 中,因此当您在该特定页面上时,您的$(document).ready(...)处理程序将正确绑定。但是,当您更改页面并且内容更改时,文档在技术上仍已准备就绪,并且不会绑定到该新页面,因此它不会执行其内部的代码。为什么?由于 turbolinks 的工作原理,整个页面在技术上不会重新加载,只是 <body> 标记中的内容,对于$(document).ready(...)调用中的代码来说,这些内容看起来像是动态生成的内容,无法绑定到。

那么有什么解决办法呢?

这可能要求也可能不需要使用 jquery turbolinks gem。这将允许您保留涡轮链接,并在每次更改页面时进行$(document).ready(...)调用。

最新更新