Rails встроенный Javascript и лучшие практики - PullRequest
10 голосов
/ 13 февраля 2009

Я вроде новичок в использовании Rails, и приложение, над которым я работаю, успешно развивается - однако я просматриваю сгенерированный HTML и заметил такие вещи, как ...

<script type="text/javascript">
//<![CDATA[
Droppables.add(...);
//]]>
</script>

Посыпать вокруг HTML, который, конечно, совпадает с местами, где я использую:

<%= drop_receiving_element ... %>

Что мне интересно, так это ... есть ли лучший способ сделать это или сделать его чище? Некоторые из этих тегов сценариев взяты из частичных, поэтому размещение их в нижней части страницы не очень помогает в этой ситуации.

Другой вариант может заключаться в том, чтобы поместить все эти «блоки тегов» в массив, а затем записать их в файл application.rhtml , но он все еще немного запутан ...

Ответы [ 5 ]

9 голосов
/ 13 февраля 2009

Хорошо, если вы действительно хотите использовать лучшие практики ... Не используйте встроенный JavaScript. Сохраняйте HTML, CSS и Javascript чистыми и отделенными друг от друга. В идеале HTML-файл должен использоваться без CSS и JavaScript.

Самый простой способ, imo, - просто создать свое приложение, используя простой html / css, и дополнить его ненавязчивым javascript для повышения удобства работы пользователя.

Примером этого является включение всех ваших файлов JS внизу страницы и начало выполнения кода с такими функциями, как onDomReady.

Исходя из комментариев, я хотел бы добавить несколько возможных вариантов, чтобы вы начали:

  • 1010 * JQuery *
  • YUI
  • Прототип
4 голосов
/ 26 августа 2011

Лучшей практикой является удаление всего встроенного JavaScript. Тем не менее, есть 3 случая, когда вам абсолютно необходим встроенный JavaScript:

1. Для устранения ошибок изображения

Если тег изображения ссылается на несуществующий путь изображения, единственный способ предотвратить появление ошибки изображения (даже в веб-инспекторе) - это сделать:

<img src="/i/dont/exist.png" onerror="$(this).attr("src", "/i/do/exist.png")" />

Следующее не работает, потому что событие onerror выполняется еще до того, как вы успеете получить изображение с помощью jQuery:

$("img").error(function() {
  $(this).attr("src", "/i/do/exist.png")
});

Код ниже также не работает, потому что событие onerror не всплывает:

$("img").live("error", function() {
  $(this).attr("src", "/i/do/exist.png");
});

Так что для этого вы должны использовать встроенный JavaScript.

2. Чтобы отобразить шаблоны JavaScript при загрузке страницы

Если вы подождете до $(document).ready, чтобы нарисовать ваш фид контента в одном из пустых контейнерных элементов в вашем домике, пользователь увидит пустое место в течение доли секунды. Вот почему при первой загрузке страницы Twitter канал на мгновение становится пустым. Даже если вы просто поместите внешний скрипт-файл внизу dom, и там вы добавите динамически генерируемые html-элементы на вашу страницу, даже не используя $(document).ready, все равно будет слишком поздно. Вы должны добавить динамические узлы сразу после добавления элемента контейнера:

<script>App.bootstrap({some: "json"});</script>
<nav id='navigation'></nav>
<header id='header'></header>
<section id='content'>
  // dynamic content here
</section>
<script>App.renderContent();</script>
<aside id='sidebar'>
  // dynamically toggle which one is selected with javascript
  <nav>
    <h3>Search By Category</h3>
    <ol>
      <li>
        <a href="/category-a">Category A</a>
      </li>
      <li>
        <a href="/category-b">Category B</a>
      </li>
    </ol>
  </nav>
</aside>
<script>App.renderSidebar();</script>
<footer id='footer'></footer>

3. Вы загружаете свое приложение с помощью JSON

Если вы используете шаблоны JSON + javascript, рекомендуется загрузить первый набор данных в тело ответа, включив его в строку на странице (в приведенном выше примере с dom). Благодаря этому вам не требуется дополнительный ajax-запрос для рендеринга контента.

Все остальное должно быть сделано с ненавязчивым Javascript

В Rails много помощников по javascript, и, к счастью, в Rails 3 большинство (все?) Ненавязчиво; теперь они используют атрибут data- и внешний файл rails.js. Тем не менее, многие из драгоценных камней, которые являются part-ruby part-javascript, по-прежнему пишут вспомогательные методы и добавляют сложные встроенные javascript:

Это полезно, но я думаю, что просто иметь четкое README, описывающее, как добавить JavaScript в ваш application.js, еще более полезно. Внешний javascript значительно упрощает настройку / расширение функциональности в будущем, дает вам гораздо больший контроль над системой и минимизирует дублирование на ваших html-страницах (поэтому тело ответа меньше, а браузер может кэшировать внешние файлы JavaScript). Если вам не нужно обрабатывать отсутствующие изображения, мгновенный рендеринг или загружать какой-либо json, вы можете поместить все остальное во внешние файлы javascript и никогда не использовать помощники Rails javascript / ajax.

1 голос
/ 28 февраля 2013

Иногда встроенный JavaScript полезен для критических, быстрых просмотров (например, определенных целевых страниц) или небольших фрагментов (например, инициализация Facebook SDK, сценарии инициализации Analytics / Kissmetrics и т. Д.), Где использование внешних библиотек не может ускорить загрузку страницы. , В этих случаях я рекомендую использовать частичный _facebook.js.erb внутри макетов и определить помощника:

module ApplicationHelper
  def facebook_tag
    content_tag :script, render(partial: 'layouts/facebook.js')
  end
end

Затем создайте файл _facebook.js.erb и включите встроенный JavaScript внутри application.html.erb, используя определенный помощник:

<%= facebook_tag %>

Для любого другого случая, например для упомянутых вами частичных функций встроенного JavaScript, я рекомендую использовать ненавязчивый JavaScript, как предлагают другие ответы.

1 голос
/ 13 февраля 2009

Я бы также рекомендовал использовать ненавязчивый подход Javascript и использовать jQuery .

Для хорошего вводного урока о том, как сделать это с Rails, взгляните на этот jQuery + Rails скринкаст Райана Бейтса .

Если вы хотите продолжать использовать помощников с jQuery, взгляните на jRails , но если вы сделаете это, вы все равно нарушите ненавязчивую предпосылку Javascript.

1 голос
/ 13 февраля 2009

Это на какое-то время беспокоило меня, и в итоге я пришел к двойному подходу.

Если вы разрабатываете веб-приложение для закрытого домена, где производительность поисковой системы и javascript не являются проблемой, просто будьте прагматичны и позвольте помощникам Rails по javascript сделать свое дело.

Если вы разрабатываете для Интернета в целом, то делайте то, что предложил Том, и пишите код в формате html / css, а затем улучшайте onDomReady.

Если вы все еще хотите использовать помощники Rails, такие как button_to_remote, которые используют встроенный JavaScript, то кодируйте обработчик загрузки страницы, чтобы отправить запрос Ajax на сервер. затем вы можете использовать page.replace / page.replace_html для замены элементов вашей обычной страницы кодом, возвращаемым помощниками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...