2015-03-25 100 views
3

我想在运行时加载knockout.js库。它被载入但applyBindings后()的HTML body标签即<body></body> disappers并抛出在运行时加载knockout.js库在运行时

Uncaught TypeError: Cannot read property 'nodeType' of null

 var script = document.createElement("script"); 
     script.setAttribute("type", "text/javascript"); 
     script.setAttribute("src", "https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"); 
     document.getElementsByTagName("head")[0].appendChild(script); 
     ko.applyBindings(viewModel); 

我只是不明白,为什么body元素被清空。
P.S. :如果我事先添加knockout.js库,它可以很好地工作。

+0

'script.setAttribute(“https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0 /knockout-min.js“,url);' - 这是正确的吗? – 2015-03-25 06:39:38

+0

对不起。那是错误的,看到更新的问题 – 2015-03-25 06:46:07

回答

2

首先,您在使用ko时未确定脚本已经加载。你需要使用onload属性来传递回调

script.onload = function() { 
    ko.applyBindings(viewModel); 
} 

此外,淘汰赛抱怨,因为你调用applyBindings之前DOM已准备就绪。试着运行代码为DOMContentLoaded事件回调的一部分:

document.addEventListener("DOMContentLoaded", function() { 
    var script = document.createElement("script"); 
    script.setAttribute("type", "text/javascript"); 
    script.setAttribute("src", "https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"); 
    document.getElementsByTagName("head")[0].appendChild(script); 

    script.onload = function() { 
     ko.applyBindings(viewModel); 
    } 
}); 

Fiddle

+0

我解决了它。实际上,这不是问题,我使用'document.write()'将脚本附加到head标签。但是,它创建了新的文档(DOM),因此整个HTML DOM似乎都是空的。那么,但我会接受你的回答。因为,这个问题是正确的。 – 2015-03-25 10:33:07