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

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

Привет!

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

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

Кратко про AJAX

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

  • объект XMLHttpRequest;
  • динамичное создание фреймов;
  • динамичное создание тегов <script>.

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

Реализация на 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, про который Жека упоминал в статье про загрузчики файлов. Да, он использует флеш (как свяжующее звено клиента и сервера), но зато он поддерживает очереди, может показать кучу данных о процессе загрузки и, что самое главное, его можно до неузнаваемости изменить стилями.

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

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

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

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

Оказался не на свой строчке:
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(); // отправляем запрос

БОШ
Вместо
e = new Event(e); e.preventDefault(); // блокируем стандартное действие при клике
достаточно
e.stop()
Ведь e мы и так передаем в параметре функции


onComlete - пропущена буква
Dr.Death
для отправки файлов юзаю собственно написаный класс, шлет через iframe, синтаксис похож на стандартный аякс мутулза :)
options = {
	id: form_id,
	url: custom_url,
	data: { field:value },
	onStart: function() {
	},
   	onComplete: function(result) {
	}
}
new fileByAjax(options);
Dr.Death
2БОШ у меня бывали случаи когда e.stop() не работало, а new Event(e).stop() все делало как надо, с чем связано не понятно
Алик Кириллович
@БОШ, @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, в том числе такие основные моменты, как события. Что, конечно-же, плохо.
Grin
Алекс Алик, Бош, спасибо, исправил опечатки
Алик Кириллович
>Алекс, Бош, спасибо, исправил опечатки

Если Вы имеете в виду меня, то я не Алекс, а Алик :-)
Grin
Спасибо, Алик.
Что-то часто я стал опечатываться ;-)
Саша Кириллов
Сижу читаю статью.

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

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

Лучше написать сразу код, чтобы я мог его взять и вставить. Потому что эти куски кода для нас, гидроцефалов, не знающих Джаваскрипт, единственные лучики света в темном царстве. Чем их больше в статье, тем больше благодаришь Аллаха, ниспославшего тебе ее и автора.
Алексей Ярошевич
Столкнулся с проблемой Form.Send в опере. Везде работает, а в опере пост пустой...
Может сталкивался кто?..
Владимир
Господа, у меня почему-то не работает последний скрипт. Я его немного преобразовал и получилось во что:

window.addEvent('domready', function() {

$('send_form').addEvent('click', function(e){
e = new Event(e); e.preventDefault(); // отменяем переход по ссылке
$('log').setHTML("Идет обработка запроса...");

var f = $('userform');
f.set('send', {
url: 'index.php?option=com_bullboard&task=addrequest&format=row',
onSuccess: function(responseText) {
$('log').setHTML(responseText);
}
});

});
});

то есть когда я кликаю по ссылке должна отправится форма userform, но этого не происходит. Подскажите почему?
Bar
Пробую стандартными методами с помощью Mootools1.4, сделать AJAX подгруздку некоторых элементов контента определенной страницы, пробую через объект Request.HTML, запрос отправляется, сервер дает ответ в форме хтмл кода запрашеваемой страницы, Не могу никак вытенуть с этой страницы то что мне нужно, пробовал методом подгрузить полученный результат в контейнер и разобрать его, потом поставить на нужные мне места, но думаю, должно быть проще решение+ при таком методе который я описал - получаю только HTML код Body без Head, не имею доступ до title, description загружаемой страницы, может кто подскажет как их вытянуть из обэкта, в который загружается запрошенная страница, может есть где пример.
Заранее спасибо за ответы.
#
Bar

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
counter strike mt2 silkroad pvp metin2 metin2 pvp knight pvp gm olarak başlayan pvpler pvp silkroad pvp serverler counter strike serverler msn show cam show görüntülü sohbet oyunlar suskunlar gazete oku