| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Варианты подгрузки данных |
| Автор: diam 7.4.2005, 09:28 | ||
| Здраствуйте. Опять возвращаюсь к старой теме: подгрузка данных без перезагрузки страницы. Дано: 1. Большая и тяжёлая страница, с кучей-кучей объектов js, картинок и текста. 2. Узкий канал. Задача: Подгружать данные в виде кода JavaScript без перезагрузки страницы. Я вижу следующие варианты решения данной задачи: 1. Метод appendChild ( или replaceChild, что бы не плодить дополнительных скриптов). Суть в следующем: а) создаём новый элемент типа script б) задаём его свойства type = text/javascript и src = <откуда_грузить> в) говорим appendChild(этот_элемент).
На стороне сервера (/upload) генерируется текст alert('Вы передали: <%=param%> = <%=value%>'); для каждой переданной пары param=value; Таким образом, параметры передаются методом GET. Работает это в IE 5+(младше не проверял), Gecko, Opera (7.5+, младше не проверял). В нашем случае выскочит окошко с надписью "Вы передали: param1 = value1". Не работает: в Konqueror (что есть большой минус, ИМХО). На мой взгляд, метод имеет много плюсов, например то, что можно передавать любые данные: текст, объекты JS, в общем, любые типы данных JS. 2. IFRAME. Суть метода: делаешь невидимый IFRAME, в который при необходимости заливаешь данные перезагрузкой оного, потом, после загрузки, достаёшь из него полученный текст, eval() его и вот тебе код JS. Но, на мой взгляд, тут есть много минусов: а. Изменяется история браузера. б. Появляется кнопочка <back> в браузере, при нажатии на которую Вы попадаете на свою же страницу в. Во всяких ИЕ щелчки раздаются. г. Работает дольше, чем первый метод. Но плюсы в том, что работать будет в гораздо большем числе браузеров, чем в методе 1. Может быть и можно как-то избавиться от минусов а) и б), но я пока не знаю как. Но вот от минусов в) и г) точно не избавиться. ------------------------------------------------ Как решить задачу? Можно ли написать API в виде объекта JS, который позволит её решать на любом браузере (эх, мечты, мечты... В общем, To Be or Not to Be, that is question. :^) |
| Автор: DDT 7.4.2005, 09:40 |
| Я как раз ищу что-то подобное. Ты прямо к чаю У меня вопрос по первому способу: что должно подгружаться файл JavaScript или можно, например, РНР |
| Автор: diam 7.4.2005, 09:46 |
| У меня подгружается текст, сгенерированный psp. Да, можно использовать php. Вот только в psp у меня установлено req.content_type = "text/javascript" А в php, по моему, контент всегда тот, что указан в апаче (то есть, по дефолту, "text/html"); но это не означает, что работать не будет. Работает и под php. |
| Автор: diam 7.4.2005, 14:07 | ||
| Немного меняю метод 1. Дело в том, что если запрос будет одинаковым, например, постоянно будет запрашиваться "/upload/?", то Opera и IE будут кэшировать запрос. А это не есть гуд, нам оно не надо. Избежать сие можно лишь каждый раз меняя адрес добавляемого элемента <script>. Адрес, конечно, мы менять не будем, но вот один параметр введём как обязательный и будем постоянно его изменять(он должен быть уникальным) (смотрим класс clUploadData(), элемент this.callID):
Есть ещё одно НО. Запрос передаётся методом GET, а посему имеет ограничения - объём передаваемых данных в запросе - 4 килобайта. Поэтому данные большего размера придётся или бить, или извращаться ещё каким-либо образом (например, открывать новое окошко с предложением ввести картинку |
| Автор: Sardar 8.4.2005, 00:57 |
| Зовётся это дело ajax по моему, слышал что готовые либы есть, сам не использовал. Большая проблема это выбор минимальных требований. Например в Опера 6 метод appendChild не работает. Если веб проект использует подобные фишки то не стоит оборачиватся на старые браузеры, себе дороже. Лучше вообще заюзать обьект XMLHTTPRequest, который поддерживается ИЕ6, Мозилла и Опера 8, а на всех остальных забить. Плюсы: скорость, простота, большая "мощь". |
| Автор: Guest 8.4.2005, 06:46 |
| Sardar, а IFRAME? Может, кто-то написал кроссбраузерный объект, опирающийся на IFRAME? |
| Автор: DDT 8.4.2005, 09:36 | ||||||||
файл по адресу: http://msc/?sid=3&ssid=3:
1.js:
При выполнении файла http://msc/?sid=3&ssid=3 выдается сообщение ААА, а за ним следующее:
И выдается страница
Почему не удается открыть узел? |
| Автор: DDT 8.4.2005, 10:24 | ||||
| Все, вопрос сниямается. Разобрался. Создал в документе форму с именем form. Строку:
Заменил на:
Все пошло. И без фреймов. |
| Автор: Aliance 8.4.2005, 12:29 | ||
А NN? DDT Пользуйтесь клавишей code, немного подредактировал Ваш пост. |
| Автор: Gregof 11.4.2005, 13:30 |
| http://dklab.ru/chicken/nablas/41.html |
| Автор: diam 11.4.2005, 18:25 |
| Для себя решил, что через год-полтора можно будет использовать XMLHttpRequest. Только потому, что последний поддерживает метод POST. Вот только 7-ю оперу использует сейчас ну очень много народа. |
| Автор: diam 12.4.2005, 07:31 | ||
| Метод подразумевает подгрузку методом GET. Это несёт с собой несколько минусов: 1. В логах запросов Apache будет видно, что запрашивают. Например, вот мой лог запроса:
2. Объём передаваемых данных не может превышать 4096 байтов (это спецификация HTTP). Но и имеет один плюс (несомненный): работает в Opera7, Gecko, IE5. А это большинство браузеров, ИМХО. |
| Автор: Aliance 25.5.2005, 16:52 | ||
|
| Автор: Diesel Draft 3.9.2005, 09:01 | ||
можно использувать и другой метод
|
| Автор: Aliance 3.9.2005, 11:39 |
| Diesel Draft ActiveX работает только в среде JScript, так что только его использование преведет к отсутствию кроссбраузерности |
| Автор: ChPuK 9.3.2007, 08:32 |
| diam, спасибо прочел твой пост! у меня таже проблема была разобрался сразу |