如何在启动之前引用javascript窗口元素

How can you reference to javascript window element before initianization?

本文关键字:引用 javascript 窗口 元素 启动      更新时间:2023-09-26

这个例子是从骨干目录演示应用程序中借来的https://github.com/ccoenraets/backbone-directory/blob/master/web/js/utils.js#L11

// The Template Loader. Used to asynchronously load templates located in separate .html files
window.templateLoader = {
    load: function(views, callback) {
        var deferreds = [];
        $.each(views, function(index, view) {
            if (window[view]) {
                deferreds.push($.get('tpl/' + view + '.html', function(data) {
                    window[view].prototype.template = _.template(data);
                }, 'html'));
            } else {
                alert(view + " not found");
            }
        });
        $.when.apply(null, deferreds).done(callback);
    }  
};

您可以使用字符串数组 [views] 和 [回调] 函数初始化它。

我的问题是,如果(据我所知(以前没有初始化,如何检查 window[view](单击上面的链接到代码中的确切位置(?如果我不准确,请在评论中写下。

如果我正确理解了你的问题,那么当你调用templateLoader.load时,你会传入 2 个参数; viewscallback.我们可以假设views是一个数组,因为我们随后使用 jQuery .each() 方法遍历该数组。对.each()的回调将传递与当前迭代对应的 views 数组的元素。该参数名为 view

因此view是存储在views数组中的任意值。然后,我们尝试查找具有与 view 的值匹配的标识符的 window 属性。如果view === "james"我们正在寻找window.james.

如果您查看该应用程序中的某些视图,您将看到它们的定义如下:

window.ContactView = Backbone.View.extend({
    // Some methods
});

所以ContactViewwindow 的属性,我们可以像下面这样调用templateLoader.load来加载该模板:

templateLoader.load(["ContactView"], someCallbackFn);

你可以看到它在main.js中实际被调用的位置。

因此,实际发生的是一堆window属性在各种其他文件中定义,然后由模板加载器加载,通过将标识符数组传递给它。