JsHttpRequest:  кроссбраузерный  AJAX,  фоновая   закачка файлов, "прозрачное" программирование  backend- скрипт...
Что такое  Web 2.0 ?   <ul><li>© O'Reilly Media, 2004 </li></ul><ul><li>Браузер есть платформа </li></ul><ul><li>Данные – ...
AJAX : идеология или просто модное слово? <ul><li>Asynchronous JavaScript And XML </li></ul><ul><li>Старое название –  Rem...
Асинхронность <ul><li>Запустить запрос к серверу </li></ul><ul><li>Продолжить работу </li></ul><ul><li>Когда придет ответ,...
Методы динамической загрузки <ul><li>XMLHttpRequest </li></ul><ul><li>ActiveX </li></ul><ul><li><script> </li></ul><ul><li...
XMLHttpRequest <ul><li>Многословный интерфейс </li></ul><ul><li>Не работает в  IE5, IE6, Opera7 </li></ul><ul><li>Неудобст...
XMLHttpRequest:  обработка  XML <ul><li><?php header('Content-type: application/xml'); echo '<?xml version=&quot;1.0&quot;...
XMLHttpRequest:  АЯКС   или АЙАЙ ? <ul><li>JSON:  генерация json = {   &quot;time&quot;: &quot;10:00 PM&quot;,   &quot;dat...
XMLHttpRequest:  русские кодировки <ul><li>JavaScript –  полностью  Unicode- язык </li></ul><ul><li>escape():  кодирование...
ActiveX <ul><li>Работает только в  IE5, IE6 </li></ul><ul><li>Должны быть разрешены  ActiveX </li></ul><ul><li>В  IE 5.0  ...
ActiveX  и  XMLHttpRequest:  кроссбраузерная инициализация <ul><li>var req = null; </li></ul><ul><li>if (window.XMLHttpReq...
<script> <ul><li>var script = document.createElement('script'); </li></ul><ul><li>script.src = 'script_backend.php?id=1&a=...
<script>:  проблемы <ul><li>Поддерживается только  GET </li></ul><ul><li>Нельзя передать много данных </li></ul><ul><li>Ну...
<iframe> <ul><li>var iframe = document.createElement('iframe'); </li></ul><ul><li>iframe.name = 'dyna'; </li></ul><ul><li>...
<iframe>:  плюсы и минусы <ul><li>Плюсы </li></ul><ul><ul><li>нет проблем с русскими кодировками </li></ul></ul><ul><ul><l...
<img> + cookies <ul><li>var img = document.createElement('img'); </li></ul><ul><li>img.src = 'img_backend.php?id=1&a=123';...
Обзор всех методов :  проблемы <ul><li>Совершенно разные интерфейсы </li></ul><ul><li>Трудно передавать сложные данные: { ...
Есть ли решение? <ul><li>ДА! </li></ul><ul><li>JsHttpRequest  решает все перечисленные проблемы </li></ul>
Упрощенный интерфейс вызова <ul><li>// Frontend: JavaScript </li></ul><ul><li>JsHttpRequest.query(  </li></ul><ul><li>addr...
Пример : suggest (frontend) <ul><li>JsHttpRequest.query( </li></ul><ul><li>// Адрес backend-сценария. </li></ul><ul><li>'s...
Пример : suggest (backend) <ul><li><?php </li></ul><ul><li>// Загрузить библиотеку JsHttpRequest. </li></ul><ul><li>requir...
Закачка файлов &quot; AJAX- ом&quot; <ul><li>Проблема безопасности </li></ul><ul><li>Библиотеке передается не файл, а  эле...
Закачка файлов &quot; AJAX- ом&quot; <ul><li><form enctype=&quot;multipart/form-data&quot;> </li></ul><ul><li><input type=...
Отправка формы целиком <ul><li><form enctype=&quot;multipart/form-data&quot; id= &quot;e_form&quot; > </li></ul><ul><li><i...
Русскоязычные кодировки <ul><li>Работа с кодировками полностью прозрачна как для  frontend,  так и для  backend </li></ul>...
Сессии <ul><li>Работа с сессиями полностью прозрачна и происходит стандартными средствами  PHP </li></ul>
Выбор метода и загрузчика <ul><li>JsHttpRequest.query( </li></ul><ul><li>' GET  backend.php', </li></ul><ul><li>... </li><...
Кэширование <ul><li>Четвертый параметр  JsHttpRequest.query(). </li></ul><ul><li>Если кэширование включено, то при попытке...
Отладка и перехват ошибок  в  backend <ul><li><?php </li></ul><ul><li>require_once &quot;JsHttpRequest/JsHttpRequest.php&q...
Отладка и перехват ошибок  в  backend <ul><li>Пример данных, сгенерированных  backend- ом </li></ul>JsHttpRequest.dataRead...
Ошибки во  frontend <ul><li>Все ошибки генерируются в виде исключений  JavaScript :  throw new Error(...) </li></ul><ul><l...
Интерфейс, совместимый с  XMLHttpRequest <ul><li>var req = new  XMLHttpRequest() ; </li></ul><ul><li>req.onreadystatechang...
Модульная архитектура <ul><li>Код библиотеки состоит из частей: </li></ul><ul><ul><li>Базовый модуль  ( неотключаемый) </l...
Обеспечение кроссбраузерности <ul><li>Автоматизированный  test framework </li></ul><ul><li>На каждый багфикс – один тест <...
Backend- ы на не -PHP <ul><li>За время существования библиотеки зарегистрированы случаи создания умельцами  backend- модул...
Резюме <ul><li>Кроссбраузерность (IE5.0+ без  ActiveX , Mozilla 1.7+, Firefox 1.0+, Opera 7.20+, Safari ) </li></ul><ul><l...
Приходите к нам работать! <ul><li>МойКруг.ру теперь – сервис  Я ндекса </li></ul><ul><li>Мы расширяем свою команду! </li><...
Upcoming SlideShare
Loading in …5
×

Js Http Request дмитрий котеров

3,660 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,660
On SlideShare
0
From Embeds
0
Number of Embeds
133
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Js Http Request дмитрий котеров

  1. 1. JsHttpRequest: кроссбраузерный AJAX, фоновая закачка файлов, &quot;прозрачное&quot; программирование backend- скриптов Кроссбраузерность, закачка, отладка , многомерные данные, русский язык, ... Дмитрий Котеров, архитектор и главный разработчик MoiKrug.ru компания Яндекс [email_address]
  2. 2. Что такое Web 2.0 ? <ul><li>© O'Reilly Media, 2004 </li></ul><ul><li>Браузер есть платформа </li></ul><ul><li>Данные – движущая сила сайта </li></ul><ul><li>Демократия среди пользователей, рейтинги, голосования </li></ul><ul><li>Модель социальной сети </li></ul><ul><li>Динамическая загрузка данных ( AJAX) </li></ul>
  3. 3. AJAX : идеология или просто модное слово? <ul><li>Asynchronous JavaScript And XML </li></ul><ul><li>Старое название – Remote Scripting </li></ul><ul><li>Компоненты: </li></ul><ul><ul><li>Frontend </li></ul></ul><ul><ul><li>Backend </li></ul></ul>
  4. 4. Асинхронность <ul><li>Запустить запрос к серверу </li></ul><ul><li>Продолжить работу </li></ul><ul><li>Когда придет ответ, запустить обработчик </li></ul><ul><li>Обработать данные, изменить страницу </li></ul><ul><li>Сложность AJAX -валидаторов </li></ul><ul><li>Событийно-ориентированное программирование </li></ul>
  5. 5. Методы динамической загрузки <ul><li>XMLHttpRequest </li></ul><ul><li>ActiveX </li></ul><ul><li><script> </li></ul><ul><li>невидимый <iframe> </li></ul><ul><li><img> + cookies </li></ul><ul><li>кто-нибудь знает другие? </li></ul>
  6. 6. XMLHttpRequest <ul><li>Многословный интерфейс </li></ul><ul><li>Не работает в IE5, IE6, Opera7 </li></ul><ul><li>Неудобство передачи сложноструктурированных данных </li></ul><ul><li>Неудобство работы с XML (далее...) </li></ul>var req = new XMLHttpRequest(); req.onreadystatechange = function() { if (req.readyState == 4) { alert(req.responseText); } } req.open(&quot;POST&quot;, &quot;xml_backend.php&quot;, true); req . send ( &quot;a=123&b=456&quot; );
  7. 7. XMLHttpRequest: обработка XML <ul><li><?php header('Content-type: application/xml'); echo '<?xml version=&quot;1.0&quot; encoding=&quot;windows-1251&quot;?>'; echo '<root><time>' . date('r') . '</time></root>'; ?> </li></ul>var xml = req.responseXML; var timeNode = xml.getElementsByTagName('time')[0]; alert(timeNode.childNodes[0].nodeValue); <ul><li>Сложно формировать </li></ul><ul><li>Сложно разбирать </li></ul><ul><li>Неустойчивость к ошибкам в backend </li></ul>
  8. 8. XMLHttpRequest: АЯКС или АЙАЙ ? <ul><li>JSON: генерация json = { &quot;time&quot;: &quot;10:00 PM&quot;, &quot;date&quot;: { &quot; day &quot;: 10, &quot; month &quot;: &quot; April &quot;, &quot; year &quot;: 2007 } } </li></ul><ul><li>PHP: json_encode() </li></ul><ul><li>JSON: разбор var r; eval(&quot;r = &quot; + json); </li></ul><ul><li>AJAJ – Asynchronous JavaScript and JSON </li></ul><ul><li>Все еще неустойчивость к ошибкам </li></ul>
  9. 9. XMLHttpRequest: русские кодировки <ul><li>JavaScript – полностью Unicode- язык </li></ul><ul><li>escape(): кодирование в UCS2BE: %u1234%u5678 </li></ul><ul><ul><li>работает даже в очень старых браузерах </li></ul></ul><ul><ul><li>сильно увеличивает объем </li></ul></ul><ul><li>encodeUriComponent(): кодирование в UTF-8 с urlencode: %B2%A3 </li></ul><ul><ul><li>работает начиная с IE 5.5+ </li></ul></ul><ul><li>Однобайтовых кодировок нет </li></ul>
  10. 10. ActiveX <ul><li>Работает только в IE5, IE6 </li></ul><ul><li>Должны быть разрешены ActiveX </li></ul><ul><li>В IE 5.0 иногда возникают проблемы с кодировками (в backend передаются &quot;?&quot;) </li></ul>
  11. 11. ActiveX и XMLHttpRequest: кроссбраузерная инициализация <ul><li>var req = null; </li></ul><ul><li>if (window.XMLHttpRequest) { </li></ul><ul><li>// Mozilla, Safari и т . д . </li></ul><ul><li>req = new XMLHttpRequest(); </li></ul><ul><li>} else if (window.ActiveXObject) { </li></ul><ul><li>// Internet Explorer с включенными ActiveX. </li></ul><ul><li>try { </li></ul><ul><li>req = new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;) </li></ul><ul><li>} catch (e) { </li></ul><ul><li>try { </li></ul><ul><li>req = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;) </li></ul><ul><li>} catch (e) {} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>if (!req) { </li></ul><ul><li>alert(&quot;XMLHttpRequest не поддерживается в этом браузере !&quot;); </li></ul><ul><li>return; </li></ul><ul><li>} </li></ul>
  12. 12. <script> <ul><li>var script = document.createElement('script'); </li></ul><ul><li>script.src = 'script_backend.php?id=1&a=123'; </li></ul><ul><li>document.appendChild(script); </li></ul><?php $id = $_GET['id']; $a = $_GET['a']; $json = json_encode(process($a)); ?> dataReady({ id: &quot;<?=$id?>&quot;, data: <?=$json?> });
  13. 13. <script>: проблемы <ul><li>Поддерживается только GET </li></ul><ul><li>Нельзя передать много данных </li></ul><ul><li>Нужно явно передавать ID </li></ul><ul><li>Opera: загрузка <script> - блокирующая (синхронная) операция </li></ul><ul><li>Opera: только div.innerHTML = 'text<script></script>' </li></ul><ul><li>В некоторых браузерах не работает вообще (например, Opera 7.10) </li></ul>
  14. 14. <iframe> <ul><li>var iframe = document.createElement('iframe'); </li></ul><ul><li>iframe.name = 'dyna'; </li></ul><ul><li>document.appendChild(iframe); </li></ul><ul><li>form.target = iframe.name; </li></ul><ul><li>form.submit(); </li></ul><?php $id = $_GET['id']; $a = $_GET['a']; $json = json_encode(process($a)); ?> <script> dataReady({ id: &quot;<?=$id?>&quot;, data: <?=$json?> }); </script>
  15. 15. <iframe>: плюсы и минусы <ul><li>Плюсы </li></ul><ul><ul><li>нет проблем с русскими кодировками </li></ul></ul><ul><ul><li>отправка формы целиком </li></ul></ul><ul><ul><li>поддержка методов GET и POST </li></ul></ul><ul><ul><li>можно закачивать файлы </li></ul></ul><ul><ul><ul><li>element.cloneNode() не работает в Safari для файловых полей </li></ul></ul></ul><ul><li>Минусы </li></ul><ul><ul><li>щелчок </li></ul></ul><ul><ul><li>засорение history </li></ul></ul><ul><ul><li>баги в FF с кнопкой Назад </li></ul></ul><ul><ul><li>большой расход памяти </li></ul></ul><ul><ul><li>плохая кроссбраузерность </li></ul></ul>
  16. 16. <img> + cookies <ul><li>var img = document.createElement('img'); </li></ul><ul><li>img.src = 'img_backend.php?id=1&a=123'; </li></ul><ul><li>img.onload = function () { </li></ul><ul><li>alert(document.cookies); </li></ul><ul><li>} </li></ul><ul><li>document.appendChild(img); </li></ul><?php $data = process(); setcookie('result', json_encode($data), '/'); ?> <ul><li>Исключительно высокая кроссбраузерность ! </li></ul><ul><li>Но: должны быть включены cookies </li></ul>
  17. 17. Обзор всех методов : проблемы <ul><li>Совершенно разные интерфейсы </li></ul><ul><li>Трудно передавать сложные данные: { some: value, other: { key: value } } </li></ul><ul><li>Трудно принимать сложные данные </li></ul><ul><li>Разные методы для разных браузеров </li></ul><ul><li>Русскоязычные кодировки </li></ul><ul><li>Обработка ошибок в backend </li></ul>
  18. 18. Есть ли решение? <ul><li>ДА! </li></ul><ul><li>JsHttpRequest решает все перечисленные проблемы </li></ul>
  19. 19. Упрощенный интерфейс вызова <ul><li>// Frontend: JavaScript </li></ul><ul><li>JsHttpRequest.query( </li></ul><ul><li>address, // путь до b ackend </li></ul><ul><li>data, // массив / объект JavaScript </li></ul><ul><li>onreadyfunc(result, errors), // callback </li></ul><ul><li>nocache // если true , кэш запрещен </li></ul><ul><li>); </li></ul>// Backend: PHP require_once ' JsHttpRequest/JsHttpRequest.php&quot;; $JsHttpRequest =& new JsHttpRequest(&quot;windows-1251&quot;); ... // Получаем данные из $_GET, $_POST, $_FILES, $_REQUEST ... global $_RESULT; $_RESULT = array( данные для frontend- а)
  20. 20. Пример : suggest (frontend) <ul><li>JsHttpRequest.query( </li></ul><ul><li>// Адрес backend-сценария. </li></ul><ul><li>'suggest_backend.php', </li></ul><ul><li>// Так передаются параметры backend-у </li></ul><ul><li>{ </li></ul><ul><li>'str': st, // первые буквы слова </li></ul><ul><li>'num': 10 // число элементов списка для вывода </li></ul><ul><li>}, </li></ul><ul><li>// Функция вызывается, когда backend подготовил данные. </li></ul><ul><li>function(result, errors) { </li></ul><ul><li>// Записать сообщения об ошибках в <div>. </li></ul><ul><li>document.getElementById(&quot;debug&quot;).innerHTML = errors; </li></ul><ul><li>// Сформировать результат. </li></ul><ul><li>var list = document.getElementById(&quot;list&quot;); </li></ul><ul><li>list.length = 0; // удалить все строки списка </li></ul><ul><li>for (var i = 0; i < result.list.length; i++) { </li></ul><ul><li>list[i] = new Option(result.list[i]); </li></ul><ul><li>} </li></ul><ul><li>}, </li></ul><ul><li>// Не запрещать кэширование одинаковых запросов. </li></ul><ul><li>false </li></ul><ul><li>); </li></ul>
  21. 21. Пример : suggest (backend) <ul><li><?php </li></ul><ul><li>// Загрузить библиотеку JsHttpRequest. </li></ul><ul><li>require_once &quot;JsHttpRequest/JsHttpRequest.php&quot;; </li></ul><ul><li>// Инициализация. Обязательно указывайте кодировку сценария! </li></ul><ul><li>$JsHttpRequest =& new JsHttpRequest(&quot;windows-1251&quot;); </li></ul><ul><li>// Получить запрос: первые буквы слова и число элементов. </li></ul><ul><li>$str = $_REQUEST['str']; </li></ul><ul><li>$num = $_REQUEST['num']; </li></ul><ul><li>... </li></ul><ul><li>// Передать результат поиска во frontend. </li></ul><ul><li>global $_RESULT; </li></ul><ul><li>$_RESULT = array( </li></ul><ul><li>&quot;str&quot; => $str, </li></ul><ul><li>&quot;list&quot; => $found, </li></ul><ul><li>); </li></ul><ul><li>// Выводим также отладочную информацию. </li></ul><ul><li>echo sprintf(&quot;Выборка %d из %d слов.&quot;, count($found), count($words)); </li></ul><ul><li>?> </li></ul>
  22. 22. Закачка файлов &quot; AJAX- ом&quot; <ul><li>Проблема безопасности </li></ul><ul><li>Библиотеке передается не файл, а элемент выбора файла </li></ul><ul><li>Проблема в Safari: <input type=&quot;file&quot;> нельзя клонировать и перемещать в другую форму </li></ul>
  23. 23. Закачка файлов &quot; AJAX- ом&quot; <ul><li><form enctype=&quot;multipart/form-data&quot;> </li></ul><ul><li><input type=&quot;file&quot; name=&quot;e_file&quot; id= &quot;e_file&quot; > </li></ul><ul><li></form> </li></ul><ul><li>... </li></ul><ul><li>JsHttpRequest.query( </li></ul><ul><li>'backend.php', </li></ul><ul><li>{ </li></ul><ul><li>'str': { nested: st } , </li></ul><ul><li>' upl ' : document.getElementById( 'e_file' ) </li></ul><ul><li>}, </li></ul><ul><li>function(result, errors) { ... } </li></ul><ul><li>); </li></ul><?php ... $str = $_REQUEST['str']['nested']; // Работаем с $_FILES, как обычно! // Элемент в $_FILES приходит с именем &quot;upl&quot;, а не &quot;e_file&quot;. $tmpName = $_FILES[ 'upl' ]; ?>
  24. 24. Отправка формы целиком <ul><li><form enctype=&quot;multipart/form-data&quot; id= &quot;e_form&quot; > </li></ul><ul><li><input type=&quot;file&quot; name= &quot;e_file&quot; > </li></ul><ul><li><input type=&quot;text&quot; name=&quot;str&quot;> </li></ul><ul><li></form> </li></ul><ul><li>... </li></ul><ul><li>JsHttpRequest.query( </li></ul><ul><li>'backend.php', </li></ul><ul><li>document.getElementById( 'e_form' ) </li></ul><ul><li>function(result, errors) { ... } </li></ul><ul><li>); </li></ul><?php ... $str = $_REQUEST['str']; // Работаем с $_FILES, как обычно! // Имена элементов а $_REQUEST и $_FILES совпадают с // именами полей формы. $tmpName = $_FILES[ 'e_file' ]; ?>
  25. 25. Русскоязычные кодировки <ul><li>Работа с кодировками полностью прозрачна как для frontend, так и для backend </li></ul><ul><li>JsHttpRequest может работать с windows-1251 и koi8-r и при отсутствии iconv (собственные таблицы) </li></ul><ul><li>Для ускорения в PHP 5.2 автоматически используется json_encode() </li></ul>
  26. 26. Сессии <ul><li>Работа с сессиями полностью прозрачна и происходит стандартными средствами PHP </li></ul>
  27. 27. Выбор метода и загрузчика <ul><li>JsHttpRequest.query( </li></ul><ul><li>' GET backend.php', </li></ul><ul><li>... </li></ul><ul><li>); </li></ul><ul><li>JsHttpRequest.query( </li></ul><ul><li>' xml.POST backend.php', </li></ul><ul><li>... </li></ul><ul><li>); </li></ul><ul><li>JsHttpRequest.query( </li></ul><ul><li>' http://other.host.ru/ backend.php', </li></ul><ul><li>... </li></ul><ul><li>); </li></ul><ul><li>По умолчанию выбирается наилучший загрузчик и метод , совместимые с браузером </li></ul><ul><li>Возможна загрузка с &quot;чужого&quot; домена ( script, form) </li></ul>
  28. 28. Кэширование <ul><li>Четвертый параметр JsHttpRequest.query(). </li></ul><ul><li>Если кэширование включено, то при попытке повторной загрузки по тому же самому запросу данные берутся из кэша. </li></ul><ul><li>Не работает для закачки файлов, а также для отправки формы целиком. </li></ul>
  29. 29. Отладка и перехват ошибок в backend <ul><li><?php </li></ul><ul><li>require_once &quot;JsHttpRequest/JsHttpRequest.php&quot;; </li></ul><ul><li>$JsHttpRequest =& new JsHttpRequest(&quot;windows-1251&quot;); </li></ul><ul><li>... </li></ul><ul><li>ini_set('display_errors', true); </li></ul><ul><li>call_to_undefined_function(); </li></ul><ul><li>?> </li></ul>JsHttpRequest.query( 'backend.php', { ... }, function(result, errors) { if (errors) alert(errors); } ); <ul><li>Кто сказал, что фатальные ошибки PHP нельзя перехватить? </li></ul>
  30. 30. Отладка и перехват ошибок в backend <ul><li>Пример данных, сгенерированных backend- ом </li></ul>JsHttpRequest.dataReady({ &quot;id&quot;: &quot;123&quot;, &quot;js&quot;: { &quot;str&quot;: &quot;строка&quot;, . .. }, &quot;text&quot;: &quot;Сообщения и ошибки.&quot; })
  31. 31. Ошибки во frontend <ul><li>Все ошибки генерируются в виде исключений JavaScript : throw new Error(...) </li></ul><ul><li>'Invalid FORM element detected: name=%, tag=%', </li></ul><ul><li>'If used, <form> must be a single HTML element in the list.', </li></ul><ul><li>'JavaScript code generated by backend is invalid! %', </li></ul><ul><li>'Cannot use so long query with GET request (URL is larger than % bytes)', </li></ul><ul><li>'Unknown loader: %', </li></ul><ul><li>'No loaders registered at all, please check JsHttpRequest.LOADERS array', </li></ul><ul><li>'Cannot find a loader which may process the request. Notices are: %', </li></ul><ul><li>'Method setRequestHeader() cannot work together with the % loader.' </li></ul><ul><li>'Cannot use XMLHttpRequest or ActiveX loader: not supported', </li></ul><ul><li>'Cannot use XMLHttpRequest to load data from different domain %', </li></ul><ul><li>'Cannot use XMLHttpRequest loader or ActiveX loader, POST method: headers setting is not supported, needed to work with encodings correctly', </li></ul><ul><li>'Cannot use XMLHttpRequest loader: direct form elements using and uploading are not implemented' </li></ul><ul><li>'Cannot use SCRIPT loader: it supports only GET method', </li></ul><ul><li>'Cannot use SCRIPT loader: direct form elements using and uploading are not implemented' </li></ul><ul><li>'Element &quot;%&quot; does not belong to any form!', </li></ul><ul><li>'Element &quot;%&quot; belongs to a different form. All elements must belong to the same form!', </li></ul><ul><li>'Attribute &quot;enctype&quot; of the form must be &quot;%&quot; (for IE), &quot;%&quot; given.' </li></ul>
  32. 32. Интерфейс, совместимый с XMLHttpRequest <ul><li>var req = new XMLHttpRequest() ; </li></ul><ul><li>req.onreadystatechange = function() { </li></ul><ul><li>if (req.readyState == 4) { </li></ul><ul><li>alert(req.responseText); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>req.open(&quot;GET&quot;, 'backend.php', true); </li></ul><ul><li>req . send ( null ); </li></ul><ul><li>var req = new JsHttpRequest() ; </li></ul><ul><li>req.onreadystatechange = function() { </li></ul><ul><li>if (req.readyState == 4) { </li></ul><ul><li>alert(req.responseText); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>req.open(&quot;GET&quot;, 'backend.php', true); </li></ul><ul><li>req.send(null); </li></ul>Найдите 10 отличий… <ul><li>Элементарная интеграция с prototype js </li></ul><ul><li>Легкая миграция существующих приложений </li></ul>
  33. 33. Модульная архитектура <ul><li>Код библиотеки состоит из частей: </li></ul><ul><ul><li>Базовый модуль ( неотключаемый) </li></ul></ul><ul><ul><li>Модуль поддержки XML </li></ul></ul><ul><ul><li>Модуль поддержки script </li></ul></ul><ul><ul><li>Модуль поддержки form </li></ul></ul><ul><li>Любой модуль можно удалить из кода даже &quot;вручную&quot; </li></ul><ul><li>mini/JsHttpRequest-script.js: только загрузчик script (8.2 К) </li></ul><ul><li>mini/JsHttpRequest-script-xml.js: только script и xml </li></ul><ul><li>debug/*.js: полные версии исходников с комментариями </li></ul><ul><li>mini/*.js: &quot;минимизированные&quot; версии ( dojomin) </li></ul><ul><li>&quot;Минимизированная&quot; версия со всеми загрузчиками: 14К </li></ul>
  34. 34. Обеспечение кроссбраузерности <ul><li>Автоматизированный test framework </li></ul><ul><li>На каждый багфикс – один тест </li></ul><ul><li>На каждую сгенерированную ошибку – один тест </li></ul><ul><li>Главная сложность при тестировании – принципиальная асинхронность </li></ul>
  35. 35. Backend- ы на не -PHP <ul><li>За время существования библиотеки зарегистрированы случаи создания умельцами backend- модулей на: </li></ul><ul><ul><li>perl </li></ul></ul><ul><ul><li>c </li></ul></ul><ul><ul><li>parser </li></ul></ul><ul><li>К сожалению, все они не дотягивают до production- версий </li></ul><ul><li>Но никаких препятствий нет! </li></ul>
  36. 36. Резюме <ul><li>Кроссбраузерность (IE5.0+ без ActiveX , Mozilla 1.7+, Firefox 1.0+, Opera 7.20+, Safari ) </li></ul><ul><li>Прозрачная работа с русскими кодировками </li></ul><ul><li>Закачка файлов методом AJAX </li></ul><ul><li>Поддержка отладочных возможностей PHP </li></ul><ul><li>Двусторонняя передача многомерных структур PHP <-> JavaScript </li></ul><ul><li>Поддержка сессий PHP </li></ul><ul><li>Выбор оптимального загрузчика </li></ul><ul><li>Компонентность </li></ul><ul><li>Совместимый с XMLHttpRequest интерфейс </li></ul>
  37. 37. Приходите к нам работать! <ul><li>МойКруг.ру теперь – сервис Я ндекса </li></ul><ul><li>Мы расширяем свою команду! </li></ul><ul><li>Открыты вакансии для: </li></ul><ul><ul><li>верстальщиков со знанием Smarty </li></ul></ul><ul><ul><li>отличных PHP- программистов </li></ul></ul>Ждем Ваши резюме на http://moikrug.ru/hire/

×