Существует несколько подходов к решению этой проблемы. Я не уверен, как ваш js связан с файлом шаблона, который вы упомянули, но следующие ответы применимы, если вы хотите выполнить файл JS, полученный в ответ на запрос XHR.
Соль 1 с использованием Eval:
xhr.onreadystatechange = function(){
if( xhr.readyState === 4 ){
eval ( xhr.responseText );
}
}
Sol 2 с использованием динамического впрыска
xhr.onreadystatechange = function(){
if ( xhr.readystate === 4 ){
var head = document.getElementsByTagName("HEAD")[0];
var script = document.createElement("SCRIPT");
script.text = xhr.responseText;
head.appendChild(script);
}
}
Это создаст элемент script в заголовке и установит для него текст ответа AJAX. При этом ваш JS будет проанализирован, но не будет выполнен. Если вы хотите, чтобы он выполнялся мгновенно, вы можете сознательно вызвать его в последней строке ответа, как этот:
//JS that you fetch
function A(){
}
// call A here so that it executes when this script is injected.
A()
Единственная проблема с вышеуказанными решениями - это то же ограничение домена, которое XHR приносит вам. Если вы хотите динамически включать скрипты из разных доменов, вы можете использовать что-то еще более простое:
var scr = document.createElement("SCRIPT");
scr.src = "dynamically set this to the external script source"
document.getElementsByTagName("HEAD")[0].appendChild(scr);
Существуют и другие подходы, такие как подход IFRAME, как упоминалось в других ответах.