Проверьте, включен ли Javascript (серверный) с помощью Rails - PullRequest
7 голосов
/ 23 февраля 2010

Как бы вы проверили, включен ли javascript в Rails? Чтобы я мог сделать что-то подобное во взглядах:

<div>
    <% if javascript_enabled? %>
    <p>Javascript Enabled!</p>
    <%- else -%>
    <p>No Javascript</p>
    <%- end -%>
</div>

Ответы [ 7 ]

6 голосов
/ 23 февраля 2010

Вы можете обнаружить это, но это не красиво.

Во-первых, вам нужен новый контроллер с действием, которое обновляет время ожидания в сеансе:

class JavascriptController < ApplicationController
  def confirm
    session[:javascript_updated] = Time.now
  end
end

Затем вам нужно включить действие javascript во все ваши страницы, чтобы это действие контроллера вызывалось при каждой загрузке страницы. Самый простой способ - включить его в файл «javascript-verify.js», включенный в ваш макет (в этом конкретном примере я использовал Ajax.Request Prototype, поэтому его также необходимо включить в javascripts):

function confirmJavascript()
{
    // Assuming you are using Prototype
    new Ajax.Request('/JavascriptController/confirm');
}

myTimeoutFunction();
setInterval(myTimeoutFunction, 10000); // invoke each 10 seconds

Это вызовет действие подтверждения во всех ваших просмотрах страницы. Наконец, вы должны контролировать, сколько времени прошло с момента вашего последнего подтверждения в контроллере приложения.

class ApplicationController < ActionController::Base

JAVASCRIPT_TIME_LIMIT = 10.seconds

before_filter :prepare_javascript_test

private
def prepare_javascript_test
  if (session[:javascript_updated].blank? or
     Time.now - session[:javascript_updated] > ApplicationController::JAVASCRIPT_TIME_LIMIT)
    @javascript_active = true
  else
    @javascript_active = false
  end
end

end

Теперь у вас будет переменная с именем @javascript_active во всех ваших контроллерах.

Он должен работать, даже когда пользователь активирует / деактивирует JavaScript с точностью до 10 секунд. Это может не работать, если загрузка некоторых из ваших страниц занимает более 10 страниц (то есть с большим количеством изображений). Увеличьте лимит времени в этом случае (на контроллере приложений и вашем javascript)

Отказ от ответственности: я не проверял этот код, некоторые ошибки могут быть скрыты - но это должно указать вам правильное направление.

5 голосов
/ 08 декабря 2011

Если вы хотите, чтобы это было all , лучше всего представить версию не-JS в виде:

<p class="replace_by_js">No Javascript</p>

и затем заменить Javascript следующим образом: (я использую jQuery)

$('p.replace_by_js').replaceWith("<p>Javascript Enabled!</p>")

Этот подход должен использоваться практически для любого прогрессивного улучшения, которое вы хотите добавить.

2 голосов
/ 20 июня 2013

Вместо написания большого количества кода, чтобы проверить, включен ли ваш JavaScript или нет, вы можете просто написать как (используя HAML) в макете вашей страницы -

%p.javascript_require
  No javascript, please enable JavaScript

и заставьте свой javascript скрывать этот абзац, используя функцию hide () как -

$(".javascript_require").hide();

Выполняйте любую функцию, которую хотите выполнять, если JavaScript отключен.

1 голос
/ 23 февраля 2010

Вы не можете обнаружить его на стороне сервера. Действительно, сценарии могут быть отключены при первом доступе к вашей странице, затем настройки браузера изменились и переместились без нового HTTP-запроса. Не говоря уже о всевозможных проблемах кэширования и местах, где сценарии могут быть технически «включены», но не работают из-за конфликтов, ошибок или «инструментов безопасности», мешающих работе.

Таким образом, вам необходимо принять все решения относительно содержимого для with-script / без-script на стороне клиента. В наши дни предпочтительным методом обычно является «прогрессивное улучшение»: включите базовую версию HTML на странице, а затем попросите JavaScript заменить / обновить ее, где это возможно:

<div id="isitjs">
    <p>Backup content for no JavaScript</p>
</div>
<script type="text/javascript">
    document.getElementById('isitjs').innerHTML= '<p>Sparkly script-enhanced content!<\/p>';
    // or DOM methods, as you prefer
</script>
1 голос
/ 23 февраля 2010

Это невозможно при отображении ответа. Единственный способ выяснить, что менее или более надежно, - позволить клиенту заранее отправить ajaxical запрос в одном из предыдущих запросов. Этот аяксический запрос должен затем установить некоторый токен в сеансе на стороне сервера, который идентифицирует, что клиент предварительно отправил аяксический запрос (что, таким образом, доказывает, что на клиенте включен JS). Но это не покрывает вероятность того, что клиент может отключить JS во время сеанса. Или вы должны хлопотать со сбором меток времени и несоответствующих запросов после каждого ответа. Не совсем то, что вы хотели бы сделать.

Вместо этого визуализируйте оба содержимого и используйте теги <noscript> и <script> для переключения одного или другого. Также см. Мой ответ здесь для нескольких примеров: напротив <noscript>.

0 голосов
/ 18 октября 2010

Вы не можете проверить со стороны сервера, включен ли Javascript, однако вы можете настроить страницу перед вашим сайтом и разрешить перенаправление в ваше приложение с параметром, указывающим, включен ли Javascript. Смотрите пример кода ниже:

<html>
<head>
    <meta HTTP-EQUIV="REFRESH" content="2; url=./Login.action?javascriptEnabled=false">
    <link rel="icon" href="favicon.ico" type="image/x-icon"/>
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"/>
    <title></title>
</head>
<body onload="window.location.href='./Login.action?javascriptEnabled=true'" ></body>
</html>

Итак, если Javascript включен, перенаправление onload будет работать, если нет, то будет работать метатег заголовка. Хитрость заключается в том, чтобы установить 1-2-секундную задержку для перенаправления метатега, поэтому, если перенаправление javascript не будет перенаправлено, метатег будет указывать, что JavaScript не включен.

0 голосов
/ 23 февраля 2010

Вы можете сделать что-то вроде хакерства, как это, но ваш html с поддержкой javascript должен быть сгенерирован в помощнике

Поместите это в ваш application_helper.rb

def javascript_enabled?
  content_tag(:div, [
    content_tag(:script, 'document.write("Javascript Enabled")'), 
    content_tag(:noscript, 'No Javascript')
  ])
end

Это идет по вашему мнению:

<%= javascript_enabled? %>
...