Pergunta

Como você verificaria se o JavaScript está ativado no Rails? Para que eu pudesse fazer algo assim nos pontos de vista:

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

Solução

Você pode detectá -lo, mas não é bonito.

Primeiro, você precisa de um novo controlador com uma ação que atualize um tempo limite na sessão:

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

Em seguida, você precisa incluir uma ação JavaScript em todas as suas páginas, para que essa ação do controlador seja chamada em cada página de carga. A maneira mais fácil é incluí-lo em um arquivo "javascript-fonfirm.js" incluído no seu layout (neste exemplo em particular, usei ajax.request do protótipo, então você também precisa incluí-lo em seus javascripts):

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

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

Isso invocará a ação Confirmar em todas as suas visualizações de página. Por fim, você deve controlar quanto tempo passou desde a sua última confirmação no controlador de aplicativos.

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

Agora você terá uma variável chamada @javascript_active em todos os seus controladores.

Deve funcionar mesmo quando o usuário ativa/desativar o JavaScript, com uma precisão de 10 segundos. Pode não funcionar se algumas de suas páginas levarem mais de 10 páginas para carregar (ou seja, com muitas imagens). Aumente o limite de tempo nesse caso (no ApplicationController e seu JavaScript)

Isenção de responsabilidade: eu não testei esse código, alguns bugs podem estar à espreita - mas deve apontar para você na direção certa.

Outras dicas

Se isso for tudo Você quer fazer, pode ser melhor colocar a versão não-JS na visualização:

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

E então peça ao JavaScript que substitua: (eu uso jQuery)

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

Essa abordagem deve ser utilizável para praticamente qualquer aprimoramento progressivo que você deseja adicionar.

Em vez de escrever muito código para verificar se o seu JavaScript está ativado ou não, você pode simplesmente escrever como (usando haml) no layout da sua página

%p.javascript_require
  No javascript, please enable JavaScript

e faça seu javascript ocultar este parágrafo usando hide () função como -

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

Faça qualquer função que você deseja desempenhar quando o JavaScript estiver desativado.

Isso não é possível durante a prestação da resposta. A única maneira de descobrir que menos ou mais confiável é permitir que o cliente envie uma solicitação Ajaxical com antecedência em uma das solicitações anteriores. Essa solicitação Ajaxical deve então definir algum token na sessão do lado do servidor que identifica que o cliente enviou uma solicitação Ajaxical com antecedência (que, portanto, prova que o cliente tem JS ativado). Mas isso não cobre a possibilidade de que o cliente possa desativar o JS enquanto isso durante uma sessão. Ou você deve incomodar com a coleta de registros de data e hora e solicitações Ajaxical após cada resposta. Não é realmente algo que você gostaria de fazer.

Em vez de renderizar o conteúdo e fazer uso de <noscript> e <script> tags para alternar um ou outro. Veja também minha resposta aqui para vários exemplos: oposto de <noscript>.

Você não pode detectá-lo no lado do servidor. De fato, o script pode ser desligado na primeira vez em que sua página é acessada, as configurações do navegador foram alteradas e reinvigadas sem que uma nova solicitação HTTP seja feita. Sem mencionar todos os tipos de problemas de cache e lugares onde os scripts podem estar tecnicamente 'ativados', mas não funcionando devido a conflitos, bugs ou ferramentas de 'segurança' atrapalhando.

Portanto, você precisa tomar todas as decisões sobre conteúdo para script/sem script no lado do cliente. Hoje em dia, o método preferido geralmente seria 'aprimoramento progressivo': inclua a versão básica de HTML na página e faça com que o JavaScript substitua/atualize -o onde pode:

<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>

Você pode fazer algo meio que hacky assim, mas o seu HTML "habilitado para JavaScript" precisaria ser gerado dentro do ajudante

Coloque isso em seu aplicativo_helper.rb

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

Isso acontece na sua opinião:

<%= javascript_enabled? %>

Você não pode verificar no lado do servidor se o JavaScript estiver ativado, no entanto, pode configurar uma página antes do site e redirecionar para o seu aplicativo com um parâmetro indicando se o JavaScript está ativado. Veja o código de amostra abaixo:

<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>

Portanto, se o JavaScript ativar o redirecionamento do OnLoad funcionará, se não, o meta -tag do cabeçalho funcionará. O truque é colocar 1-2 segundos atrasos no redirecionamento da meta-tag; portanto, se o redirecionamento do JavaScript não será redirecionado, o meta tag, indicando que nenhum JavaScript está ativado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top