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

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


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

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

+1
...
Рейтинг: 0 / 0
XmlHttpRequest - load JS functions
    #35692883
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
H.A.M.Вроде JSON как-то позволяет передавать функцииИ вправду, позволяет
Код: plaintext
1.
2.
3.
var a = "{f:function() { alert(777);}}"; // вот такая строка JSON пришла с сервера
var obj = eval("(" + a + ")");    // интерпретируем
obj.f();  // выполняем функцию
...
Рейтинг: 0 / 0
XmlHttpRequest - load JS functions
    #35692894
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
XmlHttpRequest - load JS functions
    #35692920
H.A.M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
Т.е. такая практика, как я понял, распространена и работает успешно, а это не может не радовать ;)
...
Рейтинг: 0 / 0
XmlHttpRequest - load JS functions
    #35692940
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос был "помощью AJAX загрузить JavaScript-функцию и заставить ее работать". Это можно и с помощью стандартного реквеста или как illion написала. Код выгладит приблизительно так:
Код: plaintext
1.
2.
3.
var sc=document.createElement("SCRIPT");
sc.src="урл_скрипта";
document.body.appendChild(sc);
Текст этого скрипта приблизительно как у illion .
ПС. Это тоже аякс между прочим.
...
Рейтинг: 0 / 0
XmlHttpRequest - load JS functions
    #35692962
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeПС. Это тоже аякс между прочим.Более того, это кроссдоменный аякс
...
Рейтинг: 0 / 0
XmlHttpRequest - load JS functions
    #35693475
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нема базара, я с вами согласен. Просто в свое время столкнулся с проблемой, подобной топикстартера. И лучшим решением оказалось не такое, кроссдоменное и т.д., а именно мое - "заточенное" под себя.
В любом случае, решать автору ... :)
...
Рейтинг: 0 / 0
XmlHttpRequest - load JS functions
    #35693912
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruckВ любом случае, решать автору ... :)
+1. Есть проблема, есть пути решения и есть, как всегда, обстоятельства проекта, автором не описанные.
...
Рейтинг: 0 / 0
XmlHttpRequest - load JS functions
    #35694130
H.A.M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проекта нету, просто разбираюсь с 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
XmlHttpRequest - load JS functions
    #35694172
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
H.A.M.И есть страничка:
Код: plaintext
1.
2.
<button id="callF2" onclick="ControlAndLoad('FunctionTwo'); FunctionTwo();">
        Call F2
      </button><br><br>
Так вот первый раз когда нажимешь - скрипт грузится, но: вызов FunctionTwo(); не отрабатывает. А уже потом (2-й, 3-й) нажимаешь - все ОК. Как это поправить?Конечно он не будет отрабатывать!
Скрипт ведь загружается асинхронно . И при первом нажатии, когда дело доходит до FunctionTwo();, ее ещё нет
...
Рейтинг: 0 / 0
XmlHttpRequest - load JS functions
    #35694176
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрите пример illion , сравнивайте, думайте...
...
Рейтинг: 0 / 0
XmlHttpRequest - load JS functions
    #35694219
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. вызов FunctionTwo() тоже должен грузиться. Кстати в этом случае функцию называют "каллбэк-функция". Да и саму такую разновидность аякса называют также. Можно ещё погуглить JSONP.
...
Рейтинг: 0 / 0
XmlHttpRequest - load JS functions
    #35694916
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серж, а ты, может, подрабатываешь у владельцев технологии JSONP? :) ;)

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

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



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

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

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


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