Как определить, отключен ли JavaScript?

659

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

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

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

MikeJ
источник
Что вы хотите сделать с этой информацией? Это может изменить ответ, который вы получите - например, прогрессивное усовершенствование обычно предпочтительнее, чем попытка обнаружить отключенный JavaScript и выполнение определенных действий на его основе.
Джонни Бьюкенен
прогрессивное улучшение - это то, что я ищу. Я не хочу перенаправлять их на альтернативный контент, который будет функционировать должным образом в отсутствие JS-совместимого или способного браузера.
MikeJ
1
@expiredninja Это сообщение Николаса Закаса говорит о 2%, хотя ему больше года.
sdleihssirhc
Самый простой способ - использовать noscript для отображения сайта, не являющегося javascript, и использовать javascript для отображения любых зависимых от javascript элементов путем изменения стиля отображения.
Myforwik

Ответы:

286

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

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

ashleedawg
источник
129
<noscript> - наиболее семантически точный способ указать содержимое, не являющееся javascript, и вместо того, чтобы определять, отключен ли javascript, определять, включен ли он. Так что покажите сообщение «вам нужен javascript для правильного использования моего сайта» по умолчанию, но сразу же спрячьте его с помощью функции javascript onLoad.
Мэтт Лохкамп
58
@matt lohkamp: Или даже скрыть сообщение по умолчанию и поместить <style>блок внутри, <noscript>чтобы отобразить (нет перекомпоновки, если включен JS). Удивительно, но это работает во всех современных браузерах, и даже в IE6
Писквор покинул здание
7
@matt - Я делал это некоторое время, но сообщение на медленном соединении некоторое время остается, оставляя пользователей в замешательстве. Я здесь ищу другое решение. @Piskvor - тег <noscript> в заголовке не будет проверяться, а тег <style> в теле не будет проверяться.
Бен
20
... кроме того, почему вы обеспокоены проверкой? Вы проверяете только для проверки? Это может быть не "правильно", но если это работает и выполняет это "с небольшим количеством грязи под капотом", в чем проблема? Не волнуйтесь, я не буду судить ;-)
keif
4
Он остается действительным, если вы просто используете атрибут style для заданных элементов в тегах <noscript> (например, <noscript> <div style = "color: red;"> blahblah </ div> </ noscript> или sg. Аналогичные) , НО это также остается в силе, если вы поместите BLOCK <style> в заголовок, определяющий стиль некоторых классифицированных элементов .noscript (или аналогичных), а в теле, внутри тегов <noscript>, вы просто даете указанным элементам ранее определенный класс .noscript, например: <noscript> <div class = "noscript"> blahblah </ div> </ noscript>
Sk8erPeter
360

Я хотел бы добавить свой .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 будет скрывать все содержимое вашей страницы и вместо этого отображать любое сообщение «no JS», которое вы хотите показать. Это именно то, что Gmail, кажется, делает ... и если это достаточно хорошо для Google, это достаточно хорошо для моего маленького сайта.

hairbo
источник
12
@steve когда-либо пытались проверить google.com? проверка просто определяет, насколько близко документ соответствует спецификации, это никак не влияет на удобство использования страницы.
JKirchartz
71
@JonasGeiregat Что плохого в том, чтобы заставить пользователя требовать Javascript, если ваше веб-приложение было создано - и требует - Javascript для работы? Я слишком часто слышу этот комментарий, но он действителен только для самых простых сайтов. Попробуйте Facebook без JS и посмотрите, что получится. Если ваше приложение было разработано для Javascript, то что плохого в том, что 99% пользователей в любом случае включили его?
Ли Бенсон
19
@ Ли ударяет по гвоздю, вы можете сделать так много для пользователя, прежде чем подвести черту к тому, что вы будете поддерживать. Мы ожидаем, что у всех пользователей будет устройство с подключением к Интернету. Должен ли я использовать бумажную версию своего сайта для тех, кто отказывается получить доступ к Интернету?
Kolors
14
@Kolors, я сделал этот комментарий еще в марте 2012 года, и я бы сказал, что сегодня это вдвойне верно. С тех пор мы имели Метеор, Angular.Js, Famo.us и тонны удивительных библиотек , которые все требуют Javascript даже начать . Мне действительно интересно, чего на самом деле пытаются достичь пользователи, которые решили отключить JS ... ясно, что они не пользуются тем же веб-сайтом, что и остальные из нас, и нет никаких причин, по которым компания должна сокращать свой веб-сайт до минимума. подмножество упрямых пользователей ...
Ли Бенсон
6
Да, и я удивился, почему я не смог отозвать ваш ответ, так как забыл активировать свой JS :-)) Мне нравится и реализую ваше решение! Спасибо!
Гаравани
199

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 / non-JS, или пытаетесь установить cookie-файл через JS, отсутствие которого подразумевает JS выключен. Оба эти примера довольно тривиальны и открыты для манипуляций, но вы поняли идею.

Если вы хотите получить чисто статистическое представление о том, как много ваших пользователей отключили JavaScript, вы можете сделать что-то вроде:

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

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

Вышеупомянутый подход (отслеживание изображений) не будет работать хорошо для текстовых браузеров или тех, которые вообще не поддерживают js, поэтому, если ваша пользовательская база в основном движется в эту область, это может быть не лучшим подходом.

ConroyP
источник
7
Это не очень эффективно. Например, он не учитывает никого с текстовыми браузерами, которые обычно не поддерживают JavaScript. По крайней мере, вы должны отключить кэширование для этого изображения.
Джим
3
Будет ли браузер, который вообще не поддерживает JS, просто игнорировать тег noscript и показывать изображение?
LKM
1
@LKM: Зависит от того, как они написаны, скорее всего, так и будет, поэтому вы сделаете точку размером 1x1px. Эта опция в основном предназначена для отслеживания шаблонов использования на стороне сервера, поэтому все равно будет в порядке, так как она запускается пользователем без возможности JavaScript.
ConroyP
Обратите внимание, что в настоящее время есть ошибка с IE8 и тегом noscript, если вы стилизуете его ... см.
Positioniseverything.net/explorer.html
2
также вы можете использовать это изображение в качестве серверного сценария, установив mime-тип, и использовать его для регистрации некоторой информации о пользователе или удаления файла cookie ... px.sklar.com/code.html/id=256
JKirchartz
46

Это то, что работает для меня: он перенаправляет посетителя, если JavaScript отключен

<noscript><meta http-equiv="refresh" content="0; url=whatyouwant.html" /></noscript>
Ernie13
источник
6
Это неверно Элементы noscript не могут содержать мета-элементы. Я бы не стал доверять этому, чтобы он работал надежно во всех браузерах (включая будущие браузеры, в которых вы не можете сейчас тестировать), так как они могут выполнять восстановление после ошибок различными способами.
Квентин
15
Это может быть неверно, но посмотрите на код Facebook, он использует то же решение в части <head> - это не значит, что это очень хорошее решение, потому что код Facebook далек от действительного кода, НО это может означать, что это работает на браузере многих пользователей, что может быть важным аспектом. Но это правда, что это на самом деле не предлагается. Это их код: <noscript> <meta http-equ = refresh content = "0; URL = / about / messages /? _ Fb_noscript = 1" /> </ noscript>
Sk8erPeter
IE9 (как минимум) имеет настройку «разрешить META REFRESH». Я, кажется, не многие выключают его, но, вероятно, те, кто не любит javascript, делают, но если вы хотите 100%, это не так.
Дженсон Баттон: мероприятие,
Это действительно в HTML5.
Наста
1
Это разрушает ссылку при попытке поделиться на Linkedin, мы нашли трудный путь ... это не очень хорошая идея. Так как linkedin следует мета-обновлению, игнорируя теги Og и т. Д.
SomeDudeSomewhere,
44

Если ваш вариант использования таков, что у вас есть форма (например, форма входа в систему) и ваш серверный скрипт должен знать, если у пользователя включен 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!

Эндрю Хеджес
источник
44

Я бы посоветовал вам пойти другим путем, написав ненавязчивый JavaScript.

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

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

roosteronacid
источник
146
Жизнь слишком коротка. Это 2012- Включите JavaScript или идите домой
Ярин
25
«Жизнь слишком коротка. Сейчас 2012 год - включи JavaScript или иди домой!» идеальное маленькое сообщение для отображения в случае отсутствия JS. авторизовался только для того, чтобы сказать, что @Yarin
5
Я также только что вошел в систему, чтобы сказать, что это УДИВИТЕЛЬНО! @Yarin. Я делаю небольшой сайт, который не будет общедоступным (например, интранет, но для друзей, собирающихся вместе для работы над проектом). Я делаю это SPA и не потрудился сделать запасной вариант. Ненавязчивый JavaScript почти удвоит нагрузку, которую я вкладываю в концепцию SPA. С современными библиотеками javascript, такими как Knockout, Jquery и другими, мы просто должны признать, что не каждый сайт может быть легко сделан "ненавязчивым". Javascript - это будущее Интернета.
Лассомбра
5
@ Ярин Я создаю приложения PHP / JS для жизни, которую я никогда не использовал в качестве запасного варианта ... если это не работает для кого-то, они связываются со мной, и я говорю им прекратить жить в прошлом и включить JS.
Сэм
2
@ n611x007 - Неэтичные вещи прячутся во всем коде, на каждом устройстве, на стороне сервера или клиента. Это не ошибка кодов, это вина людей. Я нахожу кампанию против JS ироничной, потому что вы по-прежнему используете стороннего интернет-провайдера для подключения к Интернету, по-прежнему используете компьютер с аппаратным или микропрограммным обеспечением сторонних производителей, по-прежнему используете небезопасные сотовые сети, доступные для инъекций третьих лиц, по-прежнему владеете мобильным телефоном, который использует сторонняя непатентованная ОС, все еще использующая телевизор с плоским экраном, который использует стороннюю широко открытую службу обновлений и т. д. и т. д. Вы всегда являетесь жертвой каналов MITM-выхода, независимо от того, отключили ли вы JS в своем браузере.
дхаупин
35

<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! Если это работает, это включено, если нет, то это не ...

де Раад
источник
1
Ха, XHTML. Это были дни ... Вещи сильно изменились: developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript
Стефан Вайнхолд,
зачем использовать jquery ...
Луис Вильявисенсио
@StephanWeinhold, JSF использует XHTML.
Араш
34

Используйте класс .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?

оборота Grundizer
источник
5
Не могу поверить, что прошло много времени, прежде чем кто-то упомянул .nojsкласс! Это один из самых плавных подходов и noscriptпозор.
Моисей
15

просто немного сложно, но (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?

borrel
источник
13

Вы можете использовать простой фрагмент JS, чтобы установить значение скрытого поля. При публикации вы узнаете, был ли включен JS или нет.

Или вы можете попытаться открыть всплывающее окно, которое вы быстро закрываете (но оно может быть видно).

Также у вас есть тег NOSCRIPT, который вы можете использовать для отображения текста в браузерах с отключенным JS.

rslite
источник
Это не хороший ответ. Первое решение требует перезагрузки страницы и отправки формы. Второе решение открывает всплывающее окно (ack!) И закрывает его «быстро» - со стороны клиента? -1
Бен
Иногда вам нужно знать, на стороне сервера, включен ли JS на сайте или нет, поэтому я не вижу, как вы можете сделать это, кроме публикации чего-либо обратно. Согласитесь, что всплывающее окно выглядит ужасно, но я не совсем уверен в этом, но должна быть возможность открыть всплывающее окно за пределами видимой области экрана, чтобы пользователь не беспокоился об этом. Не элегантно, но работает, и нет перезагрузки страницы.
rslite
Спам-боты также отправляют сообщения в скрытое поле.
Янис Вейнбергс
13

Вы захотите взглянуть на тег 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>
скоро
источник
12

Тег 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

Добавьте это к тегу 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>

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

the_seeker_who
источник
12

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

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

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

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

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

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

Брайан
источник
10

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

<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
источник
9

Распространенным решением является использование метатега в сочетании с 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

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

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

оборота Джоэл Коухорн
источник
5

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

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

Brad8118
источник
4

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

Джон Топли
источник
4

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

MrVolley
источник
4

Люди уже опубликовали примеры, которые являются хорошими вариантами для обнаружения, но основаны на вашем требовании «предупредить, что сайт не может работать должным образом, если в браузере не включен JS». Вы в основном добавляете элемент, который каким-то образом появляется на странице, например, всплывающие окна в переполнении стека, когда вы получаете значок, с соответствующим сообщением, а затем удаляете его с помощью некоторого Javascript, который запускается, как только страница загружается ( и я имею в виду DOM, а не всю страницу).

roryf
источник
3

Обнаружить это в чем? JavaScript? Это было бы невозможно. Если вы просто хотите это для целей ведения журнала, вы можете использовать какую-то схему отслеживания, где на каждой странице есть JavaScript, который будет запрашивать специальный ресурс (вероятно, очень маленький gifили похожий). Таким образом, вы можете просто учитывать разницу между уникальными запросами страниц и запросами вашего файла отслеживания.

Хэнк Гей
источник
3

Почему бы вам просто не поместить обработчик события угоненного onClick (), который будет срабатывать только при включенном JS, и использовать его для добавления параметра (js = true) к выбранному URL-адресу, на который вы нажали (вы также можете обнаружить выпадающий список и измените значение - добавьте скрытое поле формы). Так что теперь, когда сервер видит этот параметр (js = true), он знает, что JS включен, и затем выполняет свою причудливую логику на стороне сервера.
Обратной стороной этого является то, что в первый раз, когда пользователи заходят на ваш сайт, закладку, URL, URL, созданный поисковой системой, вам нужно будет определить, что это новый пользователь, поэтому не ищите NVP, добавленный в URL, и сервер должен будет ждать следующего щелчка, чтобы определить, включен ли пользователь JS. Кроме того, еще одним недостатком является то, что URL будет в конечном итоге на URL браузера, и если этот пользователь затем добавит в закладки этот URL, он будет иметь js = true NVP, даже если у пользователя не включен JS, хотя при следующем щелчке сервер будет желательно знать, был ли у пользователя включен JS или нет. Вздох .. это весело ...

FirstSOURCE
источник
3

Чтобы заставить пользователей включать JavaScripts, я устанавливаю атрибут «href» каждой ссылки на один и тот же документ, который уведомляет пользователя о необходимости включения JavaScripts или загрузки Firefox (если они не знают, как включить JavaScripts). Я сохранил фактический URL-адрес ссылки на атрибут «name» ссылок и определил глобальное событие onclick, которое считывает атрибут «name» и перенаправляет страницу туда.

Это хорошо работает для моей пользовательской базы, хотя и немного фашистской;).

Ян Сахин
источник
и немного раздражает, если пользователь действительно включил JS и нажимает на ссылку до того, как ваш прогрессивный JavaScript
включается
1
Конечно, но о проблемах не сообщалось.
Ян Сахин
3

Вы не определяете, отключен ли у пользователя 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.
Задубз
3

Проверьте наличие файлов cookie с помощью чисто серверного решения, которое я представил здесь, затем проверьте наличие javascript, удалив файл cookie с помощью Jquery.Cookie, а затем проверьте файлы cookie таким образом.

пуйя
источник
3

В некоторых случаях этого может быть достаточно. Добавьте класс, используя JavaScript:

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

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

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

Дженнифер Мишель
источник
3

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

  • Пользователи, посещающие 100 страниц или только 1, считаются по 1 на каждую. Это позволяет сосредоточиться на отдельных пользователях, а не на страницах.
  • В любом случае не нарушает поток, структуру или семантику
  • Мог логи агента пользователя. Это позволяет исключить ботов из статистики, таких как бот Google и бот Bing, которые обычно отключают JS! Может также войти IP, время и т. Д ...
  • Всего одна проверка на сеанс (минимальная перегрузка)

Мой код использует 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()) . "'");
Unbroken
источник
3

Я разобрался с другим подходом, используя css и javascript.
Это только для начала возиться с классами и идентификаторами.

Фрагмент CSS:
1. Создайте правило css ID и назовите его #jsDis.
2. Используйте свойство content для создания текста после элемента BODY. (Вы можете стилизовать это как хотите).
3 Создайте второе правило ID 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. Захватите идентификатор тела с помощью 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.

Надеюсь, это поможет понять.

Крис Песоа
источник
2

Добавление обновления в meta внутри noscript не очень хорошая идея.

  1. Поскольку тэг noscript не соответствует XHTML

  2. Значение атрибута «Обновить» является нестандартным и не должно использоваться. «Обновить» забирает контроль над страницей у пользователя. Использование «Обновить» приведет к сбою в Руководстве по доступности веб-контента W3C - ссылка http://www.w3schools.com/TAGS/att_meta_http_equiv.asp .

Гаурав Талвар
источник
Никто ничего не сказал о XHTML. <noscript> является абсолютно верным HTML 4.01 строгим.
Том
2
noscript также идеально подходит для XHTML 1.0 и XHTML 1.1. Он не может содержать метаэлементы, и его следует избегать в пользу прогрессивного улучшения, но он является частью языков.
Квентин