Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.04.2012, 14:25
Аватар для razerxxx
Аспирант
Отправить личное сообщение для razerxxx Посмотреть профиль Найти все сообщения от razerxxx
 
Регистрация: 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. Причина: Ошибся
Ответить с цитированием
  #2 (permalink)  
Старый 16.04.2012, 11:49
Аспирант
Отправить личное сообщение для Le-mark43 Посмотреть профиль Найти все сообщения от Le-mark43
 
Регистрация: 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")
Ответить с цитированием
  #3 (permalink)  
Старый 16.04.2012, 13:28
Аватар для razerxxx
Аспирант
Отправить личное сообщение для razerxxx Посмотреть профиль Найти все сообщения от razerxxx
 
Регистрация: 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);

Вобщем я так пишу для краткости кода, если это не сильно влияет на читаемость. Думаю у неновичков такая форма записи не вызовет вопросов. Начинающим пожалуй так писать не стоит, и лучше разбивать все действия на части.
Ответить с цитированием
  #4 (permalink)  
Старый 16.04.2012, 13:31
Аватар для razerxxx
Аспирант
Отправить личное сообщение для razerxxx Посмотреть профиль Найти все сообщения от razerxxx
 
Регистрация: 05.10.2011
Сообщений: 85

Сообщение от Le-mark43 Посмотреть сообщение
может есть смысл разбить на составляющие:
1.сначала выполнить функцию ajax запроса и по Callback вставить контент куда надо. пусть будет <div id='html_from_ajax'>
2. собссно применить .find:
$('#html_from_ajax').find("#scripts_container")
Вобщем я думаю что нашел оптимальное решение. Как доберусь до скрипта, отпишу здесь ответ.
Ответить с цитированием
  #5 (permalink)  
Старый 16.04.2012, 14:15
Аспирант
Отправить личное сообщение для Le-mark43 Посмотреть профиль Найти все сообщения от Le-mark43
 
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 16.04.2012, 20:31
Аватар для razerxxx
Аспирант
Отправить личное сообщение для razerxxx Посмотреть профиль Найти все сообщения от razerxxx
 
Регистрация: 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
Ответить с цитированием
  #7 (permalink)  
Старый 16.04.2012, 20:41
Аватар для razerxxx
Аспирант
Отправить личное сообщение для razerxxx Посмотреть профиль Найти все сообщения от razerxxx
 
Регистрация: 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. Причина: ошибся
Ответить с цитированием
  #8 (permalink)  
Старый 16.04.2012, 22:56
Аспирант
Отправить личное сообщение для Le-mark43 Посмотреть профиль Найти все сообщения от Le-mark43
 
Регистрация: 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. Причина: дописка
Ответить с цитированием
  #9 (permalink)  
Старый 17.04.2012, 00:19
Аспирант
Отправить личное сообщение для Le-mark43 Посмотреть профиль Найти все сообщения от Le-mark43
 
Регистрация: 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.
Ответить с цитированием
  #10 (permalink)  
Старый 17.04.2012, 02:47
Аватар для razerxxx
Аспирант
Отправить личное сообщение для razerxxx Посмотреть профиль Найти все сообщения от razerxxx
 
Регистрация: 05.10.2011
Сообщений: 85

какая у тебя версий jquery? насколько я помню раньше - у меня тоже все отрабатывало, а теперь перестало. Сейчас у меня jquery 1.7.1
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где можно найти этот java код? 1man1 Общие вопросы Javascript 4 20.12.2011 23:12
где можно найти такое Александр х@к Элементы интерфейса 1 17.09.2011 21:23
Где найти документацию по js prowoke Оффтопик 2 17.07.2011 19:20
Browser Object Model, где найти для всех платформ? alta Javascript под браузер 2 09.10.2010 21:24
А где его найти? alt5000 ExtJS 3 06.10.2009 14:08