$(document).append(data) где найти data ?
$('body').html($(html_from_ajax).html()) При таком подходе, если контент получен через ajax вызов, не выполняется javascript в нем находящийся. После гугления нашел способ: $(document).append($(html_from_ajax).find("#scripts_container")); $('body').html($(html_from_ajax).html()) Поскольку этот контент может вызываться периодически - будет все время выполняться $(document).append($(html_from_ajax).find("#scripts_container")), что вобщемто мне и нужно (скрипт каждый раз заново инициализируется). Но куда записывается этот контент. Где его найти, затирается ли старое значение? Или быть может, кто подскажет более изящное решение данного вопроса - При очередной загрузке страницы - выполнение javascript в ней находящегося? p.s мои утверждения в данном посте - не совсем верны. Ошибка немного в другом месте. Смотри далее... |
еле догнал в чем вопрос, наверное в силу своей малоопытности...
и у меня возникло больше вопросов чем ответов. 1. ты вообще уверен, что код, который ты вставляешь, вообще вставляется? зная контент, можно это проверить (firebugом например), воспользовавшись поиском. 2. append($(html_from_ajax).find("#scripts_container" )) от такого я маненько в шоке, мне всегда казалось, что DOM сначала сформироваться должен, только потом на него подобные методы можно навесить, ну чтож... запомним такой подход. 3. $(html_from_ajax) что это такое? если ссылка на функцию, которая выполняет Ajax запрос, то что в ней .find("#scripts_container") cможет найти? ведь функция как минимум не объект DOM. может есть смысл разбить на составляющие: 1.сначала выполнить функцию ajax запроса и по Callback вставить контент куда надо. пусть будет <div id='html_from_ajax'> 2. собссно применить .find: $('#html_from_ajax').find("#scripts_container") |
1. Код вставляется - так как выполняется яваскрипт.
3. html_from_ajax - строка содержащая html код, которая получена от сервера через ajax запрос. Например: $.get('server_url', {key1: data1}, function(html_from_ajax) { console.log(html_from_ajax) }) 2. Поэтому можно писать так: append($(html_from_ajax).find("#scripts_container" )) По другому можно было бы написать так: var append_data = $(html_from_ajax).find("#scripts_container"); $(document).append(append_data); Вобщем я так пишу для краткости кода, если это не сильно влияет на читаемость. Думаю у неновичков такая форма записи не вызовет вопросов. Начинающим пожалуй так писать не стоит, и лучше разбивать все действия на части. |
Цитата:
|
Цитата:
var append_data = $(html_from_ajax).find("#scripts_container").html(); Но всеравно сомнения у меня, вроде для find нужен конкретный родитель, типа $("#div_main").find('#div'). надо проверить... с кодом в селекторе-родителе. Цитата:
|
Цитата:
Насчет $("#div_main").find('#div'). попробуй так: var test_div = $("<div><div class="wrapper"><div id='find_me'>i am here</div></div></div>") console.log(test_div.find("#find_me").text()); // должно вывести i am here |
собственно ответ на свой же вопрос:
Например в загруженной страничке есть тег script, - если сделать так: console.log($('body').html()); - то мы получим html докумена в котором будут и теги sript. Если же мы сделаем так: var new_html = $("<div><script>alert('it script')</script></div>"); console.log(new_html.html()); то не увидим в выводе тегов script. Вобщем во втором случае jquery выразает тэги script. То же самое произойдет если мы получили какой-либо html средствами ajax. Моей задачей было получить новую страницу с помощью аякс загрузить ее в текущую страницу и выполнить все скрипты которые находятся на загруженной странице. $.get('some_url.html', {key: value}, function(new_html) { var wrapper = document.createElement('div'); wrapper.innerHTML = new_html; new_html = wrapper; $('body').html($(new_html).html()); }) Вот такой хак позволяет сделать так чтобы jquery не вырезал теги script. P.S. Решение моей задачи верное, но предполагаемая причина оказалась ошибочной, см. далее |
Цитата:
насчет concole.log не в курсе, но если ты вставляешь в див методом html(ajax_строка), к твоему примеру: $.get('some_url.html', {key: value}, function(new_html) { var wrapper = document.createElement('div'); wrapper.innerHTML = new_html; document.body.appendChild(wrapper); }, html); все там обрабатывается, все скрипты, которые в теле, ничего jquery не вырезает. Специально проверял, у меня Аjax запрос грузит PHP скрипт у которого в теле еще 4 Аjax запроса на другие php, работает через $('#some_div').html(response); специально менял на чистый Javascript для innerHTML, все работает, никаких изменений! даже создает и грузит все это дело в созданный див. может ты спутал с функцией Load(), или text() вот они да, никаких скриптов. |
еще как вариант, ну уж если ни в какую скрипты в теле не отрабатывают, хотя сами правильны, и в других местах работают, -> попробуй действовать скриптом в теле главного документа.
через livequery или delegate. допустим: ajax_строка: <div><div class="wrapper"><div id='find_me'>i am here</div></div></div> в теле главного документа: <script>$(".wrapper").livequery(function(){ a=$(".wrapper").find('#find_me').text(); alert(a); //i am here });</script> но это конечно применимо токмо в том случае, если у тебя скрипты в теле ajax_строки примерно одинаковые, то бишь какие нить однородные функции. суть: вешаешь эти функции через livequery, они срабатывают сразу при обнаружении Wrapper. естессно, livequery надо скачивать. удобно тем, что для неё не надо указывать обработчик, как в случае с delegate. важна только пара объект.метод, потому при описанной декларации, функция срабатывает СРАЗУ, при появлении объекта в DOM |
какая у тебя версий jquery? насколько я помню раньше - у меня тоже все отрабатывало, а теперь перестало. Сейчас у меня jquery 1.7.1
|
Часовой пояс GMT +3, время: 20:37. |