You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在每次导航至视图时调用指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:39:40