Verifique se o JavaScript está ativado (servidor) com trilhos
-
22-09-2019 - |
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>
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.