2015-03-25 3 views
3

Я хочу загрузить knockout.js lib во время выполнения. Он загружается, но после того, как applyBindings() HTML-тег BODY <body></body> т.е. и бросает изображение исчезнетзагрузить knockout.js lib во время выполнения

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

Я просто не понимаю, почему элемент тело получает опустел.
P.S. : Он отлично работает, если я заранее добавлю knockout.js lib.

+0

'script.setAttribute (" https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0 /knockout-min.js ", url);' - это правильно? –

+0

извините. что было по ошибке, см. обновленный запрос –

ответ

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()», чтобы добавить скрипты в главный тег. Но это создавало новый documnet (DOM), поэтому весь HTML DOM оказался пустым. Ну, но я собираюсь принять твое как ответ, хотя. Как, это правильно в соответствии с вопросом. –

Смежные вопросы