Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   jQuery - подгрузка html со скриптами (https://javascript.ru/forum/jquery/33190-jquery-podgruzka-html-so-skriptami.html)

sidorka 13.11.2012 15:46

jQuery - подгрузка html со скриптами
 
Столкнулся со следующей проблемой: при подгрузке html содержащего скрипты, эти скрипты не выполняются.

$.ajax(
                        {
                            dataType: "html",
                            url: "/loader/loader.php",
                            success:    function(code)
                            {
                                $(code).appendTo(elem);  
                            }  
                        }
                        );

Со стороны сервера выдается что-то вроде этого:
<!-- Comment -->
<script src="script1.js"></script>
<!-- /Comment -->

т.е. html со скриптами, и заголовок естесвенно:
header('Content-Type: text/html; charset=UTF-8');


Но вот беда - подгружаемый скрипт не выполняется.
Его код:
document.write('<script type="text/javascript" src="http://domain.com/jscript2.js"></script>');


Через файербаг видно, что содержимое elem-контейнера меняется - видны комменты, виден <script></script>, но в списке скриптов пусто - jscript1.js не попал в DOM.

Если использовать следующую конструкцию:
$(elem).html(code);


то после аякс-запроса, в DOM виден только коммент. Конструкция <script></script> отсутствует, но загруженный скрипт есть в списке файербага - script1.js, но вот второго - script2.js( script1.js его-то как раз и загружает) нет.

Т.е. что нужно: загружается страница, скрипт-загрузчик загружает script1.js, окруженный неким html, этот скрипт загружает script2.js. Вроде как каскадная загрузка скриптов в окружении html - предыдущий скрипт грузит последующие, отягощенные мусором html-окружения.

Как реализовать еще можно такой вариант? Или что поправить в моем?

Margarita 13.11.2012 16:54

document.write('<script type="text/javascript" src="http://domain.com/jscript2.js"></script>');

плохая идея

http://learn.javascript.ru/eval

sidorka 13.11.2012 17:12

Понимаю, что плохая, но содержимое ответа сервера на аякс-запрос может быть любым - чистый html, html со скриптами и тд - заранее неизвестно, что именно будет загружено и в каком виде - нужно то, что даст сервер, поместить в контейнер, если будут скрипты, то они должны выполниться.

Как заставить все это нормально встроиться в DOM и запустить скрипты, если они будут?

sidorka 13.11.2012 23:17

Как обойти document.write()?

Судя по всему document.write() выполняется только во время загрузки страницы. Мне же надо подгружать скрипты содержащие такую конструкцию в произвольный момент времени. Повлиять на получаемые с сервера данные нельзя - это рекламные блоки так грузятся.

nerv_ 13.11.2012 23:26

Margarita, причем тут eval?

nerv_ 13.11.2012 23:27

sidorka, jQuery.getScript()

sidorka 13.11.2012 23:42

Еще раз по порядку:
1. Встроенный в страницу загрузчик по готовности DOM подгружает первый скрипт.
2. Первый скрипт содержит document.write(), который должен добавить еще один скрипт.
3. Загружается и выполняется второй скрипт.

Вот как раз на втором этапе и выходит косяк - скрипт грузится, но отказывается работать, т.к. страница уже загружена и DOM доступен - document.write() работать не будет уже.

Единственное что приходит в голову - это загружать и парсить этот второй скрипт непосредственно на стороне клиента, чтобы обойти document.write().

Может еще какие варианты попроще есть?

getScript работает как надо - я пробовал, но это не то. Вся проблема в способе загрузки конечного скрипта - через document.write().

nerv_ 14.11.2012 13:15

Цитата:

Сообщение от sidorka
Может еще какие варианты попроще есть?

1. убрать из скрипта document.write()
2. грузить в iframe
3. парсить и eval'ить

sidorka 14.11.2012 23:51

1. Не могу - скрипты сторонние, со стороннего сервера.
2. Не могу - запрещено фреймами пользоваться.
3. Остается только это.

Нашел что-то похожее - LazyAdLoader, но еще не пробовал. Там вроде переопределяют как раз document.write на свой обработчик.

Deff 15.11.2012 01:47

Цитата:

Сообщение от sidorka
document.write('<script type="text/javascript" src="http://domain.com/jscript2.js"></script>');

Конструкции такого вида в подгружаемом контенте парсить и преобразовывать к виду
<script type="text/javascript" src="http://domain.com/jscript2.js"></script>

Вродь и eval'ить тогда незачем.


Часовой пояс GMT +3, время: 12:30.