Javascript和Ajax调用

Javascript和Ajax调用,javascript,jquery,html,ruby-on-rails,ajax,Javascript,Jquery,Html,Ruby On Rails,Ajax,关于在ajax调用后加载javascript,我有几个问题 所以我使用RubyonRails,通过ajax调用加载了不同的页面(我这样做是因为我有一个音频播放器,我想在页面重新加载时继续播放) 问题是,当我使用ajax更改页面时,javascript无法在新页面上重新加载(或工作) 例如,我有一个网格系统,它使用javascript根据宽度设置网格图像的高度。除非我重新加载页面或将脚本放入html文件底部的脚本标记中,否则脚本无法工作 有没有办法重新加载javascript?我尝试过locati

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

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

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

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

有没有办法重新加载javascript?我尝试过location.reload(),但这只会刷新页面,无法达到全部目的。谢谢大家!

以下是一个例子:

show.js.erb

$('#results').html("<%= escape_javascript(render partial: 'songs/showcard', locals: { song: @song }) %>");
链接到显示页面

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

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

例如,如果控制高度等的全局方法是
implement\u grid()
,则该文件应如下所示:

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

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

例如,如果控制高度等的全局方法是
implement\u grid()
,则该文件应如下所示:

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

您遇到的问题似乎与TurboLink有关。TurboLink将刷新/更改文档的
标记内的内容,而不是文档的
标记内的脚本和样式表,Rails将在其中加载所有自定义编写的javascript

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

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

那么解决办法是什么


这可能需要也可能不需要使用。这将允许您保留TurboLink并在每次更改页面时调用您的
$(文档)。ready(…)

您遇到的问题似乎与TurboLink有关。TurboLink将刷新/更改文档的
标记内的内容,而不是文档的
标记内的脚本和样式表,Rails将在其中加载所有自定义编写的javascript

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

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

那么解决办法是什么


这可能需要也可能不需要使用。这将允许您保留TurboLink并在每次更改页面时调用您的
$(文档).ready(…)

Awesome d_\ethier。我应该想到这一点。谢谢你指出这一点!谢谢你的简短代码。我的文件现在看起来干净多了!太棒了。我应该想到这一点。谢谢你指出这一点!谢谢你的简短代码。我的文件现在看起来干净多了!
$('#results').html("<%= escape_javascript(render partial: 'songs/showcard', locals: { song: @song }) %>");
implement_grid();
$('#results').html("<%= j render 'songs/showcard', song: @song %>");