Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / XmlHttpRequest - load JS functions / 21 сообщений из 21, страница 1 из 1
04.12.2008, 01:35
    #35692130
H.A.M.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
У меня вопрос по поводу возможности с помощью AJAX загрузить JavaScript-функцию и заставить ее работать. Такое вообще возможно? Мне нужно, например, подгрузить в <span> через innerHTML пару контролов - это без проблем. Пускай там кнопка, а у нее onclick прописана ф-я, которую браузер еще не знает - т.е. изначально эта ф-я не присутствовала на странице. Но я знаю, где она, а как загрузить - не знаю. Не знаю даже можно ли.

Зачем такое нужно? Например, у меня есть 50 диалогов на странице (ну, например). Все они вместе займут 50 Mb. И моя страница будет грузиться 20 минут, хотя пользователь увидит только 5 диалогов... С AJAX я делаю 1 шаблон и гружу в него что нужно... Но обрабочики кнопок, валидация - как подгрузить это? Вроде JSON как-то позволяет передавать функции, но пример я немогу найти - везде показывают как из PHP перегнать массив строк, это я и без JSON прекрасно могу...


--------------------
We are there
--------------------
...
Рейтинг: 0 / 0
04.12.2008, 02:15
    #35692150
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
Неважно, зачем ... часто надо просто подгружать динамический контент, который должен работать на усмотрение девелопера.
Если надо установить событийные функции, то не следует устанавливать их в тэге элемента. Надо после страничного контенка в скрипте описать нужную функцию, к примеру:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
<span id="our_span">...</span>
...
<script type="text/javascript">
...
    document.getElementById("our_span").onclick = function() {
        ...
    }; //без завершающей точки с запятой грузиться не будет - выдаст ошибку
...
</script>
...
Рейтинг: 0 / 0
04.12.2008, 02:26
    #35692156
H.A.M.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
Подождите, вот это:
Код: plaintext
<span id="our_span">...</span>
у меня уже в окошке, и там только кнопка.
А вот это:
Код: plaintext
1.
2.
3.
4.
<script type="text/javascript">
function Init(){
  alert('!');
}
</script>
Пока еще лежит на сервере. Вот я его получил с сервера (этот скрипт вообще может быть сгегерирован, но я точно знаю, что в нем будет ф-я с именем Init(), например).
И вот в xhr.doPost:load(text) я пишу:
Код: plaintext
byId('our_span').innerHTML = text; Init();
Тут text - это то, что прислал сервер. И Init() отработает?
А какая вообще best practise в таких случаях? Как я уже придумал, я заведу себе span невидимый и буду в него грузить ф-ии, которые мне нужны. Ниче так, стремно тока как-то :D

И что теперь
--------------------
We are there
--------------------
...
Рейтинг: 0 / 0
04.12.2008, 04:12
    #35692177
illion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
помоему в этом случае лучше вообще не трогать XMLHttpRequest.
Допустим, есть скрипт generate.php, который отдает ответ такого вида:
Код: plaintext
1.
2.
3.
4.
function Init(){
  alert('!');
}
Init();
Тогда не шлем никаких аякс-запросов, а просто динамически добавляем в документ элемент script и назначаем ему src = 'generate.php'.
...
Рейтинг: 0 / 0
04.12.2008, 09:09
    #35692350
Ex_Soft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
H.A.M.
с помощью AJAX загрузить JavaScript-функцию и заставить ее работать

тынць , тынць , тынць ?
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
04.12.2008, 09:22
    #35692373
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
illion,

+1
...
Рейтинг: 0 / 0
04.12.2008, 11:53
    #35692883
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
H.A.M.Вроде JSON как-то позволяет передавать функцииИ вправду, позволяет
Код: plaintext
1.
2.
3.
var a = "{f:function() { alert(777);}}"; // вот такая строка JSON пришла с сервера
var obj = eval("(" + a + ")");    // интерпретируем
obj.f();  // выполняем функцию
...
Рейтинг: 0 / 0
04.12.2008, 11:55
    #35692894
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
illion, я с тобой не согласен ... а если подгружаемых страниц, а значит, и скриптов, десятки? Да и не хочу я, чтобы все это оседало в кеше?

H.A.M., подгружай себе скриптов сколько хочешь - у меня сайт на такой подгрузке сделан, все отлично работает; вложенность, когда из подгруженной странички динамически подгружается еще страничка, достигает пяти-шести уровней, да к тому же работа с данными, постоянная динамическая подгрузка списков и таблиц.

Единственное, я использую не просто подгрузку скриптов, а подгрузку с выполнением:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function updateContent(_action) {
	request.open("POST", url, true);
	request.onreadystatechange = behaviorContent;
	request.send(null);
}
function updateContentWithData(_data) {
	request.open("POST", url, true);
	request.onreadystatechange = behaviorContent;
	request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	request.send(urlEncodeData(_data));
}
function behaviorContent() {
	if (request.readyState ==  4 ) {
		_message = request.responseText;
		var active_div = "main_body";
		//тут обработка на предмет прихода ошибки с сервера
		document.getElementById(active_div).innerHTML = _message;
		run_script(document.getElementById(active_div));
	}
}
function run_script(_div) {
	var divContent = _div.childNodes;
	for (var i =  0 ; i < divContent.length; i++) {
		requestItem = divContent.item(i);
		if (requestItem.tagName)
			if (requestItem.tagName.toUpperCase() == 'SCRIPT') eval(requestItem.text);
		else run_script(requestItem);
	}
}
Функции, естественно, обрезаны для компактности. И я использую для вставки контента только DIV.
...
Рейтинг: 0 / 0
04.12.2008, 12:01
    #35692920
H.A.M.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
Спасибо!
Т.е. такая практика, как я понял, распространена и работает успешно, а это не может не радовать ;)
...
Рейтинг: 0 / 0
04.12.2008, 12:06
    #35692940
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
Вопрос был "помощью AJAX загрузить JavaScript-функцию и заставить ее работать". Это можно и с помощью стандартного реквеста или как illion написала. Код выгладит приблизительно так:
Код: plaintext
1.
2.
3.
var sc=document.createElement("SCRIPT");
sc.src="урл_скрипта";
document.body.appendChild(sc);
Текст этого скрипта приблизительно как у illion .
ПС. Это тоже аякс между прочим.
...
Рейтинг: 0 / 0
04.12.2008, 12:10
    #35692962
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
ShSergeПС. Это тоже аякс между прочим.Более того, это кроссдоменный аякс
...
Рейтинг: 0 / 0
04.12.2008, 13:54
    #35693475
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
Нема базара, я с вами согласен. Просто в свое время столкнулся с проблемой, подобной топикстартера. И лучшим решением оказалось не такое, кроссдоменное и т.д., а именно мое - "заточенное" под себя.
В любом случае, решать автору ... :)
...
Рейтинг: 0 / 0
04.12.2008, 15:17
    #35693912
illion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
IDVsbruckВ любом случае, решать автору ... :)
+1. Есть проблема, есть пути решения и есть, как всегда, обстоятельства проекта, автором не описанные.
...
Рейтинг: 0 / 0
04.12.2008, 16:01
    #35694130
H.A.M.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
Проекта нету, просто разбираюсь с JS, учу помаленьку.
2illion:
способ прост и понятен, но! Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function FunctionTwo()
{
  alert('I am FunctionTwo!');
}

function ControlAndLoad(src)
{
  var head = document.getElementById('theHead');  
  var scripts = head.getElementsByTagName('script');
  for(var i =  0 ; i < scripts.length; i++)
  {
    if(scripts[i].src == 'http://localhost:8084/examples/js/' + src + '.js')
    {
      return;
    }
  }
  var script = document.createElement('script');
  script.src = 'http://localhost:8084/examples/js/' + src + '.js';
  head.appendChild(script);
  return;
}

И есть страничка:
Код: plaintext
1.
2.
<button id="callF2" onclick="ControlAndLoad('FunctionTwo'); FunctionTwo();">
        Call F2
      </button><br><br>
Так вот первый раз когда нажимешь - скрипт грузится, но: вызов FunctionTwo(); не отрабатывает. А уже потом (2-й, 3-й) нажимаешь - все ОК. Как это поправить?
--------------------
We are there
--------------------
...
Рейтинг: 0 / 0
04.12.2008, 16:10
    #35694172
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
H.A.M.И есть страничка:
Код: plaintext
1.
2.
<button id="callF2" onclick="ControlAndLoad('FunctionTwo'); FunctionTwo();">
        Call F2
      </button><br><br>
Так вот первый раз когда нажимешь - скрипт грузится, но: вызов FunctionTwo(); не отрабатывает. А уже потом (2-й, 3-й) нажимаешь - все ОК. Как это поправить?Конечно он не будет отрабатывать!
Скрипт ведь загружается асинхронно . И при первом нажатии, когда дело доходит до FunctionTwo();, ее ещё нет
...
Рейтинг: 0 / 0
04.12.2008, 16:12
    #35694176
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
Смотрите пример illion , сравнивайте, думайте...
...
Рейтинг: 0 / 0
04.12.2008, 16:22
    #35694219
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
Т.е. вызов FunctionTwo() тоже должен грузиться. Кстати в этом случае функцию называют "каллбэк-функция". Да и саму такую разновидность аякса называют также. Можно ещё погуглить JSONP.
...
Рейтинг: 0 / 0
04.12.2008, 22:21
    #35694916
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
Серж, а ты, может, подрабатываешь у владельцев технологии JSONP? :) ;)

H.A.M., юзай jQuery и будет тебе счастье - и аджакс, и скрипты, и джейсонп - все в одном флаконе.
...
Рейтинг: 0 / 0
04.12.2008, 22:36
    #35694932
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
IDVsbruck,

Не хотел я этого слова (JSONP) писать. Знал ведь - прицепишься. Ну да, нравится мне эта штука. Обрати внимание - не я первый начал, а illion, хотя она слово явно и не написала и м.б. ещё меня и обругает, когда проснётся или когда у них там день. Хоть бы разницу в часах написала что-ли.
...
Рейтинг: 0 / 0
05.12.2008, 00:28
    #35695021
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
:) :) :) Чтобы ныкаться от нашей злой модераторши?
...
Рейтинг: 0 / 0
05.12.2008, 00:41
    #35695027
illion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XmlHttpRequest - load JS functions
H.A.M.,
вызов функции при таком раскладе должен находиться в составе подгружаемого скрипта, иначе не подгадаешь момент, когда скрипт уже подгрузился. Согласна, это не всегда удобно, и в тогда лучше использовать способы, основанные на обычных ajax-подгрузках и последующем eval. Если передается только скрипт (некий набор функций), то можно сразу применять eval к responseText, не вставляя его в дивы и спаны, а если есть еще некие вспомогательные данные, то использовать пример IDVsbruck.



ShSergeОбрати внимание - не я первый начал, а illion
так я специально для тебя старалась, думала "вот Серж почитает, порадуется". Ссылку на тебя было лень искать, особенно местным поиском - вообще атас.

ShSergeХоть бы разницу в часах написала что-ли.
+12GMT. Впереди планеты всей :-). Хотя еще где-то есть в Океании на островах +13GMT, но там я еще не была. Пока что.

IDVsbruck:) :) :) Чтобы ныкаться от нашей злой модераторши?
ныкаться бесполезно, я ж все равно нагряну! :-)))
П.С. а чё это я "злая"? Хоть убей - не припомню, когда я успела тебе на хвост наступить... :)
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / XmlHttpRequest - load JS functions / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]