Выполнить JavaScript до того, как // = требование происходит - PullRequest
0 голосов
/ 07 февраля 2012

Использование Rails 3.2.0 с haml, sass и coffeescript: в основном я пытаюсь отключить загрузку страниц jQuery_Mobile с помощью ajax без необходимости включать пакет javascript в любое из моих представлений.

Я пробовал это:

13 //= require jquery¬
14 //= require jquery_ujs¬
15 //= require_tree .¬
16 $(document).bind("mobileinit", function() {¬
17   $.mobile.ajaxEnabled = false;¬
18 });¬
19 //= require jquery_mobile¬

безуспешно, я не до конца понимаю цепочку событий, когда вызывается = javascript_include_tag "application"¬ и что означает // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD GO AFTER THE REQUIRES BELOW.¬?

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

Все, что вы поместите в файл манифеста application.js, будет выполнено в нижней части этого файла, как только все остальные обязательные директивы будут выполнены.

Вам нужно поместить этот код в файл javascript (назовите его jquery_mobile_startup.js) и поставить require 'jquery_mobile_startup.js' в верхней части файла.

Звездочки соблюдают порядок, в который вы помещаете вещи, и require_tree не будет повторно импортировать то, что вы уже импортировали.

Чтобы немного расширить это:

application.js читается как файл манифеста для того, какие файлы включать, и при запуске в рабочей среде Sprockets / Rails объединит все файлы, которые требуются в манифесте, в один большой уменьшенный файл JavaScript и предоставит его вашим пользователям. Только в разработке <%= javascript_include_tag 'application' %> создаст несколько тегов для вас.

Все требуемые вызовы будут генерировать тег, и весь обычный код Javascript останется в application.js, который импортируется после всех импортированных файлов (в разработке).

1 голос
/ 07 февраля 2012

Инструкция require обрабатывается на стороне сервера с помощью Sprockets (конвейер ресурсов).Coffeescript / Sprockets не будет выполнять никакой Javascript.Когда вы используете javascript_include_tag "application", конвейер загружает файл манифеста (application.js) и обрабатывает операторы require для обслуживания вашего Javascript.

В процессе разработки он добавляет несколько <script> разметок к вашему представлению.

Для производства rake assets:precompile позволяет попросить Sprockets скомпилировать файл application-hash.js (значение хеш-функции позволяет кэшировать / управлять версиями ваших активов) и добавить одну единственную разметку <script> в представление.

В любом случае, если вам нужно поместить код Javascript в манифест (плохая практика, ИМХО), вы должны добавить его после директив require.

Если вам нужно избежать загрузки ненужного Javascript, стратегия может бытьдля фильтрации включенных файлов в зависимости от браузера пользователя: создайте другой манифест JS и решите, какой использовать, в зависимости от заголовка HTTP_USER_AGENT.Упрощенный пример:

  # app/helpers/user_agent_helper.rb
  def iphone?
    request.env["HTTP_USER_AGENT"] && /iPhone/=~request.env["HTTP_USER_AGENT"]
  end

  # app/viewss/layouts/application.html.erb
  ...
  <head>
    <%= javascript_include_tag iphone? ? 'iphone' : 'application' %>
  </head>

  # app/assets/javascripts/iphone.js
  //= require jquery
  //= require jquery-mobile
  //= require your-iphone-specific-js
...