javascript - 如何消除渲染后 "flicker"?

标签 javascript jquery html ajax 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>

和 Javascript:

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

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

我已经接受这是开展业务的成本,但还没有找到解决方法。但是有没有一种我不知道的技术可以最大限度地减少影响,甚至完全消除它?

编辑:

<noscript>下面很多人提到的解决方案似乎很有希望,但在 Safari 上对我不起作用。然而,Prestaul 的第二个建议非常有效:

<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,并且在我的测试中完全消除了闪烁效果。

最佳答案

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

<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>

关于javascript - 如何消除渲染后 "flicker"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/463670/

相关文章:

javascript - 为什么 firebug 控制台中的 POST 没有显示任何内容,并且以下 jQuery 代码中的文件没有上传?

javascript - 使用 Angularjs 将动态数据从 Json 获取到 Html

javascript - 是否可以向列添加索引?订购它们

javascript - 在需要访问标题中的文本框的窗口中滚动

javascript - 为什么 React 会以不变的状态一遍又一遍地渲染我的组件?

javascript - 我无法使用变量设置 Electron 窗口的大小

php - 来自php的Ajax响应,在div内回显span?

javascript - 如何在 HTML 中而不是在 JavaScript 中使用 onChange() 来传递值?

html - 无法将页眉内容居中 - 导航和 Logo 合二为一

javascript - .babelrc 配置放在 package.JSON