![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| Greendrake |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 364 Регистрация: 14.7.2005 Репутация: нет Всего: 6 |
В развитие вопроса, затронутого вот в этой теме.
Итак дано: нужен некий объект, имеющий для начала метод GETrequest(url,task), в котором task - функция, которую нужно выполнить после прихода ответа на запрос урла url по XMLHttpRequest. Потом к этому объекту добавим запросы POST для форм и т. п., но щас это не суть, просто чтоб пояснить зачем вообще понадобился именно объект. Вопросы возможного неответа сервера на запрос щас не парят, допустим что с этим проблем нет. Вот моя попытка это реализовать:
Ругается, зараза, на строчку 9 - типа в том контексте this это нифига не RequestObject, и шо це таке this.XMLHttpRequest.readyState она не знает... Как быть подскажите плиз? Это сообщение отредактировал(а) Greendrake - 24.2.2006, 23:27 |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Да, всё правильно, this в функции должен указывать на XMLHttpRequest т.к. это его onreadystatechange метод По коду, а что ты будешь делать если ответ придёт не 200? повиснешь? Накидаю свой вариант, покажу -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Sardar |
|
||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Вот так получилось, завтра припаяю туда XSLT трансформации.
По теме здесь только performXMLHttpRequest и requestGet. Те кто работал с POST запросами вспомнят что нужно ещё установить заголовок Content-type, те кто работал с Оперой знают что ещё пару шаманских движений нужно сделать. Писать это всё лень, в поиск, но именно поэтому я пишу две разные функции, performGetRequest и performPOSTRequest, работающие как и performXMLHttpRequest, но имеющие "вшитые" парамерты со всеми workaround'ами. Не совсем обьектная оболочка получилась, но мне так удобней Нда, на сервере по традиции хеш:
Для ленивых: http://sardar.vingrad.ru/projects/xmlhttp/index.htm -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||
|
|||||
| Greendrake |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 364 Регистрация: 14.7.2005 Репутация: нет Всего: 6 |
Ну.. Этот RequestObject горячий кофэ готовить тоже не умеет, и ничего в этом страшного я не вижу. Не "200" - это скорее исключение, чем правило, и я думаю что вначале следует заточить объект под правила, а уж потом учить его готовить кофэ Так, сейчас меня больше всего вот это беспокоит:
Давайте отставим магию, телепатию и летающие тарелочки - мы имеем дело с железякой, нулями и единичками. Как объяснить это поведение? Отход от ECMA-стандарта?? Я мог бы это понять если бы только IE или Опера. Но когда FireFox, чистокровный прямой потомок родителей JavaScript выполняет стандарты хуже Оперы, думаю это повод подвергнуть сомнению наше скриптовое мировоззрение. Добавил: Мне удалось-таки, хоть топором, но обойти "магию" и сделать код кроссбраузерным:
Но однако нездоровая это фигня.. Это сообщение отредактировал(а) Greendrake - 25.2.2006, 18:44 |
||||||
|
|||||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Идеалист я вижу, никгда с лагами сети не встречался Не спеши, магия в том что вызов onreadystatechange происходит не на обьекте XMLHttpRequest, т.е. this на него не указывет. Скорее всего так выходит потому, что само событие выполняеться в отдельном треде, куда ссылка твоя на XMLHttpRequest не скопировалась... Собственно создавая вот так сыслку на XMLHttpRequest и решаем "траблу". Не уверен что RequestObject.task(); обратиться именно к локальной переменой, а не к самой функции. Также не пойму, зачем нужно создавать closure для onreadystatechange в конструкторе, при этом пользуясь полями обьекта для сохранения задачи, вместо того что бы создать это closure в GETrequest и получать task из контекста... Или ты просто этого момента, присущего скорее функциональным языкам, не понимаешь? -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Greendrake |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 364 Регистрация: 14.7.2005 Репутация: нет Всего: 6 |
Я тоже не был уверен, но решил сначала попробовать для ссылок не сочинять новых названий переменных, а использовать имеющиеся. Для самого XMLHttpRequest в контексте конструктора этот номер не прошёл в Опере, поэтому пришлось-таки назвать по-другому - с префиксом reference. А вот для самого RequestObject - прокатило
Потому что впоследствии я хочу добавить метод POSTrequest, и зачем же мне в обоих методах плодить одинаковые участки кода по проверке onreadystatechange? Пусть оба пользуются полями объекта - на то я его и создал, и каждый занимается исключительно своим делом. Разве не логично? Это сообщение отредактировал(а) Greendrake - 26.2.2006, 00:20 |
||||
|
|||||
| Sardar |
|
||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
А ты дважды функцию вызывал? По идее после первого она может и "пропасть" вовсе Добавлено @ 00:45 Нет, не логично, в мире "полу декларативных" языков не логично, т.к. то что ты написал, не есть "одно определение функции", это участок кода (closure), что у каждого обьекта будет свой (физически). Вообщем вот пример, если не понял, забудь:
-------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||
|
|||||
| Greendrake |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 364 Регистрация: 14.7.2005 Репутация: нет Всего: 6 |
Хм, возможно. Поимею ввиду. Тут с этим кодом обнаружил ещё одну неприятную пакость от Оперы. Когда тестишь код впервые - всё нормально. Обновляешь - работает. Но стоит выйти из Оперы и запустить снова - не пашет! Помогает только очистка кэша. Это - если в HTML стоит
если этот тег убрать, то работает с каждым запуском без очистки кэша, но: после алерта "done", страница продолжает думать (висят часы песочные) - как бы продолжает загружаться. Останавливаешь крестиком, обновляешь - работает. При перезапуске всё повторяетя (после первого раза - думает). Бред какой-то. Что это такое? Версия Оперы 8.5. Это сообщение отредактировал(а) Greendrake - 26.2.2006, 00:59 |
||||
|
|||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
url твой должен меняться, иначе берёться инфа из кеша. А вот почему подвисает не знаю...
Но за то ты видишь что такое лаги сети и почему код должен быть немного другим чем у тебя -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Greendrake |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 364 Регистрация: 14.7.2005 Репутация: нет Всего: 6 |
Уряя.. Воспользовался примером, соорудил весчь. Выражаю спасибу. Вот:
|
||||
|
|||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |