Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

JsHttpRequest 4.x: динамическая подкачка данных с поддержкой upload-а (часть 2). (Дмитрий Котеров, оценка: 2)
Goto page 1, 2, 3, 4, 5, 6, 7  Next
Author Message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Oct 24, 2006 7:57 pm (написано за 2 минуты 17 секунд)
   Post subject: JsHttpRequest: динамическая подкачка данных с поддержкой upload-а (AJAX)
Reply with quote

Статья: dklab.ru/lib/JsHttpRequest/

Данный топик - продолжение (начало тут: forum.dklab.ru/comments/lib/41_jshttprequestDinamicheskayaPodkachkaDannihBezPerezagruzkiStranitsi.html).
Он касается только версии 4.0.

Поддержка старой версии 3.0 (и более старых) производится в ограниченном объеме. Пожалуйста, если Вы нашли баг, постарайтесь вначале обновить библиотеку до версии 4.0.

Last edited by Дмитрий Котеров on Tue Oct 24, 2006 8:00 pm; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
Maxim Kalenkov
Заглянувший



Joined: 27 May 2004
Posts: 9
Карма: 0
   поощрить/наказать

Location: Москва

PostPosted: Tue Oct 24, 2006 7:59 pm (спустя 2 минуты; написано за 2 минуты 48 секунд)
   Post subject: Re: JsHttpRequest: динамическая подкачка данных с поддержкой upload-а (AJAX)
Reply with quote

Повторю свой вопрос, он как раз новой версии касается.
Дмитрий Котеров wrote:
Да, в новой версии все ошибки бросаются в виде исключений. Так универсальнее получаются (ошибок уж очень много). Если хотите обрабатывать их вручную, оберните вызов библиотеки в try { ... } catch (e) { alert(e) }.
А не лучше ли будет вместо кидания исключения вызывать функцию, указанную в req.onreadystatechange, установив readyState, скажем, в 0, а в responseText записать сообщение об ошибке? Тогда все ошибки при использовании библиотеки можно будет обрабатывать единообразно.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Oct 24, 2006 8:01 pm (спустя 2 минуты; написано за 38 секунд)
   Post subject:
Reply with quote

Так и было в бета-версии 4.0. Но потом я все же решил отказаться от такого поведения, т.к. с ним очень просто пропустить ошибку, не поняв, в чем же было дело. Какие недостатки от бросания исключений?
Back to top
View user's profile Send private message Send e-mail
Maxim Kalenkov
Заглянувший



Joined: 27 May 2004
Posts: 9
Карма: 0
   поощрить/наказать

Location: Москва

PostPosted: Tue Oct 24, 2006 8:09 pm (спустя 7 минут; написано за 5 минут 35 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Так и было в бета-версии 4.0. Но потом я все же решил отказаться от такого поведения, т.к. с ним очень просто пропустить ошибку, не поняв, в чем же было дело. Какие недостатки от бросания исключений?
Просто все исключения надо ловить, а то пользователь тебя не поймёт. Потому придётся делать обёртку вокруг JsHttpRequest. Лишний код, которого можно было бы избежать.

PS.
Хотя я всё равно собирался сделать обёртку и разбить req.onreadystatechange на несколько частей, по одной на каждый readyState - мне кажется, так использовать удобнее.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 196
   поощрить/наказать

Location: 007 495

PostPosted: Tue Oct 24, 2006 8:39 pm (спустя 29 минут; написано за 1 секунду)
   Post subject:
Reply with quote

Если бросать исключение, то Вы ошибку точно не пропустите. А если вызывать onreadystatechange, то есть очень большая вероятность ошибку пропустить.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Oct 24, 2006 9:22 pm (спустя 43 минуты; написано за 2 минуты 19 секунд)
   Post subject:
Reply with quote

Maxim Kalenkov wrote:
Просто все исключения надо ловить, а то пользователь тебя не поймёт.
Вообще-то, если библиотека используется правильно, исключений быть не должно. Ну разве что случай, когда от сервера пришли невалидные данные, но это также свидетельствует об ошибке в скриптах на сервере.

Правда, есть другая проблема: IE почему-то не печатает текст исключения, а пишет "Exception thrown and not caught". Я не думал, что это стандартное поведение...

Кстати, в статье ничего вообще не говорится про обработку ошибок. Так что в будущих версиях можно будет при необходимости поменять поведение библиотеки. Меня беспокоит то, как действует IE... почему же он не показывает текст... и можно ли его заставить его показывать.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Oct 24, 2006 9:44 pm (спустя 22 минуты; написано за 1 минуту 17 секунд)
   Post subject:
Reply with quote

Все, эту проблему удалось решить полностью:

throw (window.Error? new Error(msg) : msg);

Теперь и в IE ошибки выглядят хорошо. И в FireFox, и даже в Сафари. Обновил библиотеку на сайте.

TODO: вынести все тексты ошибок в константы библиотеки и сделать что-то типа sprintf из _error() для более удобного вида.
Back to top
View user's profile Send private message Send e-mail
reactorx
Участник форума



Joined: 28 Feb 2006
Posts: 111
Карма: 1
   поощрить/наказать

Location: RND

PostPosted: Wed Nov 01, 2006 11:09 pm (спустя 8 дней 1 час 25 минут; написано за 4 минуты 47 секунд)
   Post subject:
Reply with quote

угу Вы правы.
прошу прощения что написал в эту ветку.
но думаю тема будет интересна не только мне.
Вобщем ситуация такова. Как использовать вашу либу если при разработке сайта используется ЧПУ.
Суть в том. что либа передает данные (я про GET запрос) в таком виде any.php?xxx=123&zzz=123&any=any (параметры могут быть любые)
а каким образом либу можно адаптировать под ЧПУ (если это реализовано в либе плз ткните пальце. в доках не нашел)
Были мысли запихнуть в req.open(null, '->СЮДА<-', true); урл вида /xxx/123/zzz/123
Что вы можете сказать по этому поводу?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Nov 02, 2006 12:52 am (спустя 1 час 43 минуты; написано за 45 секунд)
   Post subject:
Reply with quote

Никаким образом не нужно ее адаптировать. Зачем? ЧПУ придуманы, чтобы видеть в браузере красивые URL-ы, а URL-ы, генерируемые библиотекой, от глаз пользователя заведомо скрыты.
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



Joined: 19 Mar 2006
Posts: 40
Карма: 1
   поощрить/наказать


PostPosted: Wed Nov 08, 2006 10:27 pm (спустя 6 дней 21 час 34 минуты; написано за 5 минут 58 секунд)
   Post subject:
Reply with quote

Здравствуйте, Дмитрий.

В настоящий момент я делаю сайт, используя фреймворк Code Igniter (www.codeigniter.com/), в котором, по соображениям безопасности не используется метод GET и на все URL вида index.php?foo=bar выводится ошибка 404 - страница не найдена. Поэтому для передачи запроса в JsHttpRequest я принудительно установил метод POST:
Code (JavaScript): скопировать код в буфер обмена
req.open('POST', '/test/ajax/', true);
req.send({f:func, a:args});
Но, не смотря на это, скрипт посылает запросы вида /myclass/ajax/?11624095519820-xml, что приводит к тому, что вместо результата я получаю сообщение об ошибке.

Не могли бы вы подсказать, что я делаю не правильно?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Nov 09, 2006 2:25 am (спустя 3 часа 58 минут; написано за 2 минуты 45 секунд)
   Post subject:
Reply with quote

Вы все делаете правильно. Просто JsHttpRequest в любом случае изменяет URL, добавляя в него ?... (кстати, у Вас, наверное, старая версия: в новой добавка выглядит как ?JsHttpRequest=11624095519820-xml). Он просто не умеет работать без него.

В принципе, можно сделать, чтобы эта строка добавлялась через POST, если выбран этот метод, но данная функциональность не так-то проста в добавлении.

Я вот только не пойму: что же это за framework такой, который не поддерживает GET-параметры... в как же различные формы поиска, например? Их POST-ом делать неконцептуально.
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



Joined: 19 Mar 2006
Posts: 40
Карма: 1
   поощрить/наказать


PostPosted: Thu Nov 09, 2006 10:39 am (спустя 8 часов 14 минут; написано за 3 минуты 10 секунд)
   Post subject:
Reply with quote

Фремворк Code Igniter - www.codeigniter.com/ - в целом вещь очень приятная, обладающая небольшим размером, неплохой функциональностью, а, самое главное, отличной документацией. Но вот только с GET не очень дружит :-)...

Странно, но, например, xajax c ним работает норамально, правда у xajax проблема с кириллицей :-(.
Back to top
View user's profile Send private message Send e-mail
Алекс
Guest





Карма: 387
   поощрить/наказать


PostPosted: Sun Nov 19, 2006 10:42 pm (спустя 10 дней 12 часов 2 минуты; написано за 14 минут 34 секунды)
   Post subject:
Reply with quote

Должен отметить, что библиотека действительно получилась отличной. Но, как мне кажется, не хватает той гибкости, которая есть в классе XAJAX (xajaxproject.org), а именно возможности изменения заданного элемента с ID прямо из PHP. В текущем варианте функция яваскрипта изменяет содержание блока с ID='result' и ID='debug'. Если нужно изменить свойста элемента с другим именем, то приходится вручную модифицировать функцию яваскрипта. Так почему бы не использовать имена переменных из $_RESULT как ID элементов для обновления?
Например, при получении такого массива как
Code (php): скопировать код в буфер обмена
$_RESULT = array (www.php.net/array)(
  "q"     => "QUERY_STRING",
  "md5"   => "MD5_CODE"
);
Яваскрипт запишет в элемент с ID='q' значение QUERY_STRING, а в элемент с ID='md5' значение MD5_CODE.

А привязку делать не к файлу РНР, а к функциям. Например, вызов doLoad('myphpfunc', this.form) запустит через call_user_func функцию с именем myphpfunc и передаст параметром значение формы.

А можно пойти ещё дальше, и добавить в PHP возможность указать изменяемое свойство элементов кроме innerHTML, например, Disabled или Visible. В XAJAX для этого используется метод assign, например так.
Code (php): скопировать код в буфер обмена
$objResponse->assign("ID", "Свойство", "Значение");
Наверное, возникнет вопрос - а почему бы тогда не использовать XAJAX? (-; Всё у них хорошо, но нет возможности загружать файлы.
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Nov 20, 2006 12:13 pm (спустя 13 часов 31 минуту; написано за 2 минуты 6 секунд)
   Post subject:
Reply with quote

Алекс wrote:
не хватает той гибкости, которая есть в классе XAJAX (xajaxproject.org), а именно возможности изменения заданного элемента с ID прямо из PHP
А также не хватает возможности послать открытку по почте и отформатировать винчестер.

JsHttpRequest - инструмент разработчика, а не помойка. Если нужно сделать что-то на ее базе (например, изменять элемент по его id), напишите функцию из 3 строчек, которая это делает, и используйте везде.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Nov 20, 2006 12:22 pm (спустя 9 минут; написано за 1 минуту 45 секунд)
   Post subject:
Reply with quote

По поводу XAJAX - вопросы. Как у них с:
- отладочными возпожностями при возникновении ошибки (в том числе фатальной) PHP?
- работой с отключенными ActiveX?
- простотой использования библиотеки?
- передачей структурированных данных (вроде многомерных массивов)?
- кодировками (в том числе русскоязычными)?
Back to top
View user's profile Send private message Send e-mail
Алекс
Guest





Карма: 387
   поощрить/наказать


PostPosted: Mon Nov 20, 2006 3:54 pm (спустя 3 часа 31 минуту; написано за 2 минуты 15 секунд)
   Post subject:
Reply with quote

Quote:
А также не хватает возможности послать открытку по почте и отформатировать винчестер.
Это можно сделать в дополнительных плагинах. :)

- отладочными возпожностями при возникновении ошибки (в том числе фатальной) PHP?
Выводится алерт с полученным текстом.

- работой с отключенными ActiveX?
- простотой использования библиотеки?
- передачей структурированных данных (вроде многомерных массивов)?
wiki.xajaxproject.org/Tutorials:Learn_xajax_in_10_Minutes

- кодировками (в том числе русскоязычными)?
wiki.xajaxproject.org/Tutorials:Character_Encoding_and_xajax
Back to top
bubblegum
Guest





Карма: 387
   поощрить/наказать


PostPosted: Fri Nov 24, 2006 10:40 am (спустя 3 дня 18 часов 45 минут; написано за 4 минуты 56 секунд)
   Post subject: как получить readyState<4
Reply with quote

Приветствую! Вы написали отличную библиотеку, использую для быстрого выбора из справочника в 120К записей.
Интересует один вопрос: когда начал изучать ajax, пробовал стандартный xmlhttprequest, и в обработчике ответа была строка document.getElementById('progress').style.width=req.readyState*10 - то есть индикатор подгрузки - красивенько так ползла полоска; а дальше как обычно if(req.readyState==4){...
В респонс скрипте естественно данные вываливались echo

При использовании jsHttpRequest ответ формируется в виде строки и потом отдается в $_RESULT по окончании работы скрипта, и выходит что клиент не получает readyState=1..3 и не работает мой прогресс индикатор. Подскажите пжл кто знает как можно обойти такую проблему.
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Fri Nov 24, 2006 10:55 am (спустя 15 минут; написано за 2 минуты 23 секунды)
   Post subject:
Reply with quote

на самом деле, он их получает в том же порядке, что и стандартны xmlhttprequest, но - практически один за другим, без задержки, когда данные уже готовы. Кстати говоря, то ли в IE, то ли в FF, то ли в Опере xmlhttprequest ведет себя точно так же (вопреки здравому смыслу), так что указанный Вами способ отрисовки прогресса не является надежным в любом случае.
Back to top
View user's profile Send private message Send e-mail
wacky
Заглянувший



Joined: 26 Nov 2006
Posts: 5
Карма: 0
   поощрить/наказать


PostPosted: Sun Nov 26, 2006 11:48 am (спустя 2 дня 52 минуты; написано за 6 минут 50 секунд)
   Post subject:
Reply with quote

Здравствуйте!
Я что-то пропустил, или обработчик timeout до сих пор не реализован ? Я для себя его написал еще в 3-й версии библитеки.
Если интересно, то во вложении последняя версия библиотеки Дмитрия с внесенными изменениями. Таже в .php добавлена переменная RAW_REQUEST, "сырой запрос" от js. Полезно для вычисления контрольной суммы пришедших данных, например.

Использование:

req = new JsHttpRequest();
req.timeout = 5000; // ms

req.onreadystatechange = function() {
  if (this._req.readyState == 4) {
    req._resetTimeout(); // сбрасываем таймайут
    // какой-то код

  }

}

req.ontimeout = function() {
  alert('Timed out');
};


JsHttpRequest.rar
 Description:

Download
 Filename:  JsHttpRequest.rar
 Filesize:  9.71 KB
 Downloaded:  1156 Time(s)

Back to top
View user's profile Send private message Send e-mail
Faster
Заглянувший



Joined: 26 Nov 2006
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Sun Nov 26, 2006 12:44 pm (спустя 56 минут; написано за 2 минуты 44 секунды)
   Post subject: Блин ... а есть ли дока полная , ну как HELP
Reply with quote

Народ есть ряд вопросов , заюзал эту штуку ... ОЙ КАК ПОНРАВИЛОСЬ !!!
Руль когда люди работают и пишут такие весчи...
Что надо так это описание всех методов и свойств созданного объекта
Как в PHP так и в JS так как чтение описания недало ответы на многие вопросы а самому додумываться ...

и ответ на один не лёгкий вопрос как передать массив ...

У меня получилось сделать это в направление от клиента к серверу ... а вот попытка передать обратноприводит к передаче строки разделённой запятой .... как с этим справиться ?

Ну очень надо швырять массивы ...
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Sun Nov 26, 2006 3:28 pm (спустя 2 часа 43 минуты; написано за 1 минуту 54 секунды)
   Post subject:
Reply with quote

wacky: понятно, я подумаю насчет добавления этой функциональности в библиотеку.
Faster wrote:
и ответ на один не лёгкий вопрос как передать массив ...
Очень просто:
Code (JavaScript): скопировать код в буфер обмена
req.send({
  a: {
     b: 10,
     c: 20,
  },
  d: [1, 2, 4]
});
Code (php): скопировать код в буфер обмена
$_RESULT = array (www.php.net/array)(
  'a' => array (www.php.net/array)(
      'b' => 10,
      'c' => 20,
   ),
   'd' => array (www.php.net/array)(1, 2, 4);
);
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Nov 27, 2006 11:10 am (спустя 19 часов 42 минуты)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Не нужны в этом топике»,
расположенную в форуме Мусоропровод (27 Ноября 2006, 11:10).
Back to top
View user's profile Send private message Send e-mail
mot
Участник форума



Joined: 16 Mar 2006
Posts: 37
Карма: 3
   поощрить/наказать


PostPosted: Mon Nov 27, 2006 10:32 pm (спустя 11 часов 21 минуту; написано за 57 секунд)
   Post subject:
Reply with quote

Вопрос - а почему при отправки формы через кнопку типа submit не передаётся имя/значение этой кнопки?

Пример:
Code (html): скопировать код в буфер обмена
<form (december.com/html/4/element/form.html) id="frm" enctype="multipart/form-data" method="post" onsubmit="return doLoad();"> (december.com/html/4/element/.html)
    Text: <input (december.com/html/4/element/input.html) type="text" name="q"> (december.com/html/4/element/.html)   
    <input (december.com/html/4/element/input.html) type="submit" name="but2" value="Submit!"> (december.com/html/4/element/.html)
</form>
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Nov 28, 2006 12:30 am (спустя 1 час 57 минут; написано за 47 секунд)
   Post subject:
Reply with quote

Потому что форма не отправляется. Вы вызываете doLoad(), который делает совершенно отдельный запрос на сервер. Вместо submit-кнопки с тем же успехом мог стоять обычный <input type="button">.
Back to top
View user's profile Send private message Send e-mail
mot
Участник форума



Joined: 16 Mar 2006
Posts: 37
Карма: 3
   поощрить/наказать


PostPosted: Tue Nov 28, 2006 1:34 am (спустя 1 час 4 минуты; написано за 2 минуты 54 секунды)
   Post subject:
Reply with quote

Да, я прекрасно понимаю что там мог стоять и <input type="button">. Собственно говоря он и стоит у Вас в примере.
Но поведение элемента типа submit отличается от элемента типа button.

Вопрос в трактовании фразы, написанной в Вашей статье. "Посылка целой формы на сервер".
По моему мнению, для бекэнда должно быть безразлично, послана ли форма через стандартный POST, либо с помощью Вашей библиотеки.
Минимально, для этого не хватает передачи элементов типа submit.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Nov 28, 2006 11:28 pm (спустя 21 час 54 минуты; написано за 45 секунд)
   Post subject:
Reply with quote

Честно говоря, я не уверен, что можно вообще отследить, какая кнопка была нажата в момент вызова библиотеки. Скорее всего, нельзя никак. Так что рекомендую решать задачу другими способами.
Back to top
View user's profile Send private message Send e-mail
Infis
Guest





Карма: 387
   поощрить/наказать


PostPosted: Mon Dec 04, 2006 2:28 pm (спустя 5 дней 14 часов 59 минут)
   Post subject: У меня глюки?
Reply with quote

Никто не сталкивался с такой ерундой?

Код срипта:
Code (php): скопировать код в буфер обмена
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Список файлов</title>
</head>
<body>
<?php
ini_set (www.php.net/ini_set)('display_errors',1);
error_reporting (www.php.net/error_reporting)(E_ALL);
?>
<script type="text/javascript" language="JavaScript"
        src="../../../lib/JsHttpRequest/JsHttpRequest.js"></script>
<script type="text/javascript" language="JavaScript">

var req;
var newStart = 1;
var newEnd = 5;
var newSearch = ' ';
var endSearch = 0;
var endGet = 0;
var newS = 1;
var countElem = 0;

function doLoad(newSearch,newStart,newEnd) {
        //alert('Внутри doLoad');
        // Код автоматически вызывается после окончания загрузки.
        req.onreadystatechange = process_get;
        // Prepare request object (automatically choose GET or POST).
        req.open(null, 'search_dc_loader.php', true);
        // Send whole form data to backend.
        req.send( { search: newSearch, start_limit: newStart, end_limit: newEnd } );
}

function process_get() {
        //alert(req.readyState + ' ' + endGet);
        if (req.readyState == 4) {
                // Вывод результатов на страницу ($_RESULT содержится в responseJS).
                if (req.responseJS.max_elem != "0") {

                        // Значит что-то нашли. Разбираем-с...

                        for (var_file in req.responseJS.files) {
                                output +=   '   Файл: ' + req.responseJS.files[var_file].file + '<br/>' +
                                                '    ТТН: ' + req.responseJS.files[var_file].tth + '<br/>' +
                                                ' Размер: ' + req.responseJS.files[var_file].size + '<br/>';
                        }
                        document.getElementById('result').innerHTML = output;
                        // Вывод отладочной информации (выводится из responseText).
                        document.getElementById('debug').innerHTML = req.responseText;

                        if( endGet == 0 ) {
                                //alert(req.responseJS.next);
                                if( req.responseJS.next == "1" ) {
                                        newStart = 1 * req.responseJS.start_limit + 1 * countElem;
                                        newEnd = countElem;
                                        newSearch = req.responseJS.search;
                                        req = new JsHttpRequest();
                                        doLoad(newSearch, newStart, newEnd);
                                } else {
                                        endGet = 1;
                                }
                        }
                }
                // Вывод отладочной информации (выводится из responseText).
                document.getElementById('debug').innerHTML = req.responseText;
        }
}

function doSearch(searchStr,sLim,eLim) {
        if( newS == 1) {
                // Устанавливаем флаг окончания загрузки
                endGet = 0;
                // Сбрасываем результаты в окне
                output = '';
                // Запоминаем число элементов для вывода
                countElem = eLim;
               
                //alert('Вызываем doLoad');

                // Создаем новый объект JsHttpRequest.
                req = new JsHttpRequest();

                // Запускаем поиск
                doLoad( searchStr, sLim, eLim);
        }
}

</script>

<form id="frm" enctype="multipart/form-data">
        Строка поиска: <input type="text" name="search"> <input type="button" value="Искать"  onclick="doSearch(this.form.search.value,this.form.start_limit.value,this.form.end_limit.value)"><br/>
        Вывести результат в количестве <input type="text" name="end_limit"> элементов, начиная с <input type="text" name="start_limit">.   
</form>

<div id="result" style="border:1px solid #000; padding:2px">
</div>
<div id="debug" style="border:1px dashed red; padding:2px">
</div>
<?php
//<hr><show_source(__FILE__)>
?>
</body>
</html>
Код бакенда на сервере:
Code (php): скопировать код в буфер обмена
<?php

ini_set (www.php.net/ini_set)('display_errors',1);
error_reporting (www.php.net/error_reporting)(E_ALL);

// Load JsHttpRequest backend.
require_once "../../../lib/JsHttpRequest/JsHttpRequest.php";
// Create main library object. You MUST specify page encoding!
$JsHttpRequest =& new JsHttpRequest("windows-1251");
// Store resulting data in $_RESULT array (will appear in req.responseJs).

//
$inputsearch = @$_REQUEST['search'];
$start_lim = @$_REQUEST['start_limit'];
$end_lim = @$_REQUEST['end_limit'];
settype (www.php.net/settype)($start_lim,'integer');
settype (www.php.net/settype)($end_lim,'integer');

$end_lim = $start_lim + $end_lim - 1;

echo (www.php.net/echo) " : '". $inputsearch ."'<br/><br/>";

$search = iconv (www.php.net/iconv)( 'windows-1251' , 'utf-8' , strtolower (www.php.net/strtolower)($inputsearch) );

$transU = iconv (www.php.net/iconv)( 'windows-1251' , 'utf-8' , 'QWERTYUIOPASDFGHJKLZXCVBNM' );
$transL = iconv (www.php.net/iconv)( 'windows-1251' , 'utf-8' , 'qwertyuiopasdfghjklzxcvbnm' );

$dom = new DomDocument();
$dom->load("Kolyn.xml");

$xp = new domXPath($dom);
$titles = $xp->query("//*[contains(translate(@Name,'$transU','$transL'), translate('$search','$transU','$transL'))]");

$nodes = array (www.php.net/array)();
foreach ($titles as $node) {
       $nodes[] = array (www.php.net/array)(
//             "max_elem" => $titles->length,
             "file"       => iconv (www.php.net/iconv)('utf-8', 'windows-1251', $node->getAttribute('Name')),
             "tth"        => $node->getAttribute('TTH'),
             "size"     => $node->getAttribute('Size')
       );
}

$needNextQuery = 0;
echo (www.php.net/echo) $end_lim. ' ';
echo (www.php.net/echo) count (www.php.net/count)($nodes);

if ( $start_lim > count (www.php.net/count)($nodes) ) {
    $_RESULT = array (www.php.net/array)(
                "search" => $inputsearch,
                "max_elem" => $titles->length,
                "start_limit" => @$_REQUEST['start_limit'],
                "end_limit" => @$_REQUEST['end_limit'],
                "next" => $needNextQuery,
                "files" => array (www.php.net/array)()
    );
} else {
    if ( $end_lim > count (www.php.net/count)($nodes) ) {
       $end_elem = count (www.php.net/count)($nodes);
    } else {
       $needNextQuery = 1;
       if ($start_lim > $end_lim)
           $end_elem = $start_lim;
    }
    $_RESULT = array (www.php.net/array)(
                "search" => $inputsearch,
                "max_elem" => $titles->length,
                "start_limit" => $start_lim,
                "end_limit" => @$_REQUEST['end_limit'],
                "next" => $needNextQuery,
                "files" => array_slice (www.php.net/array_slice)($nodes, $start_lim - 1, $end_lim - $start_lim + 1)
        );
}
// Below is unparsed stream data (will appear in req.responseText).
?>
<pre>
<b>Request method:</b> <?=$_SERVER['REQUEST_METHOD'] . "\n"?>
<b>Loader used:</b> <?=$JsHttpRequest->LOADER . "\n"?>
<b>_REQUEST:</b> <?=print_r (www.php.net/print_r)($_REQUEST, 1)?>
</pre>
А выводит в отладку вот такую ерунду:
Code (php): скопировать код в буфер обмена
span class="st0">'ghgh'

-1 0

Request method: POST
Loader used: xml
_REQUEST: Array (www.php.net/array)
(
    [artist] =>
    [genre] =>
    [title] =>
    [album] =>
    [type] => all
    [play] => 0
    [year] =>
    [theme] => Tabular
    [dir (www.php.net/dir)] =>
    [PHPSESSID] => 238b72cfed5b0cc7250d84a5b16eb420
    [search] => ghgh
    [start_limit] =>
    [end_limit] =>
)
Меня смущают левые поля, которые идут до PHPSESSID. Я не могу понять, откуда они беруться?! А самое интересное, что это только при поисковой строке 'ghgh' или аналогичной типа 'ghghghgh' появляется.
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Dec 04, 2006 2:33 pm (спустя 4 минуты; написано за 21 секунду)
   Post subject:
Reply with quote

Infis wrote:
Меня смущают левые поля, которые идут до PHPSESSID. Я не могу понять, откуда они беруться?
Скорее всего, из кук. Читайте описание $_REQUEST на php.net. Библиотека тут ни при чем.
Back to top
View user's profile Send private message Send e-mail
Infis
Guest





Карма: 387
   поощрить/наказать


PostPosted: Mon Dec 04, 2006 6:09 pm (спустя 3 часа 36 минут; написано за 14 минут 55 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Скорее всего, из кук. Читайте описание $_REQUEST на php.net. Библиотека тут ни при чем.
Да. Действительно из кук. Спасибо! А то я просто в осадок ушел после вывода результатов :)
Прошу прощения, что опубликовал весь код, просто я хотел показать, что там даже рядом нигде не встречаются переменные с таким именем.

А можно еще один вопросик?
Планируется ли в библиотеке добавить функцию серии последовательных запросов? Как видите, я не силен ни в javascript, ни в PHP. Было бы совсем неплохо расширить библиотеку такой функцией. А то приходится огород городить на ровном месте. Данная функциональность, я думаю, часто требуется. Приходится каждому свое выдумывать, хотя наверняка можно было бы сделать это универсальным. К сожалению я не могу самостоятельно доработать Вашу библиотеку, так как просто не хватит знаний.

И еще. На форуме в этой ветке уже звучала фраза о том, что было бы совсем неплохо расширить библиотеку примеров, добавив более сложные функции. Возможно, задача, которую я пытаюсь решить (чтение скриптом на сервере кучи небольших файлов и выдача результатов, от мелких файлов уйти не удалось, так как обрабатывать один большой файл XML просто нереально долго получается и скрипту не хватает времени, которое указано по-умолчанию в настройках сервера), могла бы войти в библиотеку примеров. И полезно в качестве примера работы с библиотекой, делая очередность запросов, и полезно для новичков типа меня, которые недостаточно хорошо знают javascript и PHP.

А вообще большая благодарность вам за библиотеку! Все-таки аналоги не могут сравниться с простотой использования Вашей библиотеки. Да и документированность с примерами вполне дает общее представление. К сожалению, документации как таковой нет, с описанием методов и очередности вызовов. Зачастую приходится делать несколько тестовых скриптов, которые позволяют разобраться с тем, как вообще все это работает. В общем, успехов! Ждем новых версий ;)
Back to top
Guest






Карма: 387
   поощрить/наказать


PostPosted: Tue Dec 05, 2006 12:29 pm (спустя 18 часов 20 минут; написано за 7 минут 27 секунд)
   Post subject:
Reply with quote

[quote="wacky"]Здравствуйте!
Я что-то пропустил, или обработчик timeout до сих пор не реализован ? Я для себя его написал еще в 3-й версии библитеки.
[quote]
А для чего нужен этот таймаут?
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Wed Dec 06, 2006 12:07 am (спустя 11 часов 38 минут; написано за 56 секунд)
   Post subject:
Reply with quote

Тайм-аут нужен для того, чтобы отследить обрыв соединения с сервером, когда идет загрузка данных. Не все лоадеры библиотеки поддерживают события при обрыве (например, SCRIPT и FORM - не поддерживают).
Back to top
View user's profile Send private message Send e-mail
phprus
Участник форума



Joined: 25 Jul 2003
Posts: 162
Карма: 9
   поощрить/наказать

Location: Пермь

PostPosted: Fri Dec 08, 2006 4:33 pm (спустя 2 дня 16 часов 26 минут; написано за 2 минуты 26 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров
Нашел небольшой баг в библиотеке. Если методу send просто передать строку, то прередача данных на сервер не произойдет, так как за пределами функции _hash2query массив queryText будет пустым. Судя по всему проблема в строчке queryText = [content]; в методе _hash2query, так как если ее заменить на конструкцию:
Code (JavaScript): скопировать код в буфер обмена
if (queryText instanceof Array) {
        queryText.splice(0);
        queryText[0] = content;
} else {
                queryText = [content];
}
то все работает.

Версия библиотеки 4.14.
Back to top
View user's profile Send private message Send e-mail
reactorx
Участник форума



Joined: 28 Feb 2006
Posts: 111
Карма: 1
   поощрить/наказать

Location: RND

PostPosted: Sun Dec 10, 2006 5:32 am (спустя 1 день 12 часов 58 минут; написано за 10 минут 33 секунды)
   Post subject:
Reply with quote

Еще раз приветствую Вас Дмитрий Котеров
Вобщем вопрос в следующем...
Вы реализовали передачу формы целиком.. В доке все прекрасно описано...НО! Могли бы Вы привести тут краткий пример каким образом можно отправить форму целиком используя краткий способ отправки данных...я говорю про метод query (JsHttpRequest.query)
Ситуация в том что когда я пытаюсь это сделать у меня происходит следующая тема:
в консоли ошибок высыпется это
--
Ошибка: iframe has no properties
Источник: my_pattern/js/jshttprequest/jshttprequest.js
Строка: 461
Предупреждение: Форма содержит атрибут "enctype=multipart/form-data", но не содержит атрибут "method=post". Вместо этого для отправки данных будет использоваться метод "GET" без указания типа содержимого.
Источник: my_pattern/
Строка: 0
--

отправляю я форму так
--
JsHttpRequest.query(
    index_file,
    {'url': document.getElementById('frm')},
    function (responseJS, responseText) { alert('xxx'); if(responseJS.template == '404') { alert('doc 404 url is '+responseJS.content);}
        var node = eval("document.getElementById('"+responseJS.template+"')");
        appendData(responseJS.content, node, responseJS.mode);
    },
    true
);
---
Вобщем до alert('xxx');
Дело не доходи... И!!! после того как сыпанулось в консоль ошибок.... Почему то меня перекидывает на другую страницу... т.е запрос идет не аджаксом а просто как на обычной странице...

П.С Вобщем получается в итоге 2 вопроса)
Можно пример отправки формы целиком по средством метода query
и вотрой вопрос... (если все понятно изложил) в чем у меня может быть проблемма?
Back to top
View user's profile Send private message Send e-mail
reactorx
Участник форума



Joined: 28 Feb 2006
Posts: 111
Карма: 1
   поощрить/наказать

Location: RND

PostPosted: Sun Dec 10, 2006 5:57 am (спустя 25 минут; написано за 40 секунд)
   Post subject:
Reply with quote

Добавка к предыдущему посту...
а перекидывает меня на этот линк
my_pattern/index.php5?PHPSESSID=99d94a5609de4b9c8c846912cd88a4d5&JsHttpRequest=11657194060810-form
Ну это если вам вдруг будут нужно
Back to top
View user's profile Send private message Send e-mail
phprus
Участник форума



Joined: 25 Jul 2003
Posts: 162
Карма: 9
   поощрить/наказать

Location: Пермь

PostPosted: Sun Dec 10, 2006 11:51 am (спустя 5 часов 53 минуты; написано за 1 минуту 15 секунд)
   Post subject:
Reply with quote

reactorx wrote:
Предупреждение: Форма содержит атрибут "enctype=multipart/form-data", но не содержит атрибут .
А если добавить то, что просит библиотека? То-есть атрибут method="post" То работать будет или нет?
Back to top
View user's profile Send private message Send e-mail
reactorx
Участник форума



Joined: 28 Feb 2006
Posts: 111
Карма: 1
   поощрить/наказать

Location: RND

PostPosted: Sun Dec 10, 2006 4:04 pm (спустя 4 часа 12 минут; написано за 1 минуту 11 секунд)
   Post subject:
Reply with quote

phprus Да та же в принципе ситуация...
пишет
--
Ошибка: iframe has no properties
Источник: my_pattern/js/jshttprequest/jshttprequest.js
Строка: 461
Ошибка: parent.JsHttpRequest has no properties
Источник: my_pattern/index.php5?PHPSESSID=9b9f84ad411c235e76fa259737b075e4&JsHttpRequest=11657558053090-form
Строка: 3
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 196
   поощрить/наказать

Location: 007 495

PostPosted: Mon Dec 11, 2006 1:39 pm (спустя 21 час 35 минут; написано за 18 секунд)
   Post subject:
Reply with quote

reactorx wrote:
куда исчез господин Кóтеров)?
Да никуда он не исчез... Просто такие вопросы задаёте....
Back to top
View user's profile Send private message Send e-mail
reactorx
Участник форума



Joined: 28 Feb 2006
Posts: 111
Карма: 1
   поощрить/наказать

Location: RND

PostPosted: Mon Dec 11, 2006 1:48 pm (спустя 8 минут; написано за 49 секунд)
   Post subject:
Reply with quote

Юpий Насрeтдинов пасиб.
Back to top
View user's profile Send private message Send e-mail
predator
Guest





Карма: 387
   поощрить/наказать


PostPosted: Tue Dec 12, 2006 4:15 pm (спустя 1 день 2 часа 27 минут; написано за 2 минуты 32 секунды)
   Post subject: не получется отправить данные методом POST
Reply with quote

вот код:
Code (JavaScript): скопировать код в буфер обмена
get_req_exp({mode:'get_rooms'}, ch.draw_rooms);

function get_req_exp(obj,func) {
        var req=new JsHttpRequest();
        if (func) {
                req.onreadystatechange = function() {
                        if ( req.readyState == 4 ) {
                                func(req.responseJS);
                        }
                }
        }
        req.caching=false;
        req.open( 'POST', '/hr.php', true );
        req.send( obj );
}
в файле /hr.php
в начале проверяю $_POST массив - он пустой
почему?

пользовался раньше версией 3.x - всегда данные передавались постом без проблем
почему в 4-ой проблемы (версия либы 4.15)?

с уважением )
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Wed Dec 13, 2006 12:59 am (спустя 8 часов 44 минуты; написано за 41 секунду)
   Post subject:
Reply with quote

phprus: исправлено

version 4.16: allow to pass scalar to send() (you may fetch it from QUERY_STRING in loader)
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   This topic is locked: you cannot edit posts or make replies. All times are GMT + 3 Hours
Goto page 1, 2, 3, 4, 5, 6, 7  Next
Page 1 of 7    Email to a Friend.
You cannot post new topics in this forum. You can reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML