22 декабря 2015
1 мая 2009
12
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, про который Жека упоминал в статье про загрузчики файлов. Да, он использует флеш (как свяжующее звено клиента и сервера), но зато он поддерживает очереди, может показать кучу данных о процессе загрузки и, что самое главное, его можно до неузнаваемости изменить стилями.
Как всегда тешу себя мыслью, что статья вам чем-то помогла ;-) Вопросы, пожелания, уточнения — в комментарии.
Оказался не на свой строчке:
Вообще стал закомментирован:
Т.е. у вас вот так:
..а должно быть вот так:
onComlete - пропущена буква
>у меня бывали случаи когда e.stop() не работало, а new Event(e).stop() все делало как надо, с чем связано не понятно
e.stop() не будет работать в Internet Explorer.
Это связано с несовместимостью стандартной модели событий W3C (которую поддерживают все «нормальные» браузеры: Firefox, Opera, Safari, Chrome и т.д.) и «самапальной» модели IE.
В W3C-шной модели, события передаются через параметр функции обработчика события:
В модели IE событие передается через window.event:
Кроме этого, есть еще много несоответствий, например правильно назначать/снимать события с помощью addEventListener/removeEventListener, а в IE: attachEvent/detachEvent.
JavaScript-библиотеки (такие как jQuery, Mootools или Prototype.js) инкапсулируют эту несовместимость в объекте Event, который сам определяет браузер пользователя, и автоматически запускает подходящий код: либо с параметром e, либо с window.event.
С одной стороны это очень хорошо, т.к. библиотеки выполняют за нас всю черновую работу, и избавляет от написания лишних проверок.
Но с другой стороны, многие подсевшие на библиотеки разработчики забывают сам JavaScript, в том числе такие основные моменты, как события. Что, конечно-же, плохо.
АлексАлик, Бош, спасибо, исправил опечаткиЕсли Вы имеете в виду меня, то я не Алекс, а Алик :-)
Что-то часто я стал опечатываться ;-)
Все клево и довольно понятно (хотя по манере комментирования нас ждет серьезный разговор). Но для таких даунов как я вот такие вот пассажи не катят:
Все очень просто. У объекта Request есть события onRequest (запрос начался) и onComplete (кончился) — с помощь первого показываем загрузчик, с помощью второго скрываем.
Лучше написать сразу код, чтобы я мог его взять и вставить. Потому что эти куски кода для нас, гидроцефалов, не знающих Джаваскрипт, единственные лучики света в темном царстве. Чем их больше в статье, тем больше благодаришь Аллаха, ниспославшего тебе ее и автора.
Может сталкивался кто?..
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, но этого не происходит. Подскажите почему?
Заранее спасибо за ответы.