Итак, как же динамически осуществить запрос к серверу и главное получить от него вразуметельный ответ? Я надеюсь, все знают о существовании тэга <script>. Если не знаете, дальше можно не читать. Так вот, у него есть замечательный атрибут src. Значение этого атрибута - адрес к JavaScript-файлу, спросите Вы? Не совсем. Это адрес к файлу, который содержит JavaScript-код. Чувствуете разницу? Т. е. этим файлом может быть php-файл с php-кодом, который после обработки сервером выведет некий JavaScript, попутно сохраняя что-то в файлы, создавая cookies, изменяя БД и пр. Фактически программа, создающая новую программу.
Перед ознакомлением со следующим абзацем еще раз прочитайте предыдущий, осознайте о чем идет речь, покурите и возвращайтесь.
Итак, Вы вернулись, значит мы можем продолжить. На повестке дня еще несколько вопросов, но обо всем по порядку. Нам нужно динамически создавать <script> в документе. Отведем для него специальный блок:
<div id="_ajax" style="position: absolute; left: 0; top: 0; visibility: hidden"></div>
Стоит заметить, что нам понадобится передавать параметры php-скрипту, а функции URL-кодирования в JavaScript нет. Значит нужно создать нечто вроде таблицы кодирования (выводится элементарным php-скриптом и немного правится руками):
Дабы не забивать метр статьи, вкладываю файл.
Теперь напишем функцию, которая будет динамически создавать <script>. Функция принимает три параметра: адрес php-файла, массив имен передающихся переменных и массив значений этих переменных. Каждое значение мы будем URL-кодировать.
function LoadScript(addr,query,str) {
// составление строки запроса
for(k = 0; k < str. length; k++)
{
str2 = "";
// URL-кодируем (что такое chr смотрим во вложенном файле)
for(j = 0; j < str [k]. length; j++) str2 += '%' + chr [str [k]. charAt(j)] ;
// добавляем к концу запроса "переменная=значение"
addr += query [k] +"="+str2;
}
/*
* _ajax - идентификатор div-блока, кто забыл.
* Немного пляшем с бубном:
* Писать в HTML только <script></script> нельзя - IE ругается,
* поэтому добавляем любую строчку, например "MSIE... ".
* Также нельзя одной строкой написать "</script>",
* разбиваем на две строки.
*/
_ajax. innerHTML = "MSIE... <script></"+"script>";
/*
* даем JavaScript 10 мсек на осознание того, что _ajax изменен
* и назначаем атрибут src.
*/
setTimeout(
function()
{
scr = _ajax. getElementsByTagName("script") [0] ;
scr. language = "javascript";
if (scr. setAttribute) scr. setAttribute("src",addr);
else scr. src=addr;
}
,
10);
}
Теперь, чтобы выполнить запрос index. php? action=view&id=49, нужно вызвать функцию LoadScript() следующим образом:
LoadScript("index. php",Array("? action","&id"),Array("view","49"));
Для выполнения скрипта без параметров следует передать функции LoadScript() его адрес и два пустых массива.
Вы спросите, как выдать некий результат из php-скрипта? В документе, из которого запускаем LoadScript(), создаем блок
<divid="_hz"></div>
А в php-скрипте пишем
echo<<<a
_hz. innerHTML="работает!!!";
a;
И теперь остается еще один маленький вопросик. Дело в том, что все скрипты, вызывающиеся как <scriptsrc="address"></script> кэшируются браузером. Чтобы этого избежать, каждый php-скрипт начинаем с четырех строк:
Header("Expires: Mon, 26 Jul 1997 05: 00: 00 GMT");
Header("Cache-Control: no-cache, must-revalidate");
Header("Pragma: no-cache");
Header("Last-Modified: ". gmdate("D, d M Y H: i: s"). "GMT");