Не могу вставить js программно, если он использует document.write - PullRequest
2 голосов
/ 06 января 2012

Я пытаюсь вставить файлы js программно, используя jquery и что-то вроде этого:

var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = 'http://someurl/test.js';
$('body').append(script);

Работает нормально, если test.js содержит alert или какой-то простой код, работает нормально, но если файл test.js содержит document.write, а файл, включающий js, размещен в другом домене, чем test. js (или localhost), ничего не происходит, и firebug показывает ошибку:

вызов метода document.write () из асинхронно загруженного внешнего скрипт был проигнорирован.

Если test.js и включающий его файл размещены в одном домене, в chrome он все равно не будет работать, но в Firefox document.write выполняется нормально, но страница остается «загруженной» навсегда, и сниффер показывает запрос все файлы со статусом «в ожидании».

Какие еще методы можно включить в файлы js программным способом?

Ответы [ 4 ]

4 голосов
/ 06 января 2012

используйте innerHTML вместо document,write.

и используйте следующий код для регистрации скрипта,

(function() {
    var jq = document.createElement('script');
    jq.type = 'text/javascript';
    jq.async = true;
    jq.src = 'http://someurl/test.js';
    var s = document.body.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(jq, s);
})();
1 голос
/ 06 января 2012

То, что вы хотите сделать, это динамически вставить элемент <script> DOM в элемент HEAD. У меня был этот сценарий без дела. Например, это состояние гонки, но вы поняли идею. Звоните load_js с URL. Это сделано для многих современных API, и это ваш лучший друг для междоменного JavaScript.

<html>
    <head>
        <script>
            var load_js = function(data, callback)
            {
                    var head = document.getElementsByTagName("head")[0];

                    var script = document.createElement("script");
                    script.type = "text/javascript";
                    script.src = data;
                    head.appendChild(script);

                    if(callback != undefined)
                            callback();
            }

            load_js("http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js");

            setTimeout(function() {
                $('body').html('loaded');
            }, 1000);
        </script>
    </head>

    <body></body>
</html>
1 голос
/ 06 января 2012

Document.write предназначен ТОЛЬКО для синхронных задач, когда загружается html (в самый первый раз), и никогда для асинхронных задач, подобных той, которую вы пытаетесь выполнить.

0 голосов
/ 06 января 2012

В вашем подходе к вставке JavaScript нет ничего плохого.document.write просто немного отстой.Это только для синхронных задач, поэтому помещение document.write в отдельный файл скрипта вызывает проблемы.Люди все равно делают это.Решение, которое я видел чаще всего, состоит в том, чтобы переопределить document.write.

...