如何在每次导航至视图时调用指定JavaScript函数?
解决导航到视图时触发JavaScript函数的问题
你的问题根源在于Turbo(或Turbolinks)的页面加载机制——这类工具会通过AJAX加载页面内容,不会重新执行页面内的<script>标签,只有刷新整个页面时脚本才会运行。要让函数在每次导航到该视图时都触发,有几种可靠的方式:
方法1:监听Turbo页面加载事件
如果你的项目用的是Rails 7+的Turbo,或是老版本的Turbolinks,可以监听对应的页面加载事件,把字符串截断逻辑封装成独立函数,在事件触发时调用:
<div class="featured__section__jobs"> <% @jobs.each do |job|%> <div class="job__card job__card__listing"> <h3 class="job__title"><%=link_to job.job_title, job_path(job)%></h3> <span class="company__name"><%=link_to job.company_name, job.user%></span> <p class="job__specifics__description"><%= job.job_description%></p> <div class="job__specifics"> <span class="job__specifics__span"><%= job.job_type %></span> <span class="job__specifics__span"><%= job.job_location %></span> <span class="job__specifics__span"><%= job.job_location %></span> </div> </div> <% end %> </div> <script> // 封装截断逻辑为独立函数 function truncateJobDescriptions() { const truncatedStrings = document.getElementsByClassName('job__specifics__description') for(let i = 0; i<truncatedStrings.length; i++) { const str = truncatedStrings[i].innerText const array = str.trim().split(' '); const ellipsis = array.length > 100 ? '...' : ''; truncatedStrings[i].innerText = array.slice(0, 100).join(' ') + ellipsis } } // 页面初始加载时执行 truncateJobDescriptions(); // 监听Turbo页面加载完成事件(Rails 7+适用) document.addEventListener('turbo:load', truncateJobDescriptions); // 若是老版本Turbolinks,替换为这个事件: // document.addEventListener('turbolinks:load', truncateJobDescriptions); </script>
方法2:用Rails的content_for注入脚本
把脚本放在content_for :javascript块中,确保每次视图渲染时都会注入并执行:
在你的视图文件中:
<div class="featured__section__jobs"> <!-- 原有HTML内容 --> </div> <% content_for :javascript do %> <script> function truncateJobDescriptions() { const truncatedStrings = document.getElementsByClassName('job__specifics__description') for(let i = 0; i<truncatedStrings.length; i++) { const str = truncatedStrings[i].innerText const array = str.trim().split(' '); const ellipsis = array.length > 100 ? '...' : ''; truncatedStrings[i].innerText = array.slice(0, 100).join(' ') + ellipsis } } truncateJobDescriptions(); </script> <% end %>
然后在布局文件(如application.html.erb)的</body>标签前添加:
<%= yield :javascript %>
方法3:直接在Ruby视图中处理截断(推荐)
完全可以在Ruby层面完成字符串截断,既避免前端脚本问题,还能提升性能:
<p class="job__specifics__description"><%= truncate(job.job_description, words: 100, separator: ' ', omission: '...') %></p>
Rails内置的truncate方法可直接按单词数截断文本,支持自定义分隔符和省略号,不管页面怎么加载,内容都是预处理好的,无需前端额外操作。
内容的提问来源于stack exchange,提问作者Obonyo
相关产品推荐
相关产品推荐

