1

我正在尝试使用显示模块模式来实现 Canvas 游戏。因此,我必须获取 Canvas DOM 元素及其上下文。这意味着在 DOM 完全加载之前不应执行该函数。因为我使用的是 jQuery,所以我只想将所有内容都放在 document.ready() 中,但这会与范围混淆。从这个例子可以看出:

var game = function ()
{
    var canvas = document.getElementById("canvas");

    var init = function ()
    {
    }

    return 
    {
        init: init
    }
}();

该函数必须是自动执行的,才能使返回正常工作。但是,由于它引用了画布,我不希望它立即加载。将自执行功能放入 document.ready() 会阻止我做

game.init();

我应该怎么办?

4

1 回答 1

0

如果您需要确保在特定 javascript 运行之前加载 DOM 元素,只需将 javascript 放在页面上该特定 DOM 元素之后:

<!DOCTYPE html>
<html>
<head>
    <title>Test</title>
    <script src="~/Scripts/jquery-1.9.1.js"></script>
    <script>
        $(function () {
            game.init();
        });
    </script>
</head>
<body>
    <div>
        <canvas id="canvas"></canvas>
    </div>
    <script>
        var game = function () {
            var canvas = document.getElementById("canvas");
            var init = function () {
                alert(canvas.id);
            };
            return {
                init: init
            }
        }();
    </script>
</body>
</html>

该页面是从上到下解析的,因此在 javascript 代码执行之前,canvas 元素将被加载到 DOM 中。

将您的 javascript 放在页面底部,就在结束 body 标记之前的另一个好处是,这可以改善您页面的感知加载时间。例如,如果您在页面的 head 部分中有复杂的 javascript,则必须先加载和解析该 javascript,然后才能呈现 body 部分中的任何 HTML 元素,因为页面是从上到下执行的。如果 javascript 很复杂,页面可能会显得加载缓慢。通过将它放在底部,您的 HTML 被渲染,然后您的 javascript 被加载和解析,这可以使您的页面的视觉部分显示得更快。 请参阅此处了解更多信息。

于 2013-06-25T16:28:45.633 回答