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>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler