Как сделать работающий динамический js?

307
06 июня 2017, 01:50

К примеру:

var scriptCode = '<script> function faf() { alert(123); }';
document.head.innerHTML = document.head.innerHTML + scriptCode;

При последующей попытке вызвать код функцию faf() пишет что функция не найдена. Как решить эту проблему? Сразу скажу что через внешний src, решение не подойдет.

Answer 1

document.getElementById('x').addEventListener("click", function() { 
  var tag = document.createElement('script'); 
  var scriptCode = document.createTextNode("function faf() { alert(123); };"); 
  tag.appendChild(scriptCode); 
  document.head.appendChild(tag); 
 
}); 
 
document.getElementById('y').addEventListener("click", function() { 
  faf(); 
});
<button id="x">Click to set function</button><br> 
<button id="y">Run function</button>

Answer 2

Если у вас уже есть кусок скрипта в строке и вам надо его выполнить - это тот самый момент когда надо вспомнить про существование eval:

var scriptCode = 'function faf() { alert(123); }';
eval(scriptCode);
faf();

Но тут есть тонкость: eval выполняет код в текущей области видимости, и если вы напишите так в некоторой функции - то faf станет локальной функцией, а не глобальной. Если вам нужна глобальная функция - надо либо запустить eval не напрямую:

window.eval('function faf() { alert(123); }');

Либо опубликовать faf в глобальном объекте после выполнения:

eval('function faf() { alert(123); }');
window.faf = faf;

Либо сразу записывать его туда:

eval('window.faf = function() { alert(123); }');

Также можно вспомнить про конструктор Function:

window.faf = new Function('alert(123)');
READ ALSO
Как отпавить дополнительные параметры dropezone.js?

Как отпавить дополнительные параметры dropezone.js?

Вот станица самого плагина проблема в том что запросом отправляется только картинка, а появилась необходимость отправлять дополнительные...

233
Динамическое добавление скрипта в iframe

Динамическое добавление скрипта в iframe

Есть iframe, генерирующийся динамическиЧто в нём - я не знаю, но доступ к нему через contentWindow есть

359
Как добавить префикс к url в Angular 2

Как добавить префикс к url в Angular 2

У меня есть приложение на Angular 2Все url на статику в этом приложении начинаются с / (что очевидно)

223
JavaScript Сортировка Списка

JavaScript Сортировка Списка

Нужно отсортировать список, через js/jquery, с использованием 1 селектора ul

322