2016-03-07 29 views
8

我想我的应用程序转换为异步JavaScript加载与后:如何加载页面的JavaScript我的清单文件的异步加载

<%= javascript_include_tag "application", async: true %> 

的问题是,任何特定页面的脚本正在jQuery的之前运行异步加载。我如何推迟这些,直到application.js清单文件已被加载。

我试图在$(window).load(function(){});包装我的页面js,但这没有帮助。我仍然看到了以下错误:

Uncaught ReferenceError: $ is not defined 

更新

这似乎是为我工作,但我想有人来确认它是正确的做法:

<%= javascript_include_tag "application", async: true, onload: 'pageScripts()' %> 

然后在网页脚本,如:

<script> 
    function pageScripts() { 
    // do something 
    } 
</script> 
+0

为什么不简单地写你的javascript在'window.onload'范围内? – jayant

回答

10

你方法是正确的但是我会建议限制你的异步仅用于生产,因为在开发中Sprockets还没有将所有文件串联起来。

<%= javascript_include_tag "application", async: Rails.env.production?, onload: 'pageScripts()' %> 
+1

谢谢,我会给你检查,因为你打扰了回应。顺便说一句,你可以在development.rb'config.assets.debug = false'中进行测试,这会强制清单文件处于dev模式,但通常最好做'async:Rails.env。按照你的建议生产?谢谢。 – Abram

+0

有什么区别:async => true和async:Rails.env.production? ? –

+1

@KickButtowski不同之处在于,当':async => true'时,它总是Async,但是当'async:Rails.env.production?'时它只会在生产时异步 – SsouLlesS