Highlight.js 和 Rails,页面需要刷新 - 又是 turbolinks?

Rad*_*ino 1 javascript jquery ruby-on-rails

我的问题很简单:

应用程序.js

//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require ckeditor-jquery
//= require_tree ./code
//= require turbolinks


hljs.initHighlightingOnLoad();
Run Code Online (Sandbox Code Playgroud)

index.html.erb

<div class="ui items" data-no-turbolink>
  <% @posts.each do |post| %>
    <div class="index_post" data-no-turbolink>
      <%= link_to post.title, post, class: 'ui large header' %>
      <div class="date_created">
        <%= post.created_at.strftime("%B %d, %Y") %>
      </div>
      <div class="content">
        <%= simple_format(post.body) %>
      </div>
    </div>
<% end %>
</div>
Run Code Online (Sandbox Code Playgroud)

Highlight.js 和 default.css.scss 位于资产文件夹中的位置,如果我刷新页面,一切都会成功。我试图注释掉 application.js 中的 turbolinks 行,一切正常。如何通过保持 turbolinks 使其工作?

这是我几乎在我创建的每个项目中都会遇到的问题。一个解决方案可能是data-no-turbolink在链接的标签中包含我有问题的视图,但它是一个不依赖于单个链接的主页(和其他页面)。最后,我更喜欢最佳解决方案而不是 hack。

ngr*_*fin 6

这也让我感到惊讶,但是您需要考虑 highlightJS 认为除了绕过 document.ready 事件的 TurboLinks 之外,它已经被调用。@rsb 的代码仅考虑绕过 document.ready 事件触发器的 Turbolinks。所以你需要hljs.initHighlighting.called = false在 RSB 的回答中:

ready = function() {
  hljs.initHighlighting.called = false;
  hljs.initHighlighting();
}
Run Code Online (Sandbox Code Playgroud)

注意:我将调用更改为initHighlighting()而不是initHighlightingOnLoad().