Допустимый способ добавить noscript в голову для переноса перенаправления - PullRequest
21 голосов
/ 16 февраля 2010

Поэтому я подумал, что простой способ справиться с отключением JavaScript в браузере будет следующим:

<head>
        <title>JavaScript Test</title>
        <noscript>
                <meta http-equiv="Refresh"
                        content="1;url=nojs.html" />
        </noscript>
</head>

И у nojs.html есть что-то вроде:

<p>Return to <a href="jstest.html">test</a> after enabling javascrpt.</p> 

На странице сбоя.

Это не мой предпочтительный метод, но он приятен и прост до тех пор, пока не будет разработано что-то более изящное для пользователей без JavaScript.

Однако нельзя помещать элемент <noscript> в раздел head. Предварительные тесты работали в любом случае, конечно, но я суеверен, когда дело доходит до того, чтобы мой код был действительным, плюс я бы не хотел, чтобы это действительно провалило полевой тест.

Так есть ли правильный способ сделать это? Возможно, обернуть noscript в другой элемент, например, тег объекта? Или какой-то еще более простой способ, о котором я не думаю?

Ответы [ 6 ]

24 голосов
/ 16 февраля 2010

Я не уверен, почему вам нужно перенаправить на другую страницу вместо того, чтобы просто показывать сообщение. Я использую JS и немного CSS, чтобы справиться с этими ситуациями. Примерно так:

<head>
   ....
   <script type="text/javascript"> document.documentElement.className += " js"</script>

   <link rel="stylesheet" type='text/css' href="css/layout.css" media="all" />
</head>
<body>
    <div id="noscript">Please enable JavaScript, then refresh this page. JavaScript is required on this site</div>
    <div id="wrapper">
       ...
    </div>
</body>

Затем в layout.css:

 #wrapper      { display: none  } /* Hide if JS disabled */
 .js #wrapper  { display: block } /* Show if JS enabled */
 .js #noscript { display: none  } /* Hide if JS enabled */

Делая это таким образом, класс применяется к элементу html до отображения страницы, поэтому вы не получите мерцания, поскольку содержимое не-JS заменяется на JS содержание.

6 голосов
/ 03 июня 2011

Решение Дуга довольно хорошее, но у него есть несколько недостатков:

  • Недопустимо иметь атрибут класса в элементе html. Вместо этого используйте тело.
  • Требуется, чтобы вы знали, какой тип отображения установить для элемента (т. Е. ".js #wrapper { display: block }").

Более простое, более правильное и гибкое решение, использующее тот же подход:

<html>
    <head>
        <!-- put this in a separate stylesheet -->
        <style type="text/css">
            .jsOff .jsOnly{
                display:none;
            }
        </style>
    </head>

    <body class="jsOff">
        <script type="text/javascript">
            document.body.className = document.body.className.replace('jsOff ','');
        </script>

        <noscript><p>Please enable JavaScript and then refresh the page.</p></noscript>

        <p class="jsOnly">I am only shown if JS is enabled</p>
    </body>
</html>

При этом это действительный html (без атрибута class в html-элементе). Это проще (меньше CSS). Это гибкий. Просто добавьте класс "jsOnly" к любому элементу, который вы хотите отображать только при включенном JS.

4 голосов
/ 16 февраля 2010

Тег <noscript> не может быть в <head>, он должен быть в <body>

Обычной практикой является показ сообщения вместо перенаправления, поскольку перенаправить его невозможно, только если отключен JavaScript.

Вы можете сделать это наоборот, чтобы первая страница была nojs.html, и на этой странице используйте javascript для перенаправления на основной контент.

0 голосов
/ 13 октября 2011

А как же:

noscript{
z-index:100;
position:absolute;
top:0;
left:0;
width:100%;
height:100%;
min-height:1024px; background:#FFF;
}

И

<noscript>
<p>Please <a href="no_js_instructions.php">enable Javascript</a> on your browser.</p></noscript>
0 голосов
/ 16 февраля 2010

Мне нравится решение Дуга. Однако, если вам нужно перенаправить, я бы помнил, что хотя есть спецификация и стандарт, мир веб-браузеров - это грязный, несовершенный мир. Независимо от того, разрешено ли что-то в спецификации, не так важно, как то, работает ли оно в наборе браузеров, которые вас интересуют.

Просто посмотрите на исходный код любого крупного сайта ... Большинство из них не подтвердят, я бы поспорил:)

0 голосов
/ 16 февраля 2010

Если вы действительно хотите правильный способ сделать это, сделайте свою главную страницу страницей nojs.htm и используйте JS, чтобы скрыть весь контент, прежде чем он будет показан пользователю, и немедленно перенаправить на настоящую главную страницу, используя JavaScript.

...