Rails Rails Turbolinks 如何解析 body 里面的外部 javascript 和 stylesheet

tiseheaini · 2014年08月17日 · 最后由 tiseheaini 回复于 2014年08月17日 · 3267 次阅读
= javascript_include_tag "simditor-all.min"
= stylesheet_link_tag    "simditor"

= form_for @topic.comments.new, url: topic_comments_path(@topic) do |f|
  = f.text_area :body, tabIndex: 3
  = f.submit t('.add_this_comment')

javascript:
  $(document).on('ready page:load', function(){
    editor = new Simditor({
      textarea: $('#comment_body')
    });
  });

这是 app/views/topics/_textarea.slim 的简略代码,使用了 Turbolinks。 当我从 topics#index 页面点击链接后,跳到 topics#show 页面,会渲染 :partial => 'textarea' , 它会提示我 Simditor is not defined,说明 javascript_include_tag "simditor-all.min" 没有被解析,问题出在 Turbolinks 上,如何让 javascript_include_tag "simditor-all.min" 能够正常解析,求解答。

PS:我尝试在 chrome 的 console 里执行 Simditor ,可以得到 Simditor 对象。明明正常解析了,为什么在代码里会没办法执行呢 @rei

我觉得是你的 reday 事件,触发了 Turbolinks 的 fresh fetch.你先试试$(document).on('page:load')。另外你确定一下页面的结果是没被解析,还是没有在被需要的的时机被解析

#1 楼 @ane 是没有在需要的时机被解析,在 $(document).on('page:load') 事件完成时执行 Simditor 提示的是 Simditor 对象找不到,当在页面加载完后,在 chrome 的 console 里面可以正确找到对象,就是在 page:load 事件完成时,= javascript_include_tag "simditor-all.min" 这个外部的 js 文件还没解析完。 现在不知道用什么方法解决这个问题。

把 simditor 的 js 和 css 编译到 application,然后在那个位置的 js:

javascript:
  new Simditor({
    textarea: $('#comment_body')
  });

Basecamp 是打包到一起的。

#2 楼 @tiseheaini 没错啊,就是 load 完成才触发 Turbolinks。给你两个方案。第一把你的写到独立的文件中,引入。第二。将 Simditor 的实例化定义到 function 中。.on('ready page:load', 方法名)。这个和直接写回调有个时间 js 的预解析的问题

#3 楼 @Rei 谢谢,不想把 100kb 的内容打包起来,所以才会写这么奇怪的代码,依然谢谢大神的回复,貌似 ruby-china 的提醒功能出问题了,一直没有回复提醒。 #4 楼 @ane 我尝试一下第二种方法

javascript:
  $(document).on('ready page:load', function(){
    // Simditor
    $.getScript("#{asset_path('simditor-all.min')}", function(){
      window.editor = new Simditor({
        textarea: $('#comment_body')
      });
    });
  });

找不到比较好的方法了,在 stackoverflow 上找到一篇帖子,使用 $.getScript 方法,当 js 加载完后再初始化富文本编辑器。 这个方法有点误导了,刚刚试了一下,编辑器初始化的延迟很大,还是使用 rei 的方法,将文件编译到 application 文件里比较好。 #4 楼 @ane #3 楼 @Rei 谢谢两位大神解答

需要 登录 后方可回复, 如果你还没有账号请 注册新账号