Я изо всех сил старался быть пуристом с использованием методов Javascript/Ajax, гарантируя, что все Ajax-y поведение является улучшением базовых функций, а сайт также полностью работоспособен, когда Javascript отключен. Однако это вызывает некоторые проблемы.
В некоторых случаях DOM node должен отображаться только в том случае, если в браузере включен Javascript. В других случаях он должен быть видимым только при отключении. Возьмем, например, кнопку отправки в форме, которая имеет выпадающий список с обработчиком onchange, который автоматически отправляет (используя плагин формы JQuery):
<form method="post" action=".">
<label for="id_state">State:</label>
<select name="state" id="id_state" onchange="$(this.form).ajaxSubmit(ajax_submit_handler);">
<option value="AL">Alabama</option>
<option value="AK">Alaska</option>
</select>
<input class="with_js_disabled" type="submit" value="OK" />
</form>
и Javascript:
<script type="text/javascript">
$(document).ready(function()
{
$(".with_js_disabled").hide();
});
</script>
Когда Javascript включен, кнопка отправки не требуется (из-за обработчика onchange). Однако функция JQuery $(document).ready(и более прямая document.onload) вызывается только после того, как страница была полностью загружена и отображена - следовательно, сначала отображается кнопка отправки и появляется "вспышка", когда Javascript и на дисплее node установлено значение "none".
Я принял это как стоимость ведения бизнеса и не нашел пути вокруг него. Но есть ли техника, о которой я не знаю, что минимизирует эффект или даже полностью устранит ее?
EDIT:
Решение <noscript>
, упомянутое многими людьми ниже, кажется многообещающим, но не работает для меня в Safari. Однако предварительное предложение Престола прекрасно работает:
<body>
<script type="text/javascript">
document.body.className += ' has_js';
</script>
<!-- the rest of your page -->
</body>
В этом случае можно использовать стильный CSS:
body .js_enabled_only { display: none; }
body .js_disabled_only { display: block; }
body.has_js .js_enabled_only { display: block; }
body.has_js .js_disabled_only { display: none; }
Эта вторая строка предназначена только для справки и может (и должна) удаляться, чтобы избежать ситуаций, когда ваш элемент не должен отображаться: block. Аналогично, для других стилей отображения вам могут потребоваться разные варианты в третьей строке. Но это решение красиво и чисто, IMO, и в моих тестах полностью устраняет эффект мерцания.