Rails Rails Asset Pipeline js 无效的问题

eva · 2013年08月06日 · 最后由 hhuai 回复于 2013年08月06日 · 4421 次阅读

开发环境:rails4 我写了一个简单的登陆页面,如下: 我希望每次进入这个页面时,能把焦点聚在 email 输入框里,于是 sessions.js:

$(document).ready(function(){
    $("#session_email").focus();
});

application.html.erb:

<%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag params[:controller] %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= javascript_include_tag params[:controller] %>
<%= csrf_meta_tags %>

application.js:

//
//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require turbolinks

最终生成的登陆页面也包含了 sessions.js 问题是,只有当我在浏览器的 url 里输入 localhost:3000/signin (sessions#new) 时 js 才生效,焦点才会聚焦在 emaill 输入框里,看 log 也会去 started get assets/sessions.js,但如果我通过菜单栏里的链接链过去(<a href="/signin">登陆</a>),则 js 无效,看 log 里也没有去 get js 文件。为什么呢?

因为第一次没有 binding 到 DOM 上面。

Turbolinks 不会再次获取 Header 上的 Javascript 执行。引用 jquery.turbolinks 解决一下。

目测是turbolinks的问题,建议去读@Rei关于 turbolinks 的文章

jQuery 需要加 jquery.turbolinks 补丁。

另外输入框聚焦需求,可以用 html 的 autofocus 属性。 http://www.w3schools.com/tags/att_input_autofocus.asp

#1 楼 @Saito #2 楼 @cantin #3 楼 @Rei 非常感谢,加了 jquery.turbolinks 后,在登陆页面点击登陆,页面正常,但如果从 post 页面点击登陆跳到 signin 页面,head 里还是只包含了 posts.css,posts.js,而没有包含 sessions.js 和 sessions.css.为什么呢?

#4 楼 @eva Turbolinks 的工作原理就是无视 head 的变化,把所有 js 打包成一个,或者关闭 Turbolinks。

#5 楼 @Rei 恩,刚看了你的这篇文章http://blog.chloerei.com/articles/48-turbolinks-guide,写的很赞啊~

到底有没有必要升 4,我看真没啥实在的亮点。

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