Динамически добавляемый скрипт не будет выполняться

Я динамически добавляю скрипт GitHub gist. Если я добавил его в html до загрузки страницы, скрипт будет выполнен. Но если я попытаюсь добавить его на страницу после загрузки, он добавит скрипт на страницу, но не выполнит его.

вот как я добавляю его на страницу

HTML-код

<div id="results"></div>

в JavaScript

$('#results').click(function() {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = "https://gist.github.com/1265374.js?file=GetGists.js";
    document.getElementById('results').appendChild(script);
    console.log('script added');
});

вот живой пример

http://jsfiddle.net/guanome/JqB3g/3/

6 ответов


Итак, лучший вариант, который я вижу, - это переопределить (даже если только временно во время загрузки скрипта) document.write. Это своего рода работа, но так как вы не контролируете входящий код, я думаю, что это может быть лучшее, что у вас есть. Вы также не должны использовать document.write в любое время после загрузки страницы, но на всякий случай, я бы, возможно, прочесал ваш код.

здесь скрипка С рабочим раствором. Если вы хотите вернуться document.write после загрузки скрипта вы можете всегда проверяйте, если script.complete is true, в противном случае, слушать onload событие, которое должно позволить вам изменить document.write обратно. Я слишком ленив, чтобы в нем код в скрипку, но это будет код:

script.src = "...";
document.getElementById("results").appendChild(script);
if(script.complete) document.write = document._write;
else script.load(function() { 
    // Goes to the end of the run queue so that the script 
    // is guaranteed to run before this code
    setTimeout(function(){document.write = document._write;},0);
});

он выполняется, но он не будет работать, так как он использует document.write, который можно использовать только синхронно. Включить асинхронные document.write и измените свой скрипт следующим образом:

$('#results').click(function() {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = "https://gist.github.com/1265374.js?file=GetGists.js";
    document.write.to = {filename: script.src};
    document.getElementById('results').appendChild(script);
    console.log('script added');
});

Итак, в качестве альтернативы, я на самом деле просто наткнулся на библиотеку, которая, похоже, справится с этим для вас. Проверьте инжектор.js, и это должно сработать для вас.


ваш скрипт , вы просто не можете использовать document.пиши оттуда. Используйте предупреждение, чтобы проверить его и избежать использования документа.писать. Операторы вашего JS-файла с документом.write не будет выполняться, а остальная часть функции будет выполнена.


я смог выполнить это после нескольких часов попыток, включая все другие ответы здесь. Мой скрипт выглядит так:

<script src="https://somedomain.com/some.js"></scipt>

таким образом, eval() не был возможен.

я использовал jQuery.getScript () в конце, который извлекает файл js и выполняет его:

var $scriptTag = $('#myElement script');
var scriptSrc = $scriptTag.attr('src');
$.getScript(scriptSrc);

попробуйте $(this).добавить (скрипт) или $(this).html (скрипт)