我尽力成为 Javascript/Ajax 技术使用的纯粹主义者,确保所有 Ajax-y 行为都是基本功能的增强,同时在禁用 Javascript 时该网站也能正常运行。然而,这会导致一些问题。
在某些情况下,DOM 节点仅在浏览器中启用 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 执行时会发生“闪烁”。执行并且节点的显示设置为“none”。
我已经接受了这是做生意的成本,但还没有找到解决办法。但是否有一种我不知道的技术可以最大限度地减少影响,甚至彻底消除它?
EDIT:
The <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; }
第二行仅供参考,可以(并且应该)删除以避免元素不应该显示:块的情况。同样,对于其他显示样式,您可能需要第三行的不同变体。但在我看来,这个解决方案非常好而且干净,并且在我的测试中完全消除了闪烁效应。