Проверьте, включают ли JavaScript (Серверная сторона) с направляющими

Как Вы проверили бы, включен ли JavaScript в направляющих? Так, чтобы я мог сделать что-то вроде этого в представлениях:

<div>
    <% if javascript_enabled? %>
    <p>Javascript Enabled!</p>
    <%- else -%>
    <p>No Javascript</p>
    <%- end -%>
</div>
7
задан Lance Pollard 23 February 2010 в 01:54
поделиться

4 ответа

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

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

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)

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

6
ответ дан 6 December 2019 в 14:03
поделиться

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

Лучше отображать оба содержимого и использовать теги