JavaScript 如何在不同的页面加载不同的 js 文件?

ripple · 2012年04月11日 · 最后由 dcitpx.com 回复于 2018年08月15日 · 4599 次阅读

比如某个 js 文件只在某个不常用的页面使用,放在 layouts 里面不是不管用不用都要加载它?

在 layout 的头部,增加

<html>
<head>
  ...
  <%= yield :head_block %>
</head>
<body>
  ...
</body>

然后在那个不常用的页面,用content_for来加载某个 js:

<% content_for :head_block do %>
  <%= javascript_include_tag 'some.js' %>
<% end %>

controllers/application_controller.rb

class ApplicationController < ActionController::Base
  def self.page_javascripts(*files)
    files.empty? ? @page_javascripts : @page_javascripts = files
  end

  def page_javascripts
    @page_javascripts || self.class.page_javascripts
  end
end

controllers/welcome_controller.rb

class WelcomeController < ApplicationController
  # for all actions
  page_javascripts 'welcome'

  def index
    # override for only this action
    @page_javascripts = ['welcome_index']
  end
end

views/layouts/application.html.erb

<head>
  ...
  <%= javascript_include_tag "application" %>
  <%= javascript_include_tag *controller.page_javascripts if controller.page_javascripts %>
  ...
</head>

#1 楼 @daqing 我也是这样

layout_helper.rb

def stylesheet(*args)
  content_for(:head) { stylesheet_link_tag(*args) }
end 

def javascript(*args)
  content_for(:head) { javascript_include_tag(*args) }
end


layouts/application.haml

= stylesheet_link_tag    "application"
= javascript_include_tag "application"
= yield :head

report/show.haml

- javascript "backbone_bundle", "highcharts", "custom_highchart"


嗯,学到很多方法,多谢大家

#2 楼 @doitian 代码块里面的 @不能 escape,变成链接了

正好想问

#4 楼 @yakjuly 我试了下,你这个方法是好用的,但是我必须要将 application.js 中的 require_tree 去掉

@naitnix require_tree 就是加载全部 js。 看你的需求定了。 如果你不想把个别比较大的 js 放在全局里,那就 在页面中 用我写的 javascript 方法,并且在 config.assets.precompile 要加上该文件名。

如果你的 js 没有命名冲突也比较小 就在 application.js 中 require 就行。

#9 楼 @yakjuly thanks very much 我看了这篇文章http://gogojimmy.net/2012/07/03/understand-assets-pipline/,再加上你的方法会更灵活一些

想要更加快速学到更多技术,有人教有人带项目,麻烦考虑大聪 IT,很多年轻人的选择,非常可靠,了解更多请戳网籽

naitnix bootstrap $ is not defined 发现问题所在 提及了此话题。 04月03日 10:56
需要 登录 后方可回复, 如果你还没有账号请 注册新账号