Mootools для начинающих, урок №3

1 мая 2009, 14:30 Павел Марковнин JavaScript рейтинг +25-

Mootools для начинающихПривет!

Всех с праздником (кстати, что за праздник-то?) и, самое главное, лишним выходным ;-) Сегодня мы продолжим знакомство с фреймворком Mootools. Напомню, что мы уже успели рассмотреть работу с DOM, селекторы, привязку событий и что-то еще между делом.

В этот же раз мы рассмотрим то, ради чего большинство людей и используют JS-фреймворки — да, вы угадали, это AJAX.

Кратко про AJAX

Этот параграф для тех, кто мог до этого не знать, что же такое AJAX. Как говорит нам Википедия, это «асинхронный JavaScript и XML».  Асинхронность выражается в добавлении каких-то данных на страницу без ее перезагружки. Сама задача подгрузки контента реализуется джаваскриптом тремя способами:

Два последних способа, конечно, имеют свои плюс, но в большинстве случаев использование объекта намного удобнее и разумнее.

Реализация на Mootools

Все строится на основе объекта Request — он является «оболочкой» объекта XMLHttpRequest. У этого объекта довольно много опций, так что мы будем по ходу дела что-то из них рассматривать. У этого объекта так же есть события — чаще всего вы будете использовать onSuccess и onFailure.

В общем, давайте рассмтрим что-нибудь на примере. Скажем, у вас есть ссылка, нужно при клике на нее послать запрос на сервер по адресу, который указан в href ссылки. Это можно сделать так:

<a href="http://yandex.ru/" id="my-link">Яндекс</a>
<script type="text/javascript">
window.addEvent('domready', function() {
$('my-link').addEvent('click', function(e) {
e = new Event(e); e.preventDefault(); // блокируем стандартное действие при клике
// создаем объект запроса
var r = new Request({
method: 'get', // GET запрос
url: this.href // адрес запроса берем из адреса ссылки
});
r.send(); // отправляем запроса
});
});
</script>

Это был самый простой пример. А теперь допустим, что в случае успешной отправки запроса, нам нужно показать юзеру ту информацию, которую вернул запрашиваемый скрипт, в противном случае — сказать, что что-то не так.

<a href="http://yandex.ru/" id="my-link">Яндекс</a> 
<script type="text/javascript">
window.addEvent('domready', function() {
$('my-link').addEvent('click', function(e) {
e = new Event(e); e.preventDefault(); // блокируем стандартное действие при клике
// создаем объект запроса
var r = new Request({
method: 'get', // GET запрос
url: this.href // адрес запроса берем из адреса ссылки
onSuccess: function(responseText) { // это мы делаем, когда все ок
alert(responseText); // показываем текст ответа
},
onFailure: function() { // если все плохо
alert('К сожалению, сервер упал и ничего не работает :(');
}
});
r.send(); // отправляем запрос
});
});
</script>

Вот, уже что-то полезное сделать сможем. Кстати сказать, как-то так у нас сделано голосование за статьи, но только реализация на jQuery.

Теперь предлагаю рассмотреть вариант с отправкой формы. В предыдущих примерах мы уже использовали функцию send() для отправки запроса. А для того, чтобы просто отослать форму без перезагрузки страницы достачно сделать вот так:

<form id="my-form" ... > ... </form> 
<script type="text/javascript">
...
$('my-form').send(); // и форма ушла ;-)
...
</script>

Но таких простых случаев практически никогда не бывает, чаще приходиться как-то изменять данные формы перед отправкой.

<form id="my-form" ... > ... </form>
<script type="text/javascript">
var f = $('my-form');
f.set('send', {
url: 'custom-url.php',
onSuccess: function(responseText) {
alert('Cервер отвечает: ' + responseText);
}
});
</script>

Заметили, что все параметры, которые мы указывали для объекта Request, теперь указываем как параметры send();

Думаю, многие спросят, а как же сделать все эти клевые крутящиеся статусы загрузки? Все очень просто. У объекта Request есть события onRequest (запрос начался) и onComplete (кончился) — с помощь первого показываем загрузчик, с помощью второго скрываем.

Заключение

Ну что ж, сегодня мы посмотрели, как делать AJAX на Mootools. Хотелось бы заметить, что Mootools сам не умеет загружать файлы на сервер — то есть не пытайтесь с помощью приведенных выше техник отправить файл, ничего не выйдет. Самый лучший способ залить файл на сервер с помощью Mootools это плагин FancyUpload, про который Жека упоминал в статье про загрузчики файлов. Да, он использует флеш (как свяжующее звено клиента и сервера), но зато он поддерживает очереди, может показать кучу данных о процессе загрузки и, что самое главное, его можно до неузнаваемости изменить стилями.

Как всегда тешу себя мыслью, что статья вам чем-то помогла ;-) Вопросы, пожелания, уточнения — в комментарии.

Рекламное место, которое может стать вашим

Понравилась статья?

Тогда подпишись на обновления через RSS или воспользуйся
другими способами подписки.

Читать в Яндекс.Ленте Добавить в Google Добавить в Netvibes
  •  

Комментарии — 10

RSS
  • Аватарка
    1 мая 2009 в 19:56 ]]>Алик Кириллович]]>
    Сбилось форматирование во втором примере кода (который в с случае успешной отправки запроса показывает юзеру ту информацию, которую вернул запрашиваемый скрипт, а в противном случае — говорит, что что-то не так).

    Оказался не на свой строчке:
    r.send(); // отправляем запрос

    Вообще стал закомментирован:
    onSuccess: function(responseText)

    Т.е. у вас вот так:
    // создаем объект запроса
    var r = new Request({
      method: 'get', // GET запрос
      url: this.href // адрес запроса берем из адреса ссылки             onSuccess: function(responseText) { // это мы делаем, когда все ок                 alert(responseText); // показываем текст ответа             },             onFailure: function() { // если все плохо                 alert('К сожалению, сервер упал и ничего не работает :(');             }
      });         r.send(); // отправляем запрос

    ..а должно быть вот так:
    // создаем объект запроса
    var r = new Request({
      method: 'get', // GET запрос
      url: this.href // адрес запроса берем из адреса ссылки
      onSuccess: function(responseText){
        // это мы делаем, когда все ок
        alert(responseText); // показываем текст ответа
        },
      onFailure: function(){
        // если все плохо
        alert('К сожалению, сервер упал и ничего не работает :(');
        }
      });
    r.send(); // отправляем запрос

  • Аватарка
    1 мая 2009 в 20:22 ]]>БОШ]]>
    Вместо
    e = new Event(e); e.preventDefault(); // блокируем стандартное действие при клике
    достаточно
    e.stop()
    Ведь e мы и так передаем в параметре функции


    onComlete - пропущена буква
  • Аватарка
    1 мая 2009 в 20:26 ]]>Dr.Death]]>
    для отправки файлов юзаю собственно написаный класс, шлет через iframe, синтаксис похож на стандартный аякс мутулза :)
    options = {
    	id: form_id,
    	url: custom_url,
    	data: { field:value },
    	onStart: function() {
    	},
       	onComplete: function(result) {
    	}
    }
    new fileByAjax(options);
  • Аватарка
    1 мая 2009 в 20:30 ]]>Dr.Death]]>
    2БОШ у меня бывали случаи когда e.stop() не работало, а new Event(e).stop() все делало как надо, с чем связано не понятно
  • Аватарка
    1 мая 2009 в 21:17 ]]>Алик Кириллович]]>
    @БОШ, @Dr.Death
    >у меня бывали случаи когда e.stop() не работало, а new Event(e).stop() все делало как надо, с чем связано не понятно

    e.stop() не будет работать в Internet Explorer.

    Это связано с несовместимостью стандартной модели событий W3C (которую поддерживают все «нормальные» браузеры: Firefox, Opera, Safari, Chrome и т.д.) и «самапальной» модели IE.

    В W3C-шной модели, события передаются через параметр функции обработчика события:
    $("my-link").addEvent("click", function(e) {/*Работаем с событием e*/}

    В модели IE событие передается через window.event:
    $("my-link").addEvent("click", function(e) {/*Работаем с событием window.event, параметр e - пустой и вернет undefined*/}

    Кроме этого, есть еще много несоответствий, например правильно назначать/снимать события с помощью addEventListener/removeEventListener, а в IE: attachEvent/detachEvent.

    JavaScript-библиотеки (такие как jQuery, Mootools или Prototype.js) инкапсулируют эту несовместимость в объекте Event, который сам определяет браузер пользователя, и автоматически запускает подходящий код: либо с параметром e, либо с window.event.

    С одной стороны это очень хорошо, т.к. библиотеки выполняют за нас всю черновую работу, и избавляет от написания лишних проверок.

    Но с другой стороны, многие подсевшие на библиотеки разработчики забывают сам JavaScript, в том числе такие основные моменты, как события. Что, конечно-же, плохо.
  • Аватарка
    1 мая 2009 в 22:46 ]]>Grin]]>
    Алекс Алик, Бош, спасибо, исправил опечатки
  • Аватарка
    1 мая 2009 в 22:54 ]]>Алик Кириллович]]>
    >Алекс, Бош, спасибо, исправил опечатки

    Если Вы имеете в виду меня, то я не Алекс, а Алик :-)
  • Аватарка
    1 мая 2009 в 23:01 ]]>Grin]]>
    Спасибо, Алик.
    Что-то часто я стал опечатываться ;-)
  • Аватарка
    27 мая 2009 в 2:44 ]]>Саша Кириллов]]>
    Сижу читаю статью.

    Все клево и довольно понятно (хотя по манере комментирования нас ждет серьезный разговор). Но для таких даунов как я вот такие вот пассажи не катят:

    Все очень просто. У объекта Request есть события onRequest (запрос начался) и onComplete (кончился) — с помощь первого показываем загрузчик, с помощью второго скрываем.

    Лучше написать сразу код, чтобы я мог его взять и вставить. Потому что эти куски кода для нас, гидроцефалов, не знающих Джаваскрипт, единственные лучики света в темном царстве. Чем их больше в статье, тем больше благодаришь Аллаха, ниспославшего тебе ее и автора.
  • Аватарка
    1 июля 2009 в 14:26 ]]>Алексей Ярошевич]]>
    Столкнулся с проблемой Form.Send в опере. Везде работает, а в опере пост пустой...
    Может сталкивался кто?..
  • Эл. почта (используется для Граватарки)
  • Домашняя страница
  • Имя в Твиттере
  • Разрешенные теги Текст сообщения (надо бы заполнить это поле)
  • как выглядит какой тег
    жирный текст <b>жирный текст</b>
    курсивный тект <i>курсивный тект</i>
    зачеркнутый текст <s>зачеркнутый текст</s>
    подчеркнутый текст <u>подчеркнутый текст</u>
    ссылка <a href="адрес">ссылка</a>
    function foo() { ... }
    <pre><code>function foo() { ... } </code></pre>