Como detectar se o JavaScript está desativado?

659

Houve um post nesta manhã perguntando sobre quantas pessoas desabilitam o JavaScript. Então comecei a me perguntar que técnicas poderiam ser usadas para determinar se o usuário a desativou.

Alguém conhece algumas maneiras curtas / simples de detectar se o JavaScript está desativado? Minha intenção é alertar que o site não pode funcionar corretamente sem que o navegador tenha o JS ativado.

Eventualmente, eu gostaria de redirecioná-los para o conteúdo capaz de funcionar na ausência de JS, mas preciso dessa detecção como espaço reservado para iniciar.

MikeJ
fonte
O que você quer fazer com esta informação? Isso pode alterar a resposta que você recebe - por exemplo, o aprimoramento progressivo geralmente deve ser favorecido em vez de tentar detectar o JavaScript sendo desativado e tomar ações específicas com base nisso.
Jonny Buchanan
aprimoramento progressivo é o que estou procurando. Eu quero ot ser capaz de redirecioná-los para conteúdo alternativo que funcione corretamente na ausência de um navegador habilitado ou compatível com JS.
MikeJ 23/09/08
1
@expiredninja Este post de Nicholas Zakas diz cerca de 2%, embora tenha mais de um ano.
sdleihssirhc
A maneira mais fácil é usar o noscript para mostrar sites não javascript e usar o javascript para mostrar qualquer elemento dependente do javascript, modificando a exibição do estilo.
Myforwik

Respostas:

286

Presumo que você esteja tentando decidir se deve ou não entregar conteúdo aprimorado em JavaScript. As melhores implementações são degradadas de forma limpa, para que o site ainda funcione sem JavaScript. Suponho também que você queira dizer detecção no servidor , em vez de usar o <noscript>elemento por um motivo inexplicável.

Não há uma boa maneira de executar a detecção de JavaScript no servidor. Como alternativa, é possível definir um cookie usando JavaScript e testá-lo usando scripts do servidor nas visualizações de página subsequentes. No entanto, isso não seria adequado para decidir qual conteúdo entregar, pois não seria possível distinguir visitantes sem o cookie de novos visitantes ou visitantes que estão bloqueando os cookies.

ashleedawg
fonte
129
<noscript> É a maneira mais semanticamente precisa de especificar conteúdo não-javascript - e, em vez disso, detectar se o javascript está desativado, detectar se está ativado. Mostre a mensagem "você precisa de javascript para usar corretamente meu site" por padrão, mas oculte-a com a função javascript imediatamente em Load.
mate lohkamp
58
@matt lohkamp: Ou oculte a mensagem por padrão e coloque um <style>bloco dentro da <noscript>tela para mostrar (sem refluxo se o JS estiver ativado). Surpreendentemente, isso funciona em todos os navegadores modernos, e mesmo no IE6
Piskvor deixou o prédio
7
@matt - Eu estava fazendo isso por um tempo, mas a mensagem permanece ativa por um tempo em conexões lentas, deixando os usuários confusos. Estou aqui procurando uma solução diferente. @Piskvor - a tag <noscript> no cabeçalho não será validada, e uma tag <style> no corpo não será validada.
Ben
20
... exceto por que você está preocupado com a validação? Você está validando apenas para validar? Pode não estar "correto", mas se funcionar e conseguir "com um pouco de sujeira", qual é o problema? Não se preocupe, eu não vou julgar ;-) #
315 keif
4
Permanece válido se você apenas usar o atributo style para os elementos fornecidos nas tags <noscript> (como <noscript> <div style = "color: red;"> blahblah </div> </noscript> ou sg. Similar) . MAS também permanece válido se você colocar o <style> BLOCK normalmente no cabeçalho que define o estilo de alguns elementos classificados como .noscript (ou similar) e, no corpo, nas tags <noscript>, basta fornecer os elementos classe .noscript definida anteriormente, assim: <noscript> <div class = "noscript"> bláblá </div> </noscript>
Sk8erPeter
360

Eu gostaria de adicionar o meu .02 aqui. Não é 100% à prova de balas, mas acho que é bom o suficiente.

O problema, para mim, com o exemplo preferido de criação de algum tipo de mensagem "este site não funciona tão bem sem Javascript" é que você precisa garantir que seu site funcione corretamente sem Javascript. E depois que você começa a seguir esse caminho, começa a perceber que o site deve ser à prova de balas com o JS desativado, e isso é uma grande parte do trabalho adicional.

Então, o que você realmente quer é um "redirecionamento" para uma página que diz "ative JS, bobo". Mas, é claro, você não pode fazer meta redirecionamentos de maneira confiável. Então, aqui está a sugestão:

<noscript>
    <style type="text/css">
        .pagecontainer {display:none;}
    </style>
    <div class="noscriptmsg">
    You don't have javascript enabled.  Good luck with that.
    </div>
</noscript>

... onde todo o conteúdo do seu site é agrupado com uma div da classe "pagecontainer". O CSS dentro da tag noscript oculta todo o conteúdo da sua página e exibe a mensagem "sem JS" que você deseja mostrar. Na verdade, é isso que o Gmail parece fazer ... e se é bom o suficiente para o Google, é bom o suficiente para o meu pequeno site.

hairbo
fonte
12
@steve tenta validar google.com? A validação apenas determina o quão perto o documento segue a folha de especificações, de forma alguma afeta a usabilidade da página.
JKirchartz 23/02
71
@JonasGeiregat O que há de errado em forçar o usuário a exigir Javascript se o seu aplicativo da Web foi criado - e requer - Javascript para funcionar? Eu ouço esse comentário com muita frequência, mas é válido apenas para os sites mais simples. Experimente o Facebook sem JS e veja o que acontece. Se seu aplicativo foi criado para Javascript, o que há de errado em exigir o que 99% dos usuários ativaram?
Lee Benson
19
@ Lee bate na unha, você só pode fazer muito pelo usuário antes de traçar a linha do que você apoiará. Esperamos que todos os usuários tenham um dispositivo habilitado para Internet. Devo também implementar uma versão em papel do meu site para aqueles que se recusam a acessar a Internet?
Kolors
14
@Kolors, fiz esse comentário em março de 2012 e argumentaria que hoje é duplamente verdadeiro. Desde então, temos Meteor, Angular.Js, Famo.us e várias bibliotecas incríveis que exigem que o Javascript seja iniciado . Eu me pergunto o que os usuários que optam por desativar o JS realmente estão tentando alcançar ... claramente, eles não estão navegando na mesma Web que o resto de nós, e não há motivo para uma empresa precisar reduzir o tamanho do site para o mínimo possível. subconjunto de usuários teimosos ...
Lee Benson
6
Sim, e me perguntei por que não consegui votar novamente em sua resposta, pois esqueci de ativar meu JS :-)) Gosto e implemento sua solução! Obrigado!
Garavani
198

noscript Os blocos são executados quando o JavaScript está desativado e geralmente são usados ​​para exibir conteúdo alternativo ao gerado em JavaScript, por exemplo,

<script type="javascript">
    ... construction of ajaxy-link,  setting of "js-enabled" cookie flag, etc..
</script>
<noscript>
    <a href="next_page.php?nojs=1">Next Page</a>
</noscript>

Usuários sem js obterão o next_pagelink - você pode adicionar parâmetros aqui para saber na próxima página se eles vieram através de um link JS / não-JS ou tentar definir um cookie via JS, cuja ausência implica JS está desabilitado. Ambos os exemplos são bastante triviais e abertos à manipulação, mas você entendeu.

Se você quiser ter uma idéia puramente estatística de quantos usuários têm o javascript desativado, faça algo como:

<noscript>
    <img src="no_js.gif" alt="Javascript not enabled" />
</noscript>

em seguida, verifique seus logs de acesso para ver quantas vezes essa imagem foi atingida. Uma solução um pouco grosseira, mas fornecerá uma boa ideia em porcentagem para sua base de usuários.

A abordagem acima (rastreamento de imagem) não funcionará bem em navegadores somente texto ou naqueles que não suportam js; portanto, se sua base de usuários se direcionar principalmente para essa área, talvez essa não seja a melhor abordagem.

ConroyP
fonte
7
Isso não é muito eficaz. Por exemplo, não contará ninguém com navegadores somente de texto, que normalmente não têm suporte a JavaScript. No mínimo, você deve desativar o cache para essa imagem.
Jim Jim
3
Navegadores que não suportam JS não ignorariam a tag noscript e mostrariam a imagem?
LKM
1
@LKM: Depende de como eles são escritos, o mais provável que eles fariam, então você o tornaria um ponto 1x1px. Essa opção é principalmente para rastrear padrões de uso do lado do servidor, por isso ainda seria aceitável, pois é acionado por um usuário sem capacidade de javascript.
ConroyP
Note-se que há atualmente um bug com o IE8 eo tag noscript se você estilo-lo ... ver positioniseverything.net/explorer.html
alex
2
você também pode servir essa imagem como um script do lado do servidor, definindo o tipo MIME e usá-lo para registrar algumas informações sobre o usuário ou soltar um cookie ... px.sklar.com/code.html/id=256
JKirchartz
46

Isto é o que funcionou para mim: ele redireciona um visitante se o javascript estiver desativado

<noscript><meta http-equiv="refresh" content="0; url=whatyouwant.html" /></noscript>
Ernie13
fonte
6
Isto é inválido. os elementos noscript não podem conter meta-elementos. Eu não confiaria que isso funcione de maneira confiável em todos os navegadores (incluindo navegadores futuros nos quais você não pode testar atualmente), pois eles podem executar a recuperação de erros de maneiras diferentes.
Quentin
15
Isso pode ser inválido, mas veja o código do Facebook, ele usa a mesma solução na parte <head> - o que não significa que seja uma solução muito boa, porque o código do Facebook está longe de ser um código válido, mas pode significar que ele funciona no navegador de muitos usuários, o que pode ser um aspecto importante. Mas é verdade que isso não é realmente sugerido. Este é o código: <noscript> <meta http-equiv = atualizar conteúdo = "0; URL = / about / messages /? _ Fb_noscript = 1" /> </noscript>
Sk8erPeter
O IE9 (pelo menos) possui uma configuração "permitir META REFRESH". Eu não pareço muitos desligando, mas presumivelmente aqueles que não gostam de javascript, mas se você quiser 100%, não é isso.
Jenson-button-event
É válido em HTML5.
Naszta 24/08
1
Isso destrói o link ao tentar compartilhar no Linkedin, achamos o caminho mais difícil ... essa não é uma boa ideia. Desde linkedin segue a meta refresh, desconsiderando as tags Og, etc.
SomeDudeSomewhere
44

Se o seu caso de uso for um formulário (por exemplo, um formulário de login) e o script do lado do servidor precisar saber se o usuário tem o JavaScript ativado, você pode fazer algo assim:

<form onsubmit="this.js_enabled.value=1;return true;">
    <input type="hidden" name="js_enabled" value="0">
    <input type="submit" value="go">
</form>

Isso alterará o valor de js_enabled para 1 antes de enviar o formulário. Se o script do lado do servidor obtiver um 0, nenhum JS. Se receber 1, JS!

Andrew Hedges
fonte
44

Eu sugiro que você faça o contrário escrevendo JavaScript discreto.

Faça com que os recursos do seu projeto funcionem para usuários com o JavaScript desativado e, quando terminar, implemente os aprimoramentos da interface do usuário do JavaScript.

https://en.wikipedia.org/wiki/Unobtrusive_JavaScript

roosteronacid
fonte
145
A vida é muito curta. É 2012- Ative o javascript ou vá para casa
Yarin
25
"A vida é muito curta. É 2012 - ative o javascript ou vá para casa!" é uma pequena mensagem perfeita para exibir no caso de nenhum JS. logado apenas para lhe dizer que @Yarin
5
Eu também acabei de fazer login para dizer que é IMPRESSIONANTE! @Yarin. Estou criando um site pequeno que geralmente não é público (considere como uma intranet, mas para os amigos se reunirem para trabalhar em um projeto). Estou transformando-o em um SPA e não me incomodo em fazer um fallback. O JavaScript discreto quase dobraria a carga de trabalho que estou colocando no conceito de SPA. Com bibliotecas javascript modernas, como Knockout, Jquery, entre outras, apenas precisamos aceitar que nem todos os sites podem ser facilmente "discretos". Javascript é o futuro da web.
Lassombra
5
@Yarin Eu construo aplicativos PHP / JS para viver, nunca coloco fallbacks ... se não funcionar para alguém, eles me contatam e eu digo para que parem de viver no passado e habilitem o JS.
25416 Sam
2
@ n611x007 - Coisas antiéticas se escondem em todo o código, em todos os dispositivos, seja do lado do servidor ou do cliente. Não é culpa dos códigos, é culpa dos humanos. Encontro uma campanha contra o JS ironic porque você ainda usa um provedor de serviços de Internet de terceiros para se conectar à Internet, ainda usa um computador com hardware / firmware de terceiros, ainda usa redes celulares inseguras acessíveis por injeções de terceiros e ainda possui um telefone celular que usa um sistema operacional sem patches de terceiros, ainda use uma TV de tela plana que usa um serviço de atualização aberta de terceiros, etc. Você sempre é vítima de canais isentos de MITM, independentemente de desativar o JS no navegador.
precisa saber é o seguinte
35

<noscript>nem é necessário e, para não mencionar, não é suportado em XHTML .

Exemplo de trabalho :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html>
<head>
    <title>My website</title>
    <style>
      #site {
          display: none;
      }
    </style>
    <script src="http://code.jquery.com/jquery-latest.min.js "></script>
    <script>
      $(document).ready(function() {
          $("#noJS").hide();
          $("#site").show();
      });
    </script>
</head>
<body>
    <div id="noJS">Please enable JavaScript...</div>
    <div id="site">JavaScript dependent content here...</div>
</body>
</html>

Neste exemplo, se o JavaScript estiver ativado, você verá o site. Caso contrário, você verá a mensagem "Ative o JavaScript". A melhor maneira de testar se o JavaScript está ativado é simplesmente tentar usar o JavaScript! Se funcionar, está ativado, se não, então não é ...

de Raad
fonte
1
Ah, XHTML. Aqueles eram os dias ... As coisas mudaram muito: developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript
Stephan Weinhold
por que usar jquery ...
Luis Villavicencio
@StephanWeinhold, o JSF usa XHTML.
Arash
34

Use uma classe .no-js no corpo e crie estilos não javascript com base na classe pai .no-js. Se o javascript estiver desativado, você obterá todos os estilos que não são javascript, se houver suporte a JS, a classe .no-js será substituída, fornecendo todos os estilos, como de costume.

 document.body.className = document.body.className.replace("no-js","js");

truque usado no boilerplate HTML5 http://html5boilerplate.com/ através do modernizr, mas você pode usar uma linha de javascript para substituir as classes

tags noscript estão bem, mas por que ter coisas extras no seu html quando isso pode ser feito com css

Grundizer
fonte
5
Não posso acreditar que demorou tanto tempo para alguém mencionar a .nojsclasse! Essa é uma das abordagens mais fáceis e noscriptenvergonhadas.
Moses
15

um pouco difícil, mas (hairbo me deu a idéia)

CSS:

.pagecontainer {
  display: none;
}

JS:

function load() {
  document.getElementById('noscriptmsg').style.display = "none";
  document.getElementById('load').style.display = "block";
  /* rest of js*/
}

HTML:

<body onload="load();">

  <div class="pagecontainer" id="load">
    Page loading....
  </div>
  <div id="noscriptmsg">
    You don't have javascript enabled. Good luck with that.
  </div>

</body>

funcionaria em qualquer caso, certo? mesmo se a tag noscript não for suportada (apenas alguns CSS necessários), alguém conhece uma solução que não seja CSS?

emprestado
fonte
13

Você pode usar um snippet JS simples para definir o valor de um campo oculto. Quando postado de volta, você sabe se o JS foi ativado ou não.

Ou você pode tentar abrir uma janela pop-up que você fecha rapidamente (mas isso pode estar visível).

Além disso, você possui a tag NOSCRIPT que pode ser usada para mostrar texto para navegadores com o JS desativado.

rslite
fonte
Esta não é uma boa resposta. A primeira solução requer um recarregamento da página e um envio do formulário. A segunda solução abre um pop-up (ack!) E fecha-o "rapidamente" - do lado do cliente? -1
Ben
Às vezes, você precisa saber do lado do servidor se um site tem o JS ativado ou não, por isso não vejo como fazer isso além de postar algo de volta. Concordo que um pop-up é feio nad Não tenho muita certeza disso, mas deve ser possível abrir um pop-up fora da área visível da tela para que o usuário não seja incomodado por isso. Não é elegante, mas funciona e não há recarga de página.
rslite
Spambots também publica em um campo oculto.
Janis Veinbergs
13

Você vai querer dar uma olhada na tag noscript.

<script type="text/javascript">
...some javascript script to insert data...
</script>
<noscript>
   <p>Access the <a href="http://someplace.com/data">data.</a></p>
</noscript>
anon
fonte
12

A tag noscript funciona bem, mas exigirá que cada solicitação de página adicional continue servindo arquivos JS inúteis, pois essencialmente noscript é uma verificação do lado do cliente.

Você pode definir um cookie com JS, mas como outra pessoa apontou, isso pode falhar. Idealmente, você gostaria de poder detectar o lado do cliente JS e, sem usar cookies, defina um lado do servidor de sessões para o usuário que indica que o JS está ativado.

Uma possibilidade é adicionar dinamicamente uma imagem 1x1 usando JavaScript, em que o atributo src é na verdade um script do lado do servidor. Tudo o que esse script faz é salvar na sessão atual do usuário que o JS está ativado ($ _SESSION ['js_enabled']). Você pode enviar uma imagem em branco 1x1 de volta para o navegador. O script não será executado para usuários com o JS desativado e, portanto, o $ _SESSION ['js_enabled'] não será definido. Para outras páginas veiculadas a esse usuário, você pode decidir se deseja incluir todos os seus arquivos JS externos, mas sempre desejará incluir a verificação, pois alguns de seus usuários podem estar usando o complemento NoScript Firefox ou ter JS desativado temporariamente por algum outro motivo.

Você provavelmente incluirá essa verificação em algum lugar próximo ao final da sua página, para que a solicitação HTTP adicional não diminua a velocidade da renderização da sua página.

David Wees
fonte
12

Adicione isso à tag HEAD de cada página.

<noscript>
        <meta http-equiv="refresh" runat="server" id="mtaJSCheck" content="0;logon.aspx" />
</noscript>

Então você tem:

<head>
    <noscript>
        <meta http-equiv="refresh" runat="server" id="mtaJSCheck" content="0;logon.aspx" />
    </noscript>
</head>

Com agradecimentos a Jay.

the_seeker_who
fonte
12

Como sempre quero dar ao navegador algo que valha a pena olhar, costumo usar esse truque:

Primeiro, qualquer parte de uma página que precise de JavaScript para ser executada corretamente (incluindo elementos HTML passivos que são modificados por meio de chamadas getElementById etc.) é projetada para ser utilizável como está, com a suposição de que não há javaScript disponível. (projetado como se não estivesse lá)

Quaisquer elementos que exijam JavaScript, eu coloco dentro de uma tag algo como:

<span name="jsOnly" style="display: none;"></span>

Então, no início do meu documento, eu uso .onloadou document.readydentro de um loop de getElementsByName('jsOnly')para .style.display = "";ativar novamente os elementos dependentes de JS. Dessa forma, os navegadores que não são JS nem precisam ver as partes dependentes de JS do site e, se o tiverem, aparecerão imediatamente quando estiverem prontos.

Depois de se acostumar com esse método, é bastante fácil hibridizar seu código para lidar com ambas as situações, embora agora eu só esteja experimentando a noscripttag e espere que ela tenha algumas vantagens adicionais.

Brian
fonte
10

Este é o uso "mais limpo" do ID da solução:

<noscript>
    <style>
        body *{ /*hides all elements inside the body*/
            display: none;
        }
        h1{ /* even if this h1 is inside head tags it will be first hidden, so we have to display it again after all body elements are hidden*/
            display: block;
        }
    </style>
    <h1>JavaScript is not enabled, please check your browser settings.</h1>
</noscript>
Alpha2k
fonte
9

Uma solução comum é a metatag em conjunto com noscript para atualizar a página e notificar o servidor quando o JavaScript estiver desativado, desta forma:

<!DOCTYPE html>
<html lang="en">
    <head>
        <noscript>
            <meta http-equiv="refresh" content="0; /?javascript=false">
        </noscript>
        <meta charset="UTF-8"/>
        <title></title>
    </head>
</html>

No exemplo acima, quando o JavaScript estiver desativado, o navegador será redirecionado para a página inicial do site em 0 segundos. Além disso, também enviará o parâmetro javascript = false para o servidor.

Um script do lado do servidor, como node.js ou PHP, pode analisar o parâmetro e saber que o JavaScript está desativado. Em seguida, ele pode enviar uma versão especial não JavaScript do site para o cliente.

Umesh Patil
fonte
8

Se o javascript estiver desativado, o código do lado do cliente não será executado de qualquer maneira, portanto, suponho que você queira que essas informações estejam disponíveis no servidor. Nesse caso, noscript é menos útil. Em vez disso, eu teria uma entrada oculta e usaria o javascript para preencher um valor. Após sua próxima solicitação ou postagem, se o valor estiver lá, você sabe que o javascript está ativado.

Cuidado com coisas como noscript, em que a primeira solicitação pode mostrar o javascript desativado, mas solicitações futuras a ativam.

Joel Coehoorn
fonte
5

Você pode, por exemplo, usar algo como document.location = 'java_page.html' para redirecionar o navegador para uma nova página carregada de script. A falha no redirecionamento implica que o JavaScript não está disponível; nesse caso, você pode recorrer aos recursos CGI ou inserir o código apropriado entre as tags. (NOTA: NOSCRIPT está disponível apenas no Netscape Navigator 3.0 e superior.)

credit http://www.intranetjournal.com/faqs/jsfaq/how12.html

Brad8118
fonte
4

Uma técnica que usei no passado é usar o JavaScript para escrever um cookie de sessão que simplesmente atua como um sinalizador para dizer que o JavaScript está ativado. Em seguida, o código do servidor procura esse cookie e, se não for encontrado, executa as ações conforme apropriado. É claro que esta técnica depende de cookies serem ativados!

John Topley
fonte
4

Eu acho que você pode inserir uma tag de imagem em uma tag noscript e ver as estatísticas quantas vezes seu site e quantas vezes essa imagem foi carregada.

MrVolley
fonte
4

As pessoas já publicaram exemplos que são boas opções para detecção, mas com base no seu requisito de "avisar que o site não pode funcionar corretamente sem o navegador ter o JS ativado". Basicamente, você adiciona um elemento que aparece de alguma forma na página, por exemplo, os 'pop-ups' no estouro de pilha quando obtém um emblema, com uma mensagem apropriada, e o remove com algum Javascript que é executado assim que a página é carregada ( e quero dizer o DOM, não a página inteira).

roryf
fonte
3

Detectá-lo em quê? JavaScript? Isso seria impossível. Se você quiser apenas para fins de registro, poderá usar algum tipo de esquema de rastreamento, no qual cada página possui JavaScript que solicitará um recurso especial (provavelmente muito pequeno gifou semelhante). Dessa forma, você pode considerar a diferença entre solicitações de página exclusivas e solicitações para seu arquivo de rastreamento.

Hank Gay
fonte
3

Por que você não coloca um manipulador de eventos onClick () seqüestrado que será acionado apenas quando o JS estiver ativado e use isso para anexar um parâmetro (js = true) ao URL clicado / selecionado (você também poderá detectar uma lista suspensa e altere o valor de adicionar um campo de formulário oculto). Então agora, quando o servidor vê esse parâmetro (js = true), ele sabe que o JS está ativado e, em seguida, faça sua lógica lógica do lado do servidor.
A desvantagem disso é que, na primeira vez em que um usuário acessa seu site, marcador, URL, URL gerado pelo mecanismo de pesquisa, será necessário detectar que esse é um novo usuário, portanto, não procure o NVP anexado ao URL, e o servidor precisaria aguardar o próximo clique para determinar se o usuário está com JS ativado / desativado. Além disso, outra desvantagem é que o URL terminará no URL do navegador e, se esse usuário marcar como favorito, ele terá o NVP js = true, mesmo se o usuário não tiver o JS ativado, embora no próximo clique o servidor seja prudente saber se o usuário ainda tinha o JS ativado ou não. Suspiro .. isso é divertido ...

FirstSOURCE
fonte
3

Para forçar os usuários a habilitar o JavaScripts, defino o atributo 'href' de cada link para o mesmo documento, que notifica o usuário para habilitar o JavaScripts ou fazer o download do Firefox (se não souberem habilitar o JavaScripts). Eu armazenei o URL do link real no atributo 'name' dos links e defini um evento onclick global que lê o atributo 'name' e redireciona a página para lá.

Isso funciona bem para minha base de usuários, embora um pouco fascista;).

Jan Sahin
fonte
e um pouco chato se o usuário tem o JS ativado e clica no link antes que o seu javascript progressivo entre em
ação
1
Claro, mas nenhum problema foi relatado ainda.
Jan Sahin
3

Você não detecta se o usuário tem o javascript desativado (servidor ou cliente). Em vez disso, você assume que o javascript está desativado e cria sua página da Web com o javascript desativado. Isso evita a necessidade noscript, que você deve evitar usar de qualquer maneira, porque não funciona muito bem e é desnecessário.

Por exemplo, basta criar seu site para dizer <div id="nojs">This website doesn't work without JS</div>

Então, seu script simplesmente executará document.getElementById('nojs').style.display = 'none';e continuará seu negócio normal de JS.

Comprimidos de explosão
fonte
essa é uma ótima abordagem integrada As tags <noscript> são muito mais difíceis de manter em páginas diferentes. Com essa abordagem, você pode manter o estilo do noscript através do arquivo css.
Zadubz
3

Verifique se há cookies usando uma solução pura do lado do servidor que apresentei aqui , verifique se há javascript soltando um cookie usando Jquery.Cookie e depois verifique se há cookies dessa maneira. U verifique se há cookies e javascript

pouya
fonte
3

Em alguns casos, fazê-lo ao contrário pode ser suficiente. Adicione uma classe usando javascript:

// Jquery
$('body').addClass('js-enabled');

/* CSS */
.menu-mobile {display:none;}
body.js-enabled .menu-mobile {display:block;}

Isso pode criar problemas de manutenção em qualquer coisa complexa, mas é uma correção simples para algumas coisas. Em vez de tentar detectar quando não está carregado, apenas estilize de acordo com o momento em que está carregado.

Jennifer Michelle
fonte
3

Gostaria de adicionar minha solução para obter estatísticas confiáveis ​​sobre quantos usuários reais visitam meu site com o javascript desativado sobre o total de usuários. A verificação é feita apenas uma vez por sessão com os seguintes benefícios:

  • Usuários que visitam 100 páginas ou apenas 1 são contados 1 cada. Isso permite focar em usuários únicos, não em páginas.
  • Não interrompe o fluxo, a estrutura ou a semântica da página de qualquer maneira
  • Pode registrar o agente do usuário. Isso permite excluir bots das estatísticas, como o google bot e o bing bot, que geralmente têm o JS desativado! Também poderia registrar IP, hora, etc ...
  • Apenas uma verificação por sessão (sobrecarga mínima)

Meu código usa PHP, mysql e jquery com ajax, mas pode ser adaptado a outros idiomas:

Crie uma tabela no seu banco de dados como esta:

CREATE TABLE IF NOT EXISTS `log_JS` (
  `logJS_id` int(11) NOT NULL AUTO_INCREMENT,
  `data_ins` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `session_id` varchar(50) NOT NULL,
  `JS_ON` tinyint(1) NOT NULL DEFAULT '0',
  `agent` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`logJS_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

Adicione isso a todas as páginas depois de usar session_start () ou equivalente (é necessário o jquery):

<?  if (!isset($_SESSION["JSTest"]))
    { 
        mysql_query("INSERT INTO log_JS (session_id, agent) VALUES ('" . mysql_real_escape_string(session_id()) . "', '" . mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']). "')"); 
        $_SESSION["JSTest"] = 1; // One time per session
        ?>
        <script type="text/javascript">
            $(document).ready(function() { $.get('JSOK.php'); });
        </script>
        <?
    }
?>

Crie a página JSOK.php assim:

<?
include_once("[DB connection file].php");   
mysql_query("UPDATE log_JS SET JS_ON = 1 WHERE session_id = '" . mysql_real_escape_string(session_id()) . "'");
Ininterrupto
fonte
3

Eu descobri outra abordagem usando css e javascript em si.
Isso é apenas para começar a mexer com classes e IDs.

O trecho de CSS:
1. Crie uma regra de ID de CSS e chame-a de #jsDis.
2. Use a propriedade "content" para gerar um texto após o elemento BODY. (Você pode estilizar isso como desejar).
3 Crie uma segunda regra de ID de CSS e chame-a de #jsEn e estilize-a. (por uma questão de simplicidade, dei à minha regra #jsEn uma cor de plano de fundo diferente.

<style>
#jsDis:after {
    content:"Javascript is Disable. Please turn it ON!";
    font:bold 11px Verdana;
    color:#FF0000;
}

#jsEn {
    background-color:#dedede;
}

#jsEn:after {
    content:"Javascript is Enable. Well Done!";
    font:bold 11px Verdana;
    color:#333333;
}
</style>

O trecho de JavaScript:
1. Crie uma função.
2. Pegue o ID do CORPO com getElementById e atribua-o a uma variável.
3. Utilizando a função JS 'setAttribute', altere o valor do atributo ID do elemento BODY.

<script>
function jsOn() {
    var chgID = document.getElementById('jsDis');
    chgID.setAttribute('id', 'jsEn');
}
</script>

A parte HTML.
1. Nomeie o atributo do elemento BODY com o ID de #jsDis.
2. Adicione o evento onLoad com o nome da função. (jsOn ()).

<body id="jsDis" onLoad="jsOn()">

Por causa da tag BODY, foi fornecido o ID de #jsDis:
- Se o Javascript estiver ativado, ele mudará sozinho o atributo da tag BODY.
- Se o Javascript estiver desativado, ele mostrará o texto da regra 'content:' da CSS.

Você pode brincar com um contêiner #wrapper ou com qualquer DIV que use JS.

Espero que isso ajude a entender a idéia.

Chris Pesoa
fonte
2

Adicionar uma atualização no meta dentro do noscript não é uma boa ideia.

  1. Como a tag noscript não é compatível com XHTML

  2. O valor do atributo "Atualizar" não é padrão e não deve ser usado. "Atualizar" retira o controle de uma página do usuário. O uso de "Atualizar" causará uma falha nas Diretrizes de acessibilidade de conteúdo da Web do W3C --- Referência http://www.w3schools.com/TAGS/att_meta_http_equiv.asp .

Gaurav Talwar
fonte
Ninguém disse nada sobre XHTML. <noscript> é perfeitamente válido em HTML 4.01 estrito.
Tom
2
O noscript também é perfeitamente válido no XHTML 1.0 e no XHTML 1.1. Ele não pode conter meta-elementos e deve ser evitado em favor do aprimoramento progressivo, mas faz parte dos idiomas.
Quentin