Как Вы проверили бы, включен ли JavaScript в направляющих? Так, чтобы я мог сделать что-то вроде этого в представлениях:
<div>
<% if javascript_enabled? %>
<p>Javascript Enabled!</p>
<%- else -%>
<p>No Javascript</p>
<%- end -%>
</div>
Вы можете обнаружить это, но это не очень красиво.
Во-первых, вам нужен новый контроллер с действием, которое обновляет таймаут в сессии:
class JavascriptController < ApplicationController
def confirm
session[:javascript_updated] = Time.now
end
end
Далее вам нужно включить действие javascript во все ваши страницы, чтобы это действие контроллера вызывалось при каждой загрузке страницы. Самый простой способ - включить его в файл "javascript-confirm.js", включенный в ваш макет (в этом конкретном примере я использовал Ajax.Request от Prototype, поэтому вам нужно включить его и в ваши javascript):
function confirmJavascript()
{
// Assuming you are using Prototype
new Ajax.Request('/JavascriptController/confirm');
}
myTimeoutFunction();
setInterval(myTimeoutFunction, 10000); // invoke each 10 seconds
Это вызовет действие confirm во всех ваших просмотрах страницы. Наконец, вы должны контролировать, сколько времени прошло с момента последнего подтверждения в контроллере вашего приложения.
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)
Отказ от ответственности: я не тестировал этот код, в нем могут скрываться некоторые ошибки - но он должен указать вам правильное направление.
Это невозможно во время рендеринга ответа. Единственный способ выяснить это менее или более достоверно - позволить клиенту отправить ajaxical запрос заранее в одном из предыдущих запросов. Этот ajaxical запрос должен затем установить некоторый токен в сессии на стороне сервера, который идентифицирует, что клиент отправил ajaxical запрос заранее (что, таким образом, доказывает, что у клиента включен JS). Но это не покрывает возможность того, что клиент может отключить JS во время сессии. Или вам придется возиться со сбором временных меток и аяксических запросов после каждого ответа. Не совсем то, что вам хотелось бы делать.
Лучше отображать оба содержимого и использовать теги и
для переключения одного или другого. Также смотрите несколько примеров в моем ответе здесь: противоположность
.
Вы не можете обнаружить его на стороне сервера. В самом деле, сценарии могут быть отключены при первом доступе к вашей странице, затем настройки браузера изменяются и выполняется повторная навигация без выполнения нового HTTP-запроса. Не говоря уже о всевозможных проблемах с кешированием и местах, где сценарии могут быть технически «включены», но не работать из-за конфликтов, ошибок или инструментов «безопасности».
Таким образом, вам необходимо принимать все решения о содержании со сценарием / без сценария на стороне клиента. В наши дни предпочтительным методом, как правило, является «прогрессивное улучшение»: включить базовую версию 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>
Вы можете сделать что-то вроде этого, но ваш "javascript-enabled" html должен быть сгенерирован в хелпере
Поместите это в ваш application_helper.rb
def javascript_enabled?
content_tag(:div, [
content_tag(:script, 'document.write("Javascript Enabled")'),
content_tag(:noscript, 'No Javascript')
])
end
Это идет в вашем представлении:
<%= javascript_enabled? %>