Как определить, отключен ли JavaScript? - PullRequest
638 голосов
/ 23 сентября 2008

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

Кто-нибудь знает какие-то короткие / простые способы определения, отключен ли JavaScript? Я намерен предупредить, что сайт не может нормально работать, если в браузере не включен JS.

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

Ответы [ 36 ]

12 голосов
/ 01 апреля 2011

Добавьте это в тег HEAD на каждой странице.

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

Итак, у вас есть:

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

С благодарностью Джею.

12 голосов
/ 27 сентября 2008

Тег noscript работает хорошо, но для продолжения обслуживания бесполезных файлов JS потребуется каждый дополнительный запрос страницы, поскольку по сути noscript - это проверка на стороне клиента.

Вы можете установить cookie с помощью JS, но, как заметил кто-то другой, это может не сработать. В идеале вы хотели бы иметь возможность обнаруживать сторону клиента JS, и без использования файлов cookie установить сторону сервера сеанса для этого пользователя, которая указывает, что JS включен.

Существует возможность динамического добавления изображения 1x1 с использованием JavaScript, где атрибут src фактически является сценарием на стороне сервера. Все, что делает этот скрипт, сохраняет в текущем сеансе пользователя, что JS включен ($ _SESSION ['js_enabled']). Затем вы можете вывести пустое изображение 1x1 обратно в браузер. Сценарий не будет работать для пользователей, у которых отключен JS, и, следовательно, $ _SESSION ['js_enabled'] не будет установлен. Затем для дальнейших страниц, предоставляемых этому пользователю, вы можете решить, включать ли все ваши внешние файлы JS, но вы всегда захотите включить проверку, поскольку некоторые из ваших пользователей могут использовать дополнение NoScript Firefox или иметь JS временно отключен по какой-либо другой причине.

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

12 голосов
/ 09 декабря 2010

просто немного сложно, но (Hairbo дал мне идею)

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>

будет работать в любом случае, верно? даже если тег noscript не поддерживается (требуется только некоторая CSS) Кто-нибудь знает решение не CSS?

11 голосов
/ 16 июля 2010

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

Во-первых, любая часть страницы, которой требуется JavaScript для правильной работы (включая пассивные элементы HTML, которые модифицируются с помощью вызовов getElementById и т. Д.), Предназначена для использования «как есть», при условии, что не доступен javaScript. (задумано так, как будто его там не было)

Любые элементы, которые требуют JavaScript, я размещаю внутри тега что-то вроде:

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

Затем в начале моего документа я использую .onload или document.ready в цикле getElementsByName('jsOnly'), чтобы установить .style.display = ""; для включения зависимых от JS элементов. Таким образом, браузеры, не поддерживающие JS, никогда не должны видеть зависимые от JS части сайта, и, если они у них есть, они появляются сразу же, как только будут готовы.

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

9 голосов
/ 02 апреля 2015

Это самое чистое решение с использованием идентификатора:

<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>
9 голосов
/ 22 февраля 2013

Распространенным решением является использование метатега в сочетании с noscript для обновления страницы и уведомления сервера об отключении JavaScript, например:

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

В приведенном выше примере, когда JavaScript отключен, браузер будет перенаправлять на домашнюю страницу веб-сайта через 0 секунд. Кроме того, он также отправит параметр javascript = false на сервер.

Сценарий на стороне сервера, такой как node.js или PHP, может затем проанализировать параметр и узнать, что JavaScript отключен. Затем он может отправить клиенту специальную версию сайта, не поддерживающую JavaScript.

8 голосов
/ 23 сентября 2008

Если javascript отключен, ваш код на стороне клиента не будет работать в любом случае, поэтому я предполагаю, что вы хотите, чтобы эта информация была доступна на стороне сервера. В этом случае noscript менее полезен. Вместо этого я бы использовал скрытый ввод и использовал бы javascript для заполнения значения. После вашего следующего запроса или обратной передачи, если значение там, вы знаете, что JavaScript включен.

Будьте осторожны с такими вещами, как noscript, где первый запрос может показывать отключенный javascript, но будущие запросы включают его.

5 голосов
/ 23 сентября 2008

Например, вы можете использовать что-то вроде document.location = 'java_page.html', чтобы перенаправить браузер на новую страницу, загруженную сценариями. Неспособность перенаправить означает, что JavaScript недоступен, и в этом случае вы можете либо использовать CGI ro utines, либо вставить соответствующий код между тегами. (ПРИМЕЧАНИЕ. NOSCRIPT доступен только в Netscape Navigator 3.0 и выше.)

кредит http://www.intranetjournal.com/faqs/jsfaq/how12.html

4 голосов
/ 23 сентября 2008

Техника, которую я использовал в прошлом, состоит в том, чтобы использовать JavaScript, чтобы написать сессионный cookie, который просто действует как флаг, чтобы сказать, что JavaScript включен. Затем серверный код ищет этот файл cookie и, если он не найден, предпринимает соответствующие действия. Конечно, эта техника полагается на то, что куки включены!

4 голосов
/ 23 сентября 2008

Я думаю, что вы можете вставить тег изображения в тег noscript и посмотреть статистику, сколько раз ваш сайт и как часто это изображение загружалось.

...