如何消除渲染后“闪烁”?

2023-12-23

我尽力成为 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; }

第二行仅供参考,可以(并且应该)删除以避免元素不应该显示:块的情况。同样,对于其他显示样式,您可能需要第三行的不同变体。但在我看来,这个解决方案非常好而且干净,并且在我的测试中完全消除了闪烁效应。


如何结合其中一些解决方案:

<style type="text/javascript">
    .only-without-script {
        display: none;
    }
</style>
<noscript>
    <style type="text/javascript">
        .only-with-script {
            display: none;
        }
        .only-without-script {
            display: block;
        }
    </style>
</noscript>

或者我更喜欢在主体中添加一个类(将你的<script>标记在正文顶部,并且不使用 .ready 事件):

<head>
    <style type="text/javascript">
        body.has-script .something-not-ajaxy {
            display: none;
        }

        input.ajaxy-submit {
            display: none;
        }
        body.has-script input.ajaxy-submit {
            display: inline;
        }
    </style>
</head>
<body>
    <script type="text/javascript">
        document.body.className += ' has-script';
    </script>
    <!-- the rest of your page -->
</body>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何消除渲染后“闪烁”? 的相关文章

随机推荐