72 votes

Ne devrions-nous pas utiliser l'élément <noscript> ?

J'ai trouvé de bons arguments contre :

  • L'élément noscript détecte uniquement si le navigateur a activé JavaScript ou non. Si JavaScript est désactivé dans le pare-feu plutôt que dans le navigateur, le JavaScript ne sera pas exécuté et le contenu de l'élément noscript ne sera pas affiché.

  • De nombreux scripts dépendent d'une ou plusieurs fonctionnalités spécifiques du langage pour pouvoir s'exécuter (par exemple document.getElementById). Lorsque les fonctionnalités requises ne sont pas prises en charge, le JavaScript ne peut pas être exécuté, mais comme le JavaScript lui-même est pris en charge, le contenu de noscript ne sera pas affiché.

  • L'endroit le plus utile pour utiliser l'élément noscript est l'en-tête de la page, où il peut déterminer de manière sélective les feuilles de style et les méta-éléments à appliquer à la page pendant son chargement, plutôt que d'avoir à attendre que la page soit chargée. Malheureusement, l'élément noscript n'est valable que dans le corps de la page et ne peut donc pas être utilisé dans l'en-tête.

  • L'élément noscript est un élément de niveau bloc et ne peut donc être utilisé que pour afficher des blocs entiers de contenu lorsque JavaScript est désactivé. Il ne peut pas être utilisé en ligne.

  • Idéalement, les pages web devraient utiliser HTML pour le contenu, CSS pour l'apparence et JavaScript pour le comportement. L'utilisation de l'élément noscript consiste à appliquer un comportement à partir du code HTML plutôt qu'à partir de JavaScript.

Source : http://javascript.about.com/od/reference/a/noscriptnomore.htm

Je suis tout à fait d'accord sur le dernier point. Existe-t-il un moyen de créer et d'ajouter un fichier externe <noscript> fichier ? Devrions-nous placer <noscript> en el <head> ?

6 votes

Existe-t-il encore des pare-feu qui désactivent javascript ? J'étais derrière un pare-feu il y a environ 13 ans, et c'était déjà terrible à l'époque. Je pense qu'une telle politique ne serait pas possible de nos jours, parce qu'environ un tiers du web ne serait plus utilisable

14 votes

<noscript> est autorisé dans l'en-tête selon la spécification la plus récente et, en pratique, il est pris en charge presque partout. developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript . De plus, la balise noscript peut être stylisée par CSS pour la rendre inline, tout comme n'importe quel élément de niveau bloc peut être stylisé pour changer son affichage en inline.

2 votes

La balise noscript peut très bien être utilisée dans l'en-tête de la page.

49voto

Tor Valamo Points 14209

Il est préférable que la valeur par défaut soit non-javascript, et qu'un code javascript soit écrasé par une page activée par javascript. Il n'est pas nécessaire d'en faire beaucoup. Il peut s'agir simplement d'un display:none; qui est alors fixé à display:block; par javascript, et vice versa pour la page non-js.

35 votes

A display:block "votre navigateur ne semble pas supporter JavaScript" qui est fixé à display:none par Javascript est une alternative viable à NOSCRIPT mais vous perdez l'information sémantique (les robots ne savent pas de quoi vous parlez).

0 votes

@Konerak c'est vrai, mais vous pourriez ajouter un meta-tag pour les robots, je suppose.

0 votes

@Konerak oui, mais ce que je veux dire, c'est que vous avez un tas de divs qui sont visibles avant que votre JS ne les supprime (pour les afficher plus tard à certains événements). Que le crawler les voit ou non n'a pas d'importance, car elles font partie du contenu, mais ne sont pas toujours visibles pour les utilisateurs de JS.

26voto

Question Overflow Points 2375

Après méditer pendant de nombreux jours et de changer mon code d'avant en arrière, je pense que j'ai une image plus claire maintenant et voudrais partager mes deux cents sur le sujet, avant que j'oublie.

<div id='noscript'>show non-js content</div>
<script>document.getElementById('noscript').style.display='none';</script>
<script id='required script'>show js content</script>

vs

<noscript>show non-js content</noscript>
<script id='required script'>//show js content</script>

Selon la situation, il y a trois cas à considérer:

Cas 1: Si le scénario est en ligne

Javascript est désactivé

  • Contenu en <noscript> balise apparaît immédiatement, non-js le contenu est illustré
  • Contenu en <div> balise apparaît immédiatement, non-js contenu est indiqué

Javascript activé

  • Contenu en <noscript> balise n'apparaît pas du tout, js contenu affiché
  • Contenu en <div> balise peut momentanément apparaissent avant d'être caché, js le contenu affiché

Pour ce cas, en utilisant <noscript> balise est avantageux.

Cas 2: Si le scénario est à partir externes (tiers) de la source, mais qui cache de <div> tag est fait avec de script en ligne

Javascript est désactivé

  • Contenu en <noscript> balise apparaît immédiatement, non-js le contenu est illustré
  • Contenu en <div> balise apparaît immédiatement, non-js contenu est indiqué

Javascript activé, mais le scénario est bloqué

  • Contenu en <noscript> balise n'apparaît pas du tout, rien ne s'affiche!
  • Contenu en <div> balise peut momentanément apparaissent avant d'être caché, rien n'est indiqué!

Le Javascript et le scénario est reçu

  • Contenu en <noscript> balise n'apparaît pas du tout, js contenu affiché
  • Contenu en <div> balise peut momentanément apparaissent avant d'être caché, js le contenu affiché

Pour ce cas, en utilisant <noscript> balise est avantageux.

Cas 3 - Si le scénario se cache l' <div> balise

Javascript est désactivé

  • Contenu en <noscript> balise apparaît immédiatement, non-js le contenu est illustré
  • Contenu en <div> balise apparaît immédiatement, non-js contenu est indiqué

Javascript activé, mais le scénario est bloqué

  • Contenu en <noscript> balise n'apparaît pas du tout, rien ne s'affiche!
  • Contenu en <div> balise apparaît, non-js contenu est indiqué

Le Javascript et le scénario est reçu

  • Contenu en <noscript> balise n'apparaît pas du tout, js contenu affiché
  • Contenu en <div> balise peut momentanément apparaissent avant d'être caché, js le contenu affiché

Pour ce cas, en utilisant <div> balise est avantageux.

En résumé

Utiliser <noscript> balise si le rendu du contenu HTML dépend de tiers javascripts ou si le script est en ligne. Sinon, utilisez <div> balise et assurez-vous que le script contient:

document.getElementById('noscript').style.display='none';

2 votes

Les éléments script en ligne ne semblent pas être appréciés par les responsables de la sécurité et les CSP. Apparemment, ils peuvent être utilisés pour des attaques par injection. Ils veulent que tous les script soient dans des fichiers séparés, sans trop savoir pourquoi.

8voto

Steve Hemsley Points 61

Bien que Tor Valamo apporte une réponse élégante à ce problème, il existe un problème qui peut vous inciter à ne pas utiliser cette technique.

Le problème vient (généralement) d'IE. Il a tendance à charger et à exécuter le JS un peu plus lentement que les autres navigateurs, ce qui fait parfois clignoter la div "Please Enable Your Javascript" pendant une fraction de seconde avant de charger le JS et de masquer la div.

C'est ennuyeux et pour contourner ce problème, vous pouvez mettre en œuvre la méthode "classique". <noscript> réorienter l'approche.

<head>
<noscript><meta http-equiv="refresh" content="0; URL=/NO_SCRIPT_URL/ROUTE_HERE"/></noscript>
</head>

Il s'agit de la technique la plus solide que j'ai rencontrée en ce qui concerne cette petite bête.

0 votes

Tant que vous redirigez vers une page qui offre la même fonctionnalité et les mêmes informations par d'autres moyens. Sinon, c'est vraiment, vraiment ennuyeux.

0 votes

Voir stackoverflow.com/questions/3221561/ pour savoir comment éviter le flash. (Utilise du javascript dans la balise head pour cacher la balise HTML, parce que cette balise existe AVANT que le corps ne soit lu. Elle est ensuite réaffichée lorsque le document est prêt).

0 votes

J'ai testé cela avec une extension chrome qui bloque JS et ne fonctionne pas (pas de redirection), la désactivation de JS dans les paramètres du navigateur fonctionne. Ce n'est pas la meilleure solution

7voto

Geordie Kaytes Points 31

Une application utile de noscript que j'ai vue est le chargement asynchrone progressivement amélioré d'un contenu lourd (en particulier "below the fold"). Les grandes images, les iframes, etc. peuvent être enveloppées dans noscript dans la source HTML, puis les éléments non enveloppés peuvent être ajoutés à la page à l'aide de JavaScript une fois que le DOM est prêt. Cela débloque la page et peut permettre un chargement initial beaucoup plus rapide, en particulier si votre interface repose sur des interactions JS/JQ appliquées après que le document est prêt (2 secondes contre 6 secondes pour une page de portfolio sur laquelle j'ai été consulté).

1voto

Je crée une div pleine hauteur, pleine largeur, position:fixed dans toutes les pages avec un certain id .

<div id='noscript_div' style='position:fixed;z-index:20000000;height:100%;width:100%;line-height:100%;'>enable JS buddy</div>
$('#noscript_div').hide();
$(document).ready(function(event){

});

Je ne suis pas un expert. Cela a fonctionné pour moi. Je suis désolé, mais ce cas ne conviendra que si vous voulez que l'utilisateur ait toujours son javascript activé.

0 votes

$('#noscript_div').hide() ; ne se déclenchera pas si jquery échoue d'une manière ou d'une autre

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X