gpt4 book ai didi

javascript - rails 6 : execute a JS function after rendering partial

转载 作者:行者123 更新时间:2023-12-02 21:10:53 24 4
gpt4 key购买 nike

这里是 Rails 和 Javascript 初学者,

在一个培训项目中,我做了 flash使用 JQuery 几秒钟后消息就会消失。访问者会发送 AJAX 请求以将产品添加到购物车,然后会出现闪烁的部分“已添加到购物车”,并在几秒钟后自动淡出。

<小时/>
# application.html.erb

<div id='flash' class='flex-column'>
<%= render partial: 'shared/flash' %>
</div>
# shared/_flash.html.erb

<% flash.each do |key, value| %>
<%= display_flash(key, value) %>
<%= javascript_pack_tag 'custom/flash' %>
# this works, but injects the script each times the partial is rendered
<% end %>
# helpers/application_helper.rb

def display_flash(key, value)
def display_flash(key, value)
div_class = [flash_class(key), 'text-center fade show alert-dismissible'].join(' ')

content_tag(:div, class: div_class) do
content_tag(:p, value) +
button_tag(class: 'ml-auto close', 'data-dismiss': 'alert', type: 'button') do
content_tag(:span, '&times;'.html_safe, 'aria-hidden': 'true') +
content_tag(:span, 'Close', class: 'sr-only')
end
end
end
end
// app/javascript/packs/custom/flash.js

function closeFlash(){
let lastAlert = $('#flash .alert:last')

function fadeFlash() {
lastAlert.animate( {opacity: 0}, 2000, function() {
$(this).hide('slow', function() {
$(this).remove()
});
});
};

setTimeout(fadeFlash, 2000)
};

closeFlash();

这个问题是它用不必要的 <script> 污染了我的 DOM标签: unneeded script tags

这个问题可以解决,但是有没有一种合适的方法可以在渲染 (AJAX) 部分之后执行一个特定的 javascript 函数?就我而言,执行 closeFlash()位于packs/custom/flash.js每次渲染部分内容时。

感谢您的帮助和您的时间

<小时/> 编辑解决方案:

来自 Amit Patel 的回答和 this post

# app/views/shared/_flash.html.erb

<% flash.each do |key, value| %>
<%= display_flash(key, value) %>

<script>
$(function() {
closeFlash();
});
</script>

<% end %>
// app/javascript/packs/custom/flash.js

window.closeFlash = function() {
let lastAlert = $('#flash .alert:last')

function fadeFlash() {
lastAlert.animate( {opacity: 0}, 2000, function() {
$(this).hide('slow', function() {
$(this).remove()
});
});
};

setTimeout(fadeFlash, 2000)
};

它不会注入(inject)整个函数,而是(我相信)注入(inject)最少的 javascript 代码来调用它。

最佳答案

移动<%= javascript_pack_tag 'custom/flash' %>到您的布局或 application.js`,以便它可以在整个应用程序中使用。

修改您的模板,例如

application.html.erb

<div id='flash' class='flex-column'>
<%= render partial: 'shared/flash' %>
<script>
$(function(){
closeFlash();
});
</script>
</div>

关于javascript - rails 6 : execute a JS function after rendering partial,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61102565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com