Сегодня утром был пост с вопросом о том, сколько людей отключают JavaScript. Затем я начал задаваться вопросом, какие методы можно использовать, чтобы определить, отключил ли его пользователь.
Кто-нибудь знает какие-то короткие / простые способы определить, отключен ли JavaScript? Я намерен предупредить о том, что сайт не может работать должным образом, если в браузере не включен JS.
В конце концов я хотел бы перенаправить их на контент, который может работать без JS, но мне нужно это обнаружение в качестве заполнителя для запуска.
прогрессивное улучшение - вот что я ищу. Я не хочу, чтобы они могли перенаправлять их на альтернативный контент, который будет работать должным образом при отсутствии JS-браузера или поддерживающего его браузера.
@expiredninja Сообщение от Николаса Закаса говорит о 2%, хотя ему больше года.
Самый простой способ - использовать noscript для отображения сайта, отличного от javascript, и использовать javascript для отображения любых элементов, зависящих от javascript, путем изменения стиля отображения.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать простой фрагмент JS, чтобы установить значение скрытого поля. При ответе вы знаете, включен ли JS или нет.
Или вы можете попробовать открыть всплывающее окно, которое вы быстро закрываете (но оно может быть видимым).
Также у вас есть тег NOSCRIPT, который вы можете использовать для отображения текста в браузерах с отключенным JS.
Это плохой ответ. Первое решение требует перезагрузки страницы и отправки формы. Второе решение открывает всплывающее окно (ack!) И закрывает его «быстро» - со стороны клиента? -1
Иногда вам нужно знать сторону сервера, включен ли на сайте JS или нет, поэтому я не понимаю, как вы можете это сделать, кроме как отправить что-то обратно. Согласитесь, что всплывающее окно некрасиво, и я не совсем уверен в этом, но должно быть возможно открыть всплывающее окно за пределами видимой области экрана, чтобы это не беспокоило пользователя. Не элегантно, но работает, и перезагрузки страницы нет.
Спам-боты также размещают сообщения в скрытом поле.
Блоки noscript выполняются, когда JavaScript отключен, и обычно используются для отображения контента, альтернативного тому, который вы создали в JavaScript, например
<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>
Пользователи без js получат ссылку next_page - вы можете добавить здесь параметры, чтобы на следующей странице знать, пришли ли они через ссылку JS / не-JS или попытаются установить cookie через JS, отсутствие которых подразумевает JS отключен. Оба этих примера довольно тривиальны и открыты для манипуляций, но идею вы уловили.
Если вы хотите получить чисто статистическое представление о том, у скольких ваших пользователей отключен javascript, вы можете сделать что-то вроде:
<noscript>
<img src = "no_js.gif" alt = "Javascript not enabled" />
</noscript>
затем проверьте свои журналы доступа, чтобы узнать, сколько раз было просмотрено это изображение. Немного грубое решение, но оно даст вам хорошее представление о процентной доле вашей пользовательской базы.
Вышеупомянутый подход (отслеживание изображений) не будет работать для текстовых браузеров или браузеров, которые вообще не поддерживают js, поэтому, если ваша пользовательская база перемещается в первую очередь в эту область, это может быть не лучшим подходом.
Это не очень эффективно. Например, он не будет считать никого с текстовыми браузерами, которые обычно не поддерживают JavaScript. По крайней мере, вы должны отключить кеширование для этого изображения.
Будет ли браузер, который вообще не поддерживает JS, просто игнорировать тег noscript и показывать изображение?
@LKM: Скорее всего, так и будет, в зависимости от того, как они написаны, поэтому сделайте это точкой 1x1px. Этот параметр в основном предназначен для отслеживания шаблонов использования на стороне сервера, поэтому все равно будет в порядке, поскольку он запускается пользователем без возможности javascript.
Обратите внимание, что в настоящее время есть ошибка с IE8 и тегом noscript, если вы его стилизуете ... см. Positioniseverything.net/explorer.html
также вы можете использовать это изображение в качестве сценария на стороне сервера, установив тип mime и использовать его для регистрации некоторой информации о пользователе или удаления файла cookie ... px.sklar.com/code.html/id=256
блестящий. так просто! пинал себя за то, что не знал этого раньше. Однако я просто хотел, чтобы пользователь знал, что для правильной работы сайту потребуется javascript, поэтому простой тег <p> внутри <noscript> помог мне.
Обнаружить это в чем? JavaScript? Это было бы невозможно. Если вы просто хотите, чтобы это было для целей ведения журнала, вы можете использовать какую-то схему отслеживания, где на каждой странице есть JavaScript, который будет запрашивать специальный ресурс (возможно, очень маленький gif или аналогичный). Таким образом, вы можете просто различать запросы уникальных страниц и запросы файла отслеживания.
Вы захотите взглянуть на тег 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>
Если javascript отключен, ваш клиентский код все равно не будет работать, поэтому я предполагаю, что вы имеете в виду, что хотите, чтобы эта информация была доступна на стороне сервера. В этом случае Носкрипт менее полезен. Вместо этого я бы использовал скрытый ввод и использовал javascript для заполнения значения. После вашего следующего запроса или обратной передачи, если значение есть, вы знаете, что javascript включен.
Будьте осторожны с такими вещами, как noscript, где первый запрос может показать, что javascript отключен, но будущие запросы включают его.
Раньше я использовал методику JavaScript для записи файла cookie сеанса, который просто действует как флаг, указывающий, что JavaScript включен. Затем код на стороне сервера ищет этот файл cookie и, если он не найден, принимает соответствующие меры. Конечно, этот метод зависит от включения файлов cookie!
Я бы посоветовал вам пойти другим путем, написав ненавязчивый JavaScript.
Сделайте так, чтобы функции вашего проекта работали для пользователей с отключенным JavaScript, а когда вы закончите, внедрите свои улучшения пользовательского интерфейса JavaScript.
https://en.wikipedia.org/wiki/Unobtrusive_JavaScript
Я пишу веб-приложение, которое отображает список из нескольких тысяч элементов, каждый из которых имеет несколько статусов. Учитывая, насколько плохо <form>, вероятно, будет идти с этим, ваше предложение не всегда приемлемо.
Жизнь слишком коротка. Это 2012 год. Включите JavaScript или идите домой.
«Жизнь слишком коротка. Это 2012 год - включите JavaScript или идите домой!» идеальное небольшое сообщение для отображения в случае отсутствия JS. вошел в систему, чтобы сказать вам, что @Yarin
Я также только что вошел в систему, чтобы сказать, что это УДИВИТЕЛЬНО! @ Ярин. Я делаю небольшой сайт, который не будет общедоступным (считайте, что это интранет, но для друзей, которые собираются вместе для работы над проектом). Я делаю это СПА и не пытаюсь использовать запасной вариант. Ненавязчивый JavaScript почти удвоил бы рабочую нагрузку, которую я вкладываю в концепцию SPA. С современными библиотеками javascript, такими как Knockout, Jquery и другими, мы просто должны признать, что не каждый сайт можно легко сделать «ненавязчивым». Javascript - это будущее Интернета.
Что, если JavaScript - это особенность страницы? У меня есть пара страниц, на которых для анимации пользовательской интерактивной графики используется javascipt: без javascript, без контента.
@Yarin, используя javascript, где это можно было бы сделать без него, увеличивает сложность js, и, к сожалению, именно здесь все неэтичные вещи пытаются скрыть. Использование javascript только в том случае, если нет другого пути, может быть более сложным и более этичным путем. Возможно, это вас волнует, а может и нет, но в любом случае вы можете оставить абсолютно верный ответ сам по себе.
@Yarin Я создаю приложения PHP / JS, чтобы зарабатывать себе на жизнь, я никогда не использовал запасных вариантов ... если это не работает для кого-то, они связываются со мной, и я говорю им, чтобы они перестали жить прошлым и включили JS.
@ n611x007 - Неэтичные вещи скрываются во всем коде, на каждом устройстве, будь то на стороне сервера или на стороне клиента. Это не кодекс ошибки, это вина человека. Я считаю кампанию против JS иронией, потому что вы все еще используете стороннего провайдера для подключения к Интернету, по-прежнему используете компьютер со сторонним оборудованием / прошивкой, по-прежнему используете небезопасные сотовые сети, доступные для сторонних инъекций, все еще владеете сотовым телефоном, который использует сторонняя ОС без патчей, по-прежнему использует телевизор с плоским экраном, который использует стороннюю широко открытую службу обновлений и т. д. и т. д. Вы всегда становитесь жертвой каналов MITM, независимо от того, отключили ли вы JS в своем браузере.
@dhaupin Хм, у вас нет критических фильтров или вы просто жалуетесь, что n611x007 разместил их так далеко от ваших, что вы думаете, что это не одно и то же. Тем не менее, держу пари, что у вас более одного пароля, и мне интересно, почему? У разных людей разные пороги для проблем с конфиденциальностью и безопасностью, кто-то сказал: «Жизнь слишком коротка», и я согласен, принимаю, что другие могут быть разными.
Хороший ответ. Вам по-прежнему следует заботиться о своих согражданах, использующих программы чтения с экрана, текстовые браузеры и т. д. Неужели и для этого жизнь слишком коротка? Кроме того, есть места и моменты, когда людям приходится использовать Tor и отключать javascript. Прогрессивное улучшение - это вещь.
Я думаю, вы могли бы вставить тег изображения в тег noscript и посмотреть статистику, сколько раз ваш сайт и как часто загружалось это изображение.
Я предполагаю, что вы пытаетесь решить, следует ли доставлять контент с расширенным JavaScript. Лучшие реализации полностью деградируют, так что сайт по-прежнему работает без JavaScript. Я также предполагаю, что вы имеете в виду обнаружение на стороне сервера, а не использование элемента <noscript> по необъяснимой причине.
Нет хорошего способа выполнить обнаружение серверного JavaScript. В качестве альтернативы можно использовать установить cookie с помощью JavaScript, а затем протестировать этот файл cookie с помощью сценариев на стороне сервера при последующих просмотрах страницы. Однако это не подходит для принятия решения о том, какой контент предоставлять, поскольку он не сможет отличить посетителей без файлов cookie от новых посетителей или посетителей, которые блокируют файлы cookie.
<noscript> ЯВЛЯЕТСЯ наиболее семантически точным способом указать контент, не являющийся javascript, и вместо того, чтобы определять, отключен ли javascript, определять, включен ли он. Так что покажите сообщение «вам нужен javascript для правильного использования моего сайта» по умолчанию, но сразу скройте его с помощью функции javascript onLoad.
@matt lohkamp: Или даже скройте сообщение по умолчанию и поместите блок <style> внутри <noscript>, чтобы отобразить его (там нет перекомпоновки, если включен JS). Удивительно, но это работает во всех современных браузерах и даже в IE6.
@matt - я делал это некоторое время, но сообщение остается некоторое время при медленных соединениях, что сбивает пользователей с толку. Я ищу другое решение. @Piskvor - тег <noscript> в заголовке не будет проверяться, а тег <style> в теле не будет проверяться.
Да, это было бы проблемой, если бы это было вне тега <noscript>, верно. Вы упоминаете <noscript> в заголовке - хотите ли вы условно включать файлы в зависимости от того, включен ли javascript?
... кроме того, почему вас беспокоит проверка? Вы проверяете только для проверки? Возможно, это не «правильно», но если он работает и добивается этого «с небольшим количеством грязи под капотом», в чем проблема? Не волнуйтесь, судить не буду ;-)
Он остается действительным, если вы просто используете атрибут style для заданных элементов в тегах <noscript> (например, <noscript> <div style = "color: red;"> blahblah </div> </noscript> или sg. Аналогичный) . НО это также остается действительным, если вы обычно помещаете <style> BLOCK в заголовок, определяющий стиль некоторых классифицированных элементов .noscript (или аналогичных), а в теле, в тегах <noscript>, вы просто даете заданным элементам ранее определенный класс .noscript, например: <noscript> <div class = "noscript"> blahblah </div> </noscript>
@Marc Gear сообщения: Нет хорошего способа выполнить обнаружение серверного JavaScript. Вместо этого используйте JavaScript для установки файла cookie, а затем проверьте наличие этого файла cookie с помощью сценариев на стороне сервера при последующих просмотрах страницы; доставлять контент надлежащим образом. Но если Javascript отключен, как это может работать?
@Pispirulito Если javascript отключен, cookie не будет установлен, и сервер, обнаружив его отсутствие, будет обслуживать версию страницы, отличную от js. Если включен javascript, cookie будет установлен, и сервер, обнаружив его присутствие, будет обслуживать js-версию страницы. Нежелательным побочным эффектом этого подхода является то, что пользователям, отключившим файлы cookie, будут обслуживаться версии, отличные от js, даже если включен javascript.
@Steve, вам не нужен ни <noscript> в заголовке, ни тег <style> в теле, ни любой другой встроенный CSS. просто поместите свой элемент noscript в тело, вставьте внутри элемент html и дайте ему идентификатор или класс и управляйте его поведением через файл стиля css. проверяет просто отлично. например: <noscript><div id = "noScript"><h1>This Site depends on Javascript, so please enable it.</h1></div></noscript>
Как отметил @Shawn, если JavaScript включен, но пользователь блокирует файлы cookie, будет обслуживаться не-JS-контент. Лучше использовать AJAX-вызов серверной процедуры, которая вместо этого устанавливает переменную сеанса. Если есть JavaScript, то AJAX пройдет, если нет, то нет. Это по-прежнему не решит проблему входа пользователя в систему с включенным javascript, а затем его отключения.
На самом деле, нежелательные побочные эффекты этого подхода, возможно, даже хуже. Куки не будет при первом запросе страницы. Вам нужно будет заставить клиента обновиться после полной загрузки страницы, чтобы наконец обнаружить cookie.
Вы можете, например, использовать что-то вроде document.location = 'java_page.html', чтобы перенаправить браузер на новую страницу, загруженную скриптами. Отсутствие перенаправления подразумевает, что JavaScript недоступен, и в этом случае вы можете либо прибегнуть к функциям CGI, либо вставить соответствующий код между тегами. (ПРИМЕЧАНИЕ: NOSCRIPT доступен только в Netscape Navigator 3.0 и выше.)
Люди уже публиковали примеры, которые являются хорошими вариантами обнаружения, но на основании вашего требования «предупреждать, что сайт не может работать должным образом, если в браузере не включен JS». Вы в основном добавляете элемент, который каким-то образом появляется на странице, например «всплывающие окна» в Stack Overflow, когда вы получаете значок, с соответствующим сообщением, а затем удаляете его с помощью некоторого Javascript, который запускается, как только страница загружается ( и я имею в виду DOM, а не всю страницу).
Если ваш вариант использования состоит в том, что у вас есть форма (например, форма входа) и ваш серверный скрипт должен знать, включен ли у пользователя JavaScript, вы можете сделать что-то вроде этого:
<form onsubmit = "this.js_enabled.value=1;return true;">
<input type = "hidden" name = "js_enabled" value = "0">
<input type = "submit" value = "go">
</form>
Это изменит значение js_enabled на 1 перед отправкой формы. Если ваш серверный скрипт получает 0, JS нет. Если он получает 1, JS!
Тег 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-запрос не замедлял отрисовку вашей страницы.
Вот что сработало для меня: он перенаправляет посетителя, если javascript отключен
<noscript><meta http-equiv = "refresh" content = "0; url=whatyouwant.html" /></noscript>
Это неверно. Элементы noscript не могут содержать метаэлементы. Я бы не поверил, что это будет надежно работать во всех браузерах (включая будущие браузеры, в которых вы в настоящее время не можете тестировать), поскольку они могут выполнять восстановление ошибок по-разному.
Это может быть недопустимым, но посмотрите на код Facebook, он использует то же решение в части <head> - что не означает, что это очень хорошее решение, потому что код Facebook далек от правильного кода, НО это может означать, что он работает в браузерах многих пользователей, что может быть важным аспектом. Но это правда, что на самом деле это не предлагается. Это их код: <noscript> <meta http-Equiv = refresh content = "0; URL = / about / messages /? _ Fb_noscript = 1" /> </noscript>
IE9 (по крайней мере) имеет настройку «разрешить META REFRESH». Кажется, я не многие его отключают, но, по-видимому, те, кому не нравится javascript, делают, но если вы хотите 100%, это не то.
Это действительно в HTML5.
Обновлено: было добавлено закрытие XML.
Это разрушает ссылку при попытке поделиться в Linkedin, мы нашли трудный путь ... это не лучшая идея. Поскольку linkedin следует за метаобновлением, игнорируя теги Og и т. д.
Добавление обновления в мета внутри noscript - не лучшая идея.
Поскольку тег noscript не совместим с XHTML
Значение атрибута «Обновить» нестандартное, и его не следует использовать. «Обновить» лишает пользователя возможности управлять страницей. Использование «Обновить» вызовет сбой в рекомендациях W3C по обеспечению доступности веб-контента. --- Ссылка http://www.w3schools.com/TAGS/att_meta_http_equiv.asp.
Никто ничего не сказал о XHTML. <noscript> - это совершенно правильный HTML 4.01 strict.
noscript также отлично работает в XHTML 1.0 и XHTML 1.1. Он не может содержать метаэлементы, и его следует избегать в пользу прогрессивного улучшения, но он является частью языков.
Почему бы вам просто не поставить захваченный обработчик событий onClick (), который будет срабатывать только при включенном JS, и использовать его для добавления параметра (js = true) к выбранному / нажатому URL-адресу (вы также можете обнаружить раскрывающийся список и измените значение - добавить скрытое поле формы). Итак, теперь, когда сервер видит этот параметр (js = true), он знает, что JS включен, а затем выполняет свою причудливую логику на стороне сервера. Обратной стороной этого является то, что когда пользователь впервые заходит на ваш сайт, закладку, URL-адрес, URL-адрес, сгенерированный поисковой системой, вам нужно будет определить, что это новый пользователь, поэтому не ищите NVP, добавленную в URL-адрес, и серверу придется ждать следующего щелчка, чтобы определить, включен / выключен пользователь JS. Кроме того, еще одним недостатком является то, что URL-адрес окажется на URL-адресе браузера, и если этот пользователь затем закладки этот URL-адрес, он будет иметь js = true NVP, даже если у пользователя не включен JS, хотя при следующем щелчке сервер будет Будьте мудры, чтобы знать, включен ли у пользователя JS или нет. Вздох .. это весело ...
Поскольку я всегда хочу дать браузеру что-нибудь стоящее, я часто использую этот трюк:
Во-первых, любая часть страницы, для которой требуется JavaScript для правильной работы (включая пассивные элементы HTML, которые изменяются с помощью вызовов getElementById и т. д.), Спроектирована так, чтобы ее можно было использовать как есть, с предположением, что там ISN'T javaScript доступен. (оформлен так, как будто его там не было)
Любые элементы, для которых требуется JavaScript, я помещаю в тег примерно так:
<span name = "jsOnly" style = "display: none;"></span>
Затем в начале моего документа я использую .onload или document.ready в цикле getElementsByName('jsOnly'), чтобы настроить .style.display = "";, чтобы снова включить JS-зависимые элементы. Таким образом, браузеры, не использующие JS, никогда не должны видеть зависимые от JS части сайта, и если они у них есть, они появляются сразу же по мере готовности.
Как только вы привыкнете к этому методу, довольно легко будет гибридизировать ваш код для обработки обеих ситуаций, хотя я только сейчас экспериментирую с тегом noscript и ожидаю, что он будет иметь некоторые дополнительные преимущества.
Чтобы заставить пользователей включить JavaScripts, я установил атрибут href для каждой ссылки на один и тот же документ, который уведомляет пользователя о необходимости включить JavaScripts или загрузить Firefox (если они не знают, как включить JavaScripts). Я сохранил фактический URL-адрес ссылки для атрибута «name» ссылок и определил глобальное событие onclick, которое считывает атрибут «name» и перенаправляет страницу туда.
Это хорошо работает для моей пользовательской базы, хотя и немного фашистски;).
и немного раздражает, если у пользователя включен JS и он нажимает на ссылку до того, как ваш прогрессивный javascript сработает ...
Конечно, но о проблеме еще не сообщалось.
Я бы хотел добавить сюда свой .02. Он не на 100% пуленепробиваемый, но я думаю, что он достаточно хорош.
Для меня проблема с предпочтительным примером размещения сообщения «этот сайт не так хорошо работает без Javascript» заключается в том, что затем вам нужно убедиться, что ваш сайт работает нормально без Javascript. И как только вы начнете идти по этому пути, вы начнете понимать, что сайт должен быть пуленепробиваемым с отключенным JS, а это целая большая часть дополнительной работы.
Итак, что вам действительно нужно, так это «перенаправление» на страницу с надписью «включите JS, глупо». Но, конечно, вы не можете надежно выполнять мета-перенаправления. Итак, вот предложение:
<noscript>
<style type = "text/css">
.pagecontainer {display:none;}
</style>
<div class = "noscriptmsg">
You don't have javascript enabled. Good luck with that.
</div>
</noscript>
... где все содержимого вашего сайта заключено в div класса pagecontainer. CSS внутри тега noscript затем скроет все содержимое вашей страницы и вместо этого отобразит любое сообщение «нет JS», которое вы хотите показать. Похоже, именно этим и занимается Gmail ... и если этого достаточно для Google, то и для моего маленького сайта.
(9 минут спустя) Однако он не будет подтвержден. В любом случае, очки за оригинальность.
@steve когда-нибудь пытался проверить google.com? проверка просто определяет, насколько близко документ следует спецификации, она никоим образом не влияет на удобство использования страницы.
Мне не нравится идея заставлять пользователя включать javascript. Что, если он просто не может? Я думаю, что ненавязчивый Javascript - это путь почти во всех случаях общедоступных веб-сайтов.
@JonasGeiregat Что плохого в том, чтобы заставить пользователя требовать Javascript, если ваше веб-приложение было создано - и требует - Javascript для работы? Я слышу этот комментарий слишком часто, но он действителен только для самых простых сайтов. Попробуйте Facebook без JS и посмотрите, что получится. Если ваше приложение было создано ДЛЯ Javascript, то что плохого в том, чтобы требовать, чтобы 99% пользователей все равно включили?
это далеко не правильный подход, если вы имеете дело с элементами управления, основанными на javascript. (возьмите, например, регистрационную форму). вы можете отключить CSS в большинстве браузеров.
Лучшим решением было бы разделить блок стиля: он должен быть в разделе заголовка. @Steve, теперь он подтвердит :)
Как это повлияет на роботов поисковых систем? Неужели они не увидят какой-либо контент?
+1 Мне нравится такой подход, он не только конструктивен для пользователя, но и быстро и просто реализуется без рефакторинга кучи кода. Я бы предпочел конструктивное сообщение, чем задаваться вопросом, почему x не работает ..
@Lee попадает в точку, вы можете сделать для пользователя только определенное количество вещей, прежде чем начнете определять, что вы будете поддерживать. Мы ожидаем, что у всех пользователей будет устройство с подключением к Интернету. Следует ли мне также реализовать бумажную версию своего сайта для тех, кто отказывается подключаться к Интернету?
@Kolors, я сделал этот комментарий еще в марте 2012 года, и я утверждаю, что сегодня он вдвойне верен. С тех пор у нас были Meteor, Angular.Js, Famo.us и множество замечательных библиотек, для которых требуется Javascript даже для Начало. Мне действительно интересно, чего на самом деле пытаются достичь пользователи, которые решили отключить JS ... очевидно, они не пользуются той же сетью, что и все мы, и нет причин, по которым компании нужно уменьшать размер своего веб-сайта для малейшего подмножество упрямых пользователей ...
@elliot: Хм ... я забыл подробности! Как неловко. (-; Но я знаю, что мета-перенаправления должны быть в заголовке, а это значит, что ваша страница может быть слишком далеко вверх по течению, чтобы определить, включен ли JS или нет. Я понимаю, что это не самый полезный ответ.
Да, и мне было интересно, почему я не могу проголосовать за ваш ответ, ведь я забыл активировать свой JS :-)) Мне нравится ваше решение, и я его использую! Спасибо!
Полагаю, мне почти никогда не нужна страница перенаправления с надписью turn on JS, silly. Особенно для обнаружение, если он уже включен ...
@Lee, обходящийся без JS, где это возможно, уменьшает общую сложность javascript, а за его сложностью скрываются неэтичные вещи. Facebook - отличный пример неэтичного поведения и попытки подтолкнуть мир к тому, чтобы следовать за ним. Если вы полны решимости и способны пройти трудный путь во благо своего сердца, тогда ненавязчивый javascript может помочь вам найти свой путь в Интернете.
@naxa - меня смущает ваш комментарий. Какие «неэтичные» вещи пытается скрыть Facebook и как это связано с включенным Javascript или отключенным?
Facebook на самом деле работает и без js, но вам предлагается перейти на версию, улучшенную для мобильных устройств (или включить js). Что касается «кто не использует js», на самом деле их довольно много. В первую очередь, люди с ограниченными подключениями к данным могут отключить js, люди, которые ценят, что их телефоны работают более пары часов (js-обработка - одно из основных энергозатрат на мобильные телефоны в Интернете), не говоря уже о тех, кто заботится о безопасности. нам, с расширениями noscript в браузере и т. д. Конечно, эти люди достаточно продвинуты, чтобы знать, как включить эту услугу, если они хотят использовать эту услугу.
Отлично сработал для меня, просто нужно было добавить style-src 'self' 'sha256-dapbzoBUpMY09sH855CMpiVFzV9xGciiPGiUTeyf/gA=' к моему Content-Security-Policy, чтобы разрешить встроенные сценарии.
Для тех, кто просто хочет отслеживать, включен ли js, как насчет использования подпрограммы ajax для хранения состояния? Например, я регистрирую всех посетителей / посещений в наборе таблиц. В поле JSenabled можно установить значение по умолчанию FALSE, а процедура ajax установит его в TRUE, если JS включен.
Ваш ответ очень корявый и непродуманный. У этого предложения есть серьезные проблемы, ни одна из которых вы не рассмотрели. Использование JS для немедленной проверки включения JS кажется подозрительным. Даже если предположить, что вы можете идентифицировать пользователя в таблице посетителей, когда у него отключен JS (на ум приходят файлы cookie + веб-маяки, но это ненадежно), у вас возникнет проблема в случае: 1. пользователь посещает с JS на 2. тот же пользователь посещает с выключенным JS.
немного сложно, но (причёска подсказала мне идею)
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?
Добавьте это в тег 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>
С благодарностью Джею.
Вчера мне пришлось решить ту же проблему, поэтому я просто добавляю сюда свой .001. Решение работает для меня нормально, по крайней мере, на домашней странице (index.php)
Мне нравится, чтобы в корневой папке был только один файл: index.php. Затем я использую папки для структурирования всего проекта (код, css, js и т. д.). Итак, код для index.php выглядит следующим образом:
<head>
<title>Please Activate Javascript</title>
<meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" />
<script type = "text/javascript" src = "js/jquery-1.3.2.min.js"></script>
</head>
<body>
<script language = "JavaScript">
$(document).ready(function() {
location.href = "code/home.php";
});
</script>
<noscript>
<h2>This web site needs javascript activated to work properly. Please activate it. Thanks!</h2>
</noscript>
</body>
</html>
Надеюсь, это кому-нибудь поможет. Наилучшие пожелания.
не рекомендуется; Google не может найти вас таким образом, также вам не нужен jquery, и вы можете выполнить его во время загрузки, потому что эта страница не требует ничего лишнего
Зачем загружать jQuery только для перенаправления пользователя?
window.onload = function () {window.location = "код / home.php"; } или если вы предпочитаете библиотеку 80k для перенаправления, круто.
Вы не определяете, отключен ли у пользователя JavaScript (на стороне сервера или на стороне клиента). Вместо этого вы предполагаете, что javascript отключен, и создаете свою веб-страницу с отключенным javascript. Это устраняет необходимость в noscript, которого вам в любом случае следует избегать, потому что он работает неправильно и в нем нет необходимости.
Например, просто создайте свой сайт, чтобы сказать <div id = "nojs">This website doesn't work without JS</div>.
Затем ваш скрипт просто выполнит document.getElementById('nojs').style.display = 'none'; и продолжит свои обычные JS-дела.
это отличный беспрепятственный подход. Теги <noscript> намного сложнее поддерживать на разных страницах. При таком подходе вы можете сохранить стиль noscript с помощью файла css.
Проверьте файлы cookie, используя чистое решение на стороне сервера, я ввел здесь, затем проверьте наличие javascript, удалив файл cookie с помощью Jquery.Cookie, а затем проверьте файл cookie таким образом, чтобы проверить как файлы cookie, так и javascript
Используйте класс .no-js в теле и создавайте стили, отличные от javascript, на основе родительского класса .no-js. Если javascript отключен, вы получите все стили, отличные от javascript, если есть поддержка JS, класс .no-js будет заменен, предоставив вам все стили, как обычно.
document.body.className = document.body.className.replace("no-js","js");
трюк, используемый в шаблоне HTML5 http://html5boilerplate.com/ через modernizr, но вы можете использовать одну строку javascript для замены классов
Теги noscript - это нормально, но зачем лишние вещи в вашем html, если это можно сделать с помощью css
Не могу поверить, что прошло много времени, прежде чем кто-то упомянул класс .nojs! Это один из самых бесшовных подходов, который посрамляет noscript.
В некоторых случаях может быть достаточно сделать это наоборот. Добавьте класс с помощью javascript:
// Jquery
$('body').addClass('js-enabled');
/* CSS */
.menu-mobile {display:none;}
body.js-enabled .menu-mobile {display:block;}
Это может создать проблемы с обслуживанием чего-либо сложного, но для некоторых вещей это простое решение. Вместо того, чтобы пытаться определить, когда он не загружен, просто задайте стиль в соответствии с тем, когда он загружен.
Решение может показаться странным, но вы можете попробовать:
<?php $jsEnabledVar = 0; ?>
<script type = "text/javascript">
var jsenabled = 1;
if (jsenabled == 1)
{
<?php $jsEnabledVar = 1; ?>
}
</script>
<noscript>
var jsenabled = 0;
if (jsenabled == 0)
{
<?php $jsEnabledVar = 0; ?>
}
</noscript>
Теперь используйте значение $ jsEnabledVar на всей странице. Вы также можете использовать его для отображения блока, указывающего пользователю, что JS отключен.
надеюсь, это поможет
Обязательно инициализируйте $ jsEnabledVar = 0;
Я думаю, вы путаете порядок, в котором все происходит. Парсер php будет выполнять код php на стороне сервера при обслуживании страницы; JavaScript не выполняется. Только когда клиент получит страницу и весь PHP-код уже выполнен, будет выполнен javascript.
Чувак, скрипт сначала будет обслуживаться с сервера, поэтому все будет проанализировано на первой стороне сервера! Ваш сценарий - полная чушь.
Вы пытаетесь запустить сценарий внутри <noscript>, когда это означает, что у пользователя НЕ ВКЛЮЧЕН JAVASCRIPT.
Распространенным решением является использование метатега в сочетании с 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.
Но если javascript отключен, это будет повторяться вечно?
Я хотел бы добавить свое решение для получения достоверной статистики о том, сколько реальных пользователей посещают мой сайт с отключенным javascript из общего числа пользователей. Проверка выполняется один раз за сеанс со следующими преимуществами:
В моем коде используются PHP, mysql и jquery с ajax, но его можно адаптировать к другим языкам:
Создайте в своей БД таблицу, подобную этой:
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;
Добавьте это на каждую страницу после использования session_start () или аналогичного (требуется 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>
<?
}
?>
Создайте страницу JSOK.php следующим образом:
<?
include_once("[DB connection file].php");
mysql_query("UPDATE log_JS SET JS_ON = 1 WHERE session_id = '" . mysql_real_escape_string(session_id()) . "'");
Я придумал другой подход, используя сам css и javascript. Это просто для того, чтобы начать возиться с классами и идентификаторами.
Фрагмент CSS:
1. Создайте правило идентификатора CSS и назовите его # jsDis.
.
2. Используйте свойство «content», чтобы сгенерировать текст после элемента BODY. (Вы можете оформить это как хотите) .
3 Создайте второе правило идентификатора CSS, назовите его #jsEn и стилизуйте его. (для простоты я дал своему правилу #jsEn другой цвет фона.
<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>
Фрагмент кода JavaScript:
1. Создайте функцию.
2. Возьмите BODY ID с помощью getElementById и назначьте его переменной.
3. Используя функцию JS setAttribute, измените значение атрибута ID элемента BODY.
<script>
function jsOn() {
var chgID = document.getElementById('jsDis');
chgID.setAttribute('id', 'jsEn');
}
</script>
Часть HTML.
1. Назовите атрибут элемента BODY с идентификатором # jsDis.
.
2. Добавьте событие onLoad с именем функции. (jsOn ()).
<body id = "jsDis" onLoad = "jsOn()">
Из-за тега BODY был присвоен идентификатор #jsDis:
.
- Если Javascript включен, он сам изменит атрибут тега BODY.
- Если Javascript отключен, будет отображаться текст правила css 'content:'.
Вы можете поиграть с контейнером #wrapper или с любым DIV, использующим JS.
.
Надеюсь, это поможет понять идею.
Вот сценарий PHP, который можно включить один раз перед генерацией любого вывода. Это не идеально, но в большинстве случаев он работает достаточно хорошо, чтобы избежать доставки контента или кода, которые не будут использоваться клиентом. Комментарии в заголовке объясняют, как это работает.
<?php
/*****************************************************************************
* JAVASCRIPT DETECTION *
*****************************************************************************/
// Progressive enhancement and graceful degradation are not sufficient if we
// want to avoid sending HTML or JavaScript code that won't be useful on the
// client side. A normal HTTP request will not include any explicit indicator
// that JavaScript is enabled in the client. So a "preflight response" is
// needed to prompt the client to provide an indicator in a follow-up request.
// Once the state of JavaScript availability has been received the state of
// data received in the original request must be restored before proceding.
// To the user, this handshake should be as invisible as possible.
//
// The most convenient place to store the original data is in a PHP session.
// The PHP session extension will try to use a cookie to pass the session ID
// but if cookies are not enabled it will insert it into the query string.
// This violates our preference for invisibility. When Javascript is not
// enabled the only way to effect a client side redirect is with a "meta"
// element with its "http-equiv" attribute set to "refresh". In this case
// modifying the URL is the only way to pass the session ID back.
//
// But when cookies are disabled and JavaScript is enabled then a client side
// redirect can be effected by setting the "window.onload" method to a function
// which submits a form. The form has a "method" attribute of "post" and an
// "action" attribute set to the original URL. The form contains two hidden
// input elements, one in which the session ID is stored and one in which the
// state of JavaScript availability is stored. Both values are thereby passed
// back to the server in a POST request while the URL remains unchanged. The
// follow-up request will be a POST even if the original request was a GET, but
// since the original request data is restored, the containing script ought to
// process the request as though it were a GET.
// In order to ensure that the constant SID is defined as the caller of this
// script would expect, call session_start if it hasn't already been called.
$session = isset($_SESSION);
if (!$session) session_start();
// Use a separate session for Javascript detection. Save the caller's session
// name and ID. If this is the followup request then close the caller's
// session and reopen the Javascript detection session. Otherwise, generate a
// new session ID, close the caller's session and create a new session for
// Javascript detection.
$session_name = session_name();
$session_id = session_id();
session_write_close();
session_name('JS_DETECT');
if (isset($_COOKIE['JS_DETECT'])) {
session_id($_COOKIE['JS_DETECT']);
} elseif (isset($_REQUEST['JS_DETECT'])) {
session_id($_REQUEST['JS_DETECT']);
} else {
session_id(sha1(mt_rand()));
}
session_start();
if (isset($_SESSION['_SERVER'])) {
// Preflight response already sent.
// Store the JavaScript availability status in a constant.
define('JS_ENABLED', 0+$_REQUEST['JS_ENABLED']);
// Store the cookie availability status in a constant.
define('COOKIES_ENABLED', isset($_COOKIE['JS_DETECT']));
// Expire the cookies if they exist.
setcookie('JS_DETECT', 0, time()-3600);
setcookie('JS_ENABLED', 0, time()-3600);
// Restore the original request data.
$_GET = $_SESSION['_GET'];
$_POST = $_SESSION['_POST'];
$_FILES = $_SESSION['_FILES'];
$_COOKIE = $_SESSION['_COOKIE'];
$_SERVER = $_SESSION['_SERVER'];
$_REQUEST = $_SESSION['_REQUEST'];
// Ensure that uploaded files will be deleted if they are not moved or renamed.
function unlink_uploaded_files () {
foreach (array_keys($_FILES) as $k)
if (file_exists($_FILES[$k]['tmp_name']))
unlink($_FILES[$k]['tmp_name']);
}
register_shutdown_function('unlink_uploaded_files');
// Reinitialize the superglobal.
$_SESSION = array();
// Destroy the Javascript detection session.
session_destroy();
// Reopen the caller's session.
session_name($session_name);
session_id($session_id);
if ($session) session_start();
unset($session, $session_name, $session_id, $tmp_name);
// Complete the request.
} else {
// Preflight response not sent so send it.
// To cover the case where cookies are enabled but JavaScript is disabled,
// initialize the cookie to indicate that JavaScript is disabled.
setcookie('JS_ENABLED', 0);
// Prepare the client side redirect used when JavaScript is disabled.
$content = '0; url='.$_SERVER['REQUEST_URI'];
if (!$_GET['JS_DETECT']) {
$content .= empty($_SERVER['QUERY_STRING']) ? '?' : '&';
$content .= 'JS_DETECT='.session_id();
}
// Remove request data which should only be used here.
unset($_GET['JS_DETECT'],$_GET['JS_ENABLED'],
$_POST['JS_DETECT'],$_POST['JS_ENABLED'],
$_COOKIE['JS_DETECT'],$_COOKIE['JS_ENABLED'],
$_REQUEST['JS_DETECT'],$_REQUEST['JS_ENABLED']);
// Save all remaining request data in session data.
$_SESSION['_GET'] = $_GET;
$_SESSION['_POST'] = $_POST;
$_SESSION['_FILES'] = $_FILES;
$_SESSION['_COOKIE'] = $_COOKIE;
$_SESSION['_SERVER'] = $_SERVER;
$_SESSION['_REQUEST'] = $_REQUEST;
// Rename any uploaded files so they won't be deleted by PHP. When using
// a clustered web server, upload_tmp_dir must point to shared storage.
foreach (array_keys($_FILES) as $k) {
$tmp_name = $_FILES[$k]['tmp_name'].'x';
if (move_uploaded_file($_FILES[$k]['tmp_name'], $tmp_name))
$_SESSION['_FILES'][$k]['tmp_name'] = $tmp_name;
}
// Have the client inform the server as to the status of Javascript.
?>
<!DOCTYPE html>
<html>
<head>
<script>
document.cookie = 'JS_ENABLED=1';
// location.reload causes a confirm box in FireFox
// if (document.cookie) { location.reload(true); }
if (document.cookie) { location.href = location; }
</script>
<meta http-equiv = "refresh" content = "<?=$content?>" />
</head>
<body>
<form id = "formid" method = "post" action = "" >
<input type = "hidden" name = "<?=$session_name?>" value = "<?=$session_id?>" />
<input type = "hidden" name = "JS_DETECT" value = "<?=session_id()?>" />
<input type = "hidden" name = "JS_ENABLED" value = "1" />
</form>
<script>
document.getElementById('formid').submit();
</script>
</body>
</html>
<?php
exit;
}
?>
Вот изюминка! Могут быть клиентские браузеры с включенным Javascript и использующие JS-совместимые браузеры. Но по какой-либо причине Javascript не работает в браузере (например, настройки брандмауэра). По статистике это происходит в каждом 1 из 93 сценариев. Таким образом, сервер обнаруживает, что клиент может выполнять Javascript, но на самом деле это не так!
В качестве решения я предлагаю установить файл cookie на клиентском сайте, а затем прочитать его с сервера. Если cookie установлен, то JS работает нормально. Какие-нибудь мысли ?
<noscript> даже не нужен, не говоря уже о не поддерживается в XHTML.
Рабочий пример:
<!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>
В этом примере, если включен JavaScript, вы видите сайт. В противном случае вы увидите сообщение «Пожалуйста, включите JavaScript». Лучший способ проверить, включен ли JavaScript, - просто попробовать использовать JavaScript! Если работает то включено, если нет то нет ...
Ха, XHTML. Это были дни ... Вещи сильно изменились: developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript
@StephanWeinhold, JSF использует XHTML.
Это самый "чистый" идентификатор использования решения:
<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>
код внутри тегов <noscript> будет выполняться, если в браузере не включен js.
мы можем использовать теги noscript для отображения сообщения о включении JS, как показано ниже.
сохраняя содержимое нашего веб-сайта внутри тела как скрытое. как показано ниже
<body>
<div id = "main_body" style = "display: none;">
website content.
</div>
</body>
теперь, если JS включен, вы можете просто сделать содержимое внутри вашего main_body видимым, как показано ниже
<script type = "text/javascript">
document.getElementById("main_body").style.display = "block";
</script>
Конечно, файлы cookie и HTTP-заголовки - отличные решения, но оба потребуют явного участия на стороне сервера.
Для простых сайтов или там, где у меня нет доступа к серверной части, я предпочитаю решения на стороне клиента.
-
Я использую следующее, чтобы установить атрибут класса для самого элемента HTML, поэтому мой CSS может обрабатывать практически всю логику другого типа отображения.
МЕТОДЫ:
1) поместите <script>document.getElementsByTagName('html')[0].classList.add('js-enabled');</script>над в элемент <html>.
ПРЕДУПРЕЖДЕНИЕ!!!!
Этот метод переопределит все атрибуты класса <html>, не говоря уже о том, что он может быть не «правильным» HTML, но работает во всех браузерах, в которых я его тестировал.
* ПРИМЕЧАНИЯ: из-за времени запуска скрипта до обработки тега <html> он получает пустую коллекцию classList без узлов, поэтому к моменту завершения скрипта элементу <html> будут присвоены только классы. вы добавили.
2) Сохраняет все остальные атрибуты класса <html>, просто поместите сценарий <script>document.getElementsByTagName('html')[0].classList.add('js-enabled');</script> сразу после открывающего тега <html>.
В обоих случаях, если JS был отключен, никакие изменения атрибутов класса <html> внесены не будут.
АЛЬТЕРНАТИВЫ
На протяжении многих лет я использовал несколько других методов:
<script type = "text/javascript">
<!--
(function(d, a, b){
let x = function(){
// Select and swap
let hits = d.getElementsByClassName(a);
for( let i = hits.length - 1; i >= 0; i-- ){
hits[i].classList.add(b);
hits[i].classList.remove(a);
}
};
// Initialize Second Pass...
setTimeout(function(){ x(); },0);
x();
})(document, 'no-js', 'js-enabled' );
-->
</script>
// Минимизируется как:
<script type = "text/javascript">
<!--
(function(d, a, b, x, hits, i){x=function(){hits=d.getElementsByClassName(a);for(i=hits.length-1;i>=0;i--){hits[i].classList.add(b);hits[i].classList.remove(a);}};setTimeout(function(){ x(); },0);x();})(document, 'no-js', 'js-enabled' );
-->
</script>
<html> и
еще раз после загрузки страницы. Потребовалось два раза, так как я ввел в файл header.tpl CMS, к которому у меня не было доступа к серверной части, но я хотел представить параметры стиля для фрагментов no-js.Первый проход установит, что класс с поддержкой .js разрешает включение любых глобальных стилей и предотвращает большинство дальнейших перекомпоновок. второй проход был уловом для любого позже включенного контента.
ПРИЧИНЫ:
Основные причины, по которым меня интересовал, был ли JS включен или нет, были для целей «стилизации», скрытия / отображения формы, включения / отключения кнопок или изменения стиля презентации и макетов слайдеров, таблиц и других презентаций, которые требовали JS для работы » правильно »и было бы бесполезно или непригодно для использования без JS для анимации или обработки взаимодействий.
Кроме того, вы не можете напрямую обнаружить с помощью javascript, если javascript "отключен" ... только если он "включен", путем выполнения некоторого javascript, поэтому вы либо полагаетесь на <meta http-equiv = "refresh" content = "2;url=/url/to/no-js/content.html" />, либо на css для переключения стилей и если javascript запускается, чтобы переключиться в режим с поддержкой js.
Что вы хотите делать с этой информацией? Это может изменить полученный ответ - например, прогрессивное улучшение, как правило, предпочтительнее, чем попытки обнаружить отключенный JavaScript и предпринять определенные действия, основанные на этом.