12.04.2012, 14:25
|
|
Аспирант
|
|
Регистрация: 05.10.2011
Сообщений: 85
|
|
$(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 мои утверждения в данном посте - не совсем верны. Ошибка немного в другом месте. Смотри далее...
Последний раз редактировалось razerxxx, 09.05.2012 в 01:34.
Причина: Ошибся
|
|
16.04.2012, 11:49
|
Аспирант
|
|
Регистрация: 08.02.2012
Сообщений: 34
|
|
еле догнал в чем вопрос, наверное в силу своей малоопытности...
и у меня возникло больше вопросов чем ответов.
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")
|
|
16.04.2012, 13:28
|
|
Аспирант
|
|
Регистрация: 05.10.2011
Сообщений: 85
|
|
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);
Вобщем я так пишу для краткости кода, если это не сильно влияет на читаемость. Думаю у неновичков такая форма записи не вызовет вопросов. Начинающим пожалуй так писать не стоит, и лучше разбивать все действия на части.
|
|
16.04.2012, 13:31
|
|
Аспирант
|
|
Регистрация: 05.10.2011
Сообщений: 85
|
|
Сообщение от Le-mark43
|
может есть смысл разбить на составляющие:
1.сначала выполнить функцию ajax запроса и по Callback вставить контент куда надо. пусть будет <div id='html_from_ajax'>
2. собссно применить .find:
$('#html_from_ajax').find("#scripts_container")
|
Вобщем я думаю что нашел оптимальное решение. Как доберусь до скрипта, отпишу здесь ответ.
|
|
16.04.2012, 14:15
|
Аспирант
|
|
Регистрация: 08.02.2012
Сообщений: 34
|
|
Сообщение от razerxxx
|
По другому можно было бы написать так:
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').
надо проверить... с кодом в селекторе-родителе.
Сообщение от razerxxx
|
Думаю у неновичков такая форма записи не вызовет вопросов. Начинающим пожалуй так писать не стоит, и лучше разбивать все действия на части.
|
полностью согласен, ведь я новичок
Последний раз редактировалось Le-mark43, 16.04.2012 в 14:27.
|
|
16.04.2012, 20:31
|
|
Аспирант
|
|
Регистрация: 05.10.2011
Сообщений: 85
|
|
Сообщение от Le-mark43
|
тогда уж:
var append_data = $(html_from_ajax).find("#scripts_container").html();
Но всеравно сомнения у меня, вроде для find нужен конкретный родитель, типа $("#div_main").find('#div').
надо проверить... с кодом в селекторе-родителе.
|
вот при такой записи в данном случае теги script будут вырезаны jquery.
Насчет $("#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
|
|
16.04.2012, 20:41
|
|
Аспирант
|
|
Регистрация: 05.10.2011
Сообщений: 85
|
|
собственно ответ на свой же вопрос:
Например в загруженной страничке есть тег 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. Решение моей задачи верное, но предполагаемая причина оказалась ошибочной, см. далее
Последний раз редактировалось razerxxx, 17.04.2012 в 14:39.
Причина: ошибся
|
|
16.04.2012, 22:56
|
Аспирант
|
|
Регистрация: 08.02.2012
Сообщений: 34
|
|
Сообщение от razerxxx
|
То же самое произойдет если мы получили какой-либо html средствами ajax.
|
Нееееее, ну неееееее.....
насчет 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() вот они да, никаких скриптов.
Последний раз редактировалось Le-mark43, 17.04.2012 в 00:21.
Причина: дописка
|
|
17.04.2012, 00:19
|
Аспирант
|
|
Регистрация: 08.02.2012
Сообщений: 34
|
|
еще как вариант, ну уж если ни в какую скрипты в теле не отрабатывают, хотя сами правильны, и в других местах работают, -> попробуй действовать скриптом в теле главного документа.
через 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
Последний раз редактировалось Le-mark43, 17.04.2012 в 00:25.
|
|
17.04.2012, 02:47
|
|
Аспирант
|
|
Регистрация: 05.10.2011
Сообщений: 85
|
|
какая у тебя версий jquery? насколько я помню раньше - у меня тоже все отрабатывало, а теперь перестало. Сейчас у меня jquery 1.7.1
|
|
|
|