如何消除渲染后的"闪烁"?

Dan*_*aab 16 html javascript ajax jquery dom

我已经尽力使用Javascript/Ajax技术成为纯粹主义者,确保所有Ajax-y行为都是基本功能的增强,而当Javascript被禁用时,该站点也完全正常运行.但是,这会导致一些问题.

在某些情况下,只有在浏览器中启用Javascript时,才能看到DOM节点.在其他情况下,它应该仅在禁用时可见.以表格上的提交按钮为例,该表单具有自动提交的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>
Run Code Online (Sandbox Code Playgroud)

和Javascript:

<script type="text/javascript">
    $(document).ready(function()
    {
        $(".with_js_disabled").hide();
    });
</script>
Run Code Online (Sandbox Code Playgroud)

启用Javascript时,不需要提交按钮(由于onchange处理程序).但是,JQuery的$(document).ready函数(以及更直接的document.onload)仅在页面完全加载和呈现后调用 - 因此,最初显示提交按钮,当Javascript为时,会出现"flash"执行并且节点的显示设置为"none".

我接受这是做生意的成本,并没有找到解决办法.但是有一种我不知道的技术可以最大限度地减少效果,甚至可以直接消除它吗?

编辑:

<noscript>下面很多人提到的解决方案似乎很有希望,但在Safari上并不适合我.然而Prestaul的第二个建议很有效:

<body>
    <script type="text/javascript">
        document.body.className += ' has_js';
    </script>
    <!-- the rest of your page -->
</body>
Run Code Online (Sandbox Code Playgroud)

然后可以使用直接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; }
Run Code Online (Sandbox Code Playgroud)

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

Pre*_*aul 10

如何组合这些解决方案:

<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>
Run Code Online (Sandbox Code Playgroud)

或者我更喜欢在正文中添加一个类(将<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>
Run Code Online (Sandbox Code Playgroud)


Pao*_*ino 5

对于与您的情况相同的情况,我通常会在<noscript>标签周围放置提交按钮.没有人建议它,所以我不确定这些部分是否被认为是不好的做法,但它是我使用的,它对我有用.

如果您只想在启用Javascript时显示节点,则可以在头部执行:

<noscript>
    <style type="text/css">
    .js-enabled { display: none; }
    </style>
</noscript>
Run Code Online (Sandbox Code Playgroud)

然后给任何只有Javascript的元素一类js-enabled.