Как проверить тег noscript + meta refresh в xHTML? - PullRequest
7 голосов
/ 31 августа 2010

Для посетителей, которые не поддерживают JavaScript, я перенаправляю их на определенную страницу - "js.html".

Для этого во всех моих файлах есть следующее:

<noscript>
<meta http-equiv="Refresh" content="0;URL=js.html" />
</noscript>

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

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

Ответы [ 3 ]

12 голосов
/ 01 сентября 2010

Вот что вы можете сделать:

Вставьте мета в вашу голову, но с обновлением, скажем, 2 секунды.И совсем рядом с этим размещается тэг SCRIPT, который удаляет это метаобновление.Таким образом, любой пользователь JS не будет перенаправлен:

<meta id="refresh" http-equiv="Refresh" content="10;URL=js.html" />
<script type="text/javascript">
    $('refresh').remove();
</script>

Возможно, браузер уже "упомянул" метаобновление.Таким образом, вы можете просто использовать JavaScript, чтобы написать открывающий и закрывающий комментарий HTML (включая открывающий тег сценария, чтобы закрыть тег сценария второго document.write) вокруг него:

<script type="text/javascript">
    document.write("<!-- ");
</script>
<meta http-equiv="Refresh" content="2;URL=js.html" />
<script type="text/javascript">
    document.write(' --><script type="text/javascript">');
</script>

Я мог бы успешно протестировать этот.

Просто намек на то, как я обращаюсь с не-js пользователями.У меня есть класс CSS под названием "JS", который я добавляю к любому элементу, который должен быть видимым только для пользователей JavaScript.Через javascript я добавляю css-файл, содержащий правило для класса «js», которое показывает каждый элемент с классом «js».Все ссылки (функции) разработаны так, что их можно использовать без JavaScript или в новой вкладке, щелкнув ссылку, удерживая нажатой клавишу CTRL.

3 голосов
/ 05 декабря 2012

Я перепробовал все предложения, которые смог найти для этого, включая ответы на этот вопрос, но ни один из них не сработал. Ответ Кау-Боя на этот вопрос у меня не сработал (так как он комментирует и метатег, и большую часть второго блока скрипта кода, затем js разбивает на ');, который он пытается интерпретировать послекомментарий закрыт, т.е. это происходит:

<script type="text/javascript">
    document.write("<!-- ");
</script>
<!-- <meta http-equiv="Refresh" content="2;URL=js.html" /><script type="text/javascript"> document.write(' -->
<script type="text/javascript">
    ');
</script>

Я черпал вдохновение из того, что он сделал , и собрал следующее, что, кажется, работает:

<script type="text/javascript">
    document.write('\x3Cscript type="text/javascript">/*'); 
</script>
<meta http-equiv="Refresh" content="0;URL=js.html" />
<script type="text/javascript">/**/</script>

По сути, если javascript включен, мы получаем 3 элемента сценария, один из которых - метатег внутри трюка комментария javascript, поэтому он не перенаправляется. Если javascript отключен, он видит только два элемента сценария, которые он игнорируети метаэлемент unmolested, поэтому он перенаправляет.

Примечание: если вы подаете свою страницу с типом контента application / xhtml + xml (что, вероятно, вам следует делать, если документ - xhtml), это сломает js в браузере, поскольку метод записи обычно отключается.

2 голосов
/ 01 сентября 2010

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

Одно предостережение: у HTML5 есть нерешенная проблема ( ISSUE-117 ), которая требует отмены noscript, поэтому возможно, что к тому времени, когда HTML5 достигнет последнего вызова, noscript больше не будет действительным в HTML5 .

...