window.onload不等到dom准备好了

时间:2015-02-27 18:35:02

标签: javascript backbone.js ecmascript-6

尽管在window.onload函数中将代码包装在app.js中,但我仍然收到错误

Cannot set property 'innerHTML' of undefined

通过在索引路径上创建HomeView来触发。 HomeView的渲染功能尝试将模板设置为渲染函数

中el的innerHtml
this.el.innerHTML = this.template();

当我使用一些ES6时,此代码也会使用babeljs进行传输并放入一个文件(bundle.js)。

在尝试window.onload函数之前,我使用ES6样式dom准备将代码包装在app.js中

$(() => {

});

我怎样才能真正确保dom准备就绪,或者我应该如何将HomeView的el设置为特定的dom节点?

app.js

window.onload = function() {
    window.myRouter = new MyRouter();
    $(window).on("hashchange", myRouter.hashChange);     
    Backbone.history.start({pushState: true})

}

main.js

export class MyRouter extends Router {

    constructor(){
        this.routes = {
            '': 'index'
        }
        this._bindRoutes();
    }
    index(){
        this.loadView(new HomeView());
    }

HomeView

export class HomeView extends View {
    constructor(){

        $("body").html(this.el);
        this.template = _.template($('#main-template').html());

        this.render();
        super();


    }

    render(){

        this.el.innerHTML = this.template();

2 个答案:

答案 0 :(得分:0)

使用

$(document).ready

而不是

window.onload

答案 1 :(得分:0)

问题不在于onload。您只是在存在之前访问该属性。

您永远不会在this.el构造函数中设置HomeView

$("body").html(this.el);
this.template = _.template($('#main-template').html());
this.render();

您正在拨打访问this.render()的{​​{1}},但您在这三行中的哪个位置设置了this.el.innerHTML?不通。

如果this.el应由this.el设置,那么您必须先调用父构造函数 才能访问View

this