Презентацию к данной лекции Вы можете скачать здесь.
Несмотря на происхождение от
Практическая польза использования eval() ). Кроме того, в
Следующий пример показывает
{
"firstName": "Иван",
"lastName": "Иванов",
"address": {
"streetAddress": "Московское ш., 101, кв.101",
"city": "Ленинград",
"postalCode": 101101
},
"phoneNumbers": [
"916 123-4567"
]
}
На языке XML подобная структура выглядела бы примерно так:
<person>
<firstName>Иван</firstName>
<lastName>Иванов</lastName>
<address>
<streetAddress>Московское ш., 101, кв.101</streetAddress>
<city>Ленинград</city>
<postalCode>101101</postalCode>
</address>
<phoneNumbers>
<phoneNumber>916 123-4567</phoneNumber>
</phoneNumbers>
</person>
Следующий фрагмент XMLHttpRequest, чтобы запрашивать с сервера объект в формате
var the_object;
var http_request = new XMLHttpRequest();
http_request.open("GET", url, true);
http_request.send(null);
http_request.onreadystatechange = function() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
the_object = eval("(" + http_request.responseText + ")");
} else {
alert("Проблема с URL.");
}
http_request = null;
}
};
Полезность XMLHttpRequest ограничивается политикой ограничения домена: URL ответа на запрос должен проживать в том же DNS домене, что и сервер, на котором находится страница, содержащая запрос.
Браузеры могут также использовать элементы <iframe> асинхронный запрос <form action="url_to_cgi_script" target="name_of_hidden_iframe"> представлений. Эти подходы были распространены до появления широкой поддержки XMLHttpRequest.
Хотя eval() без какой-либо предварительной проверки.
Поскольку eval(), которая предназначена для выполнения
Техника использования eval() делает систему уязвимой, если источник используемых eval() полученные от внешнего источника данные могут проверяться с помощью регулярных выражений. В RFC, определяющей
var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g, ''))) eval('(' + text + ')');
Как более безопасная альтернатива eval() была предложена новая функция parseJSON(), способная обрабатывать только
Непродуманное использование <script> допускает использование источника, не принадлежащего к тому же домену, что и использующий ресурс, это позволяет выполнять код под видом данных, представленных в формате
Это представляется проблемой только в случае содержания в
С версии 2.1 библиотека
Начиная с версии Ext JS 3.0, библиотека разбивается на две части: Ext Core (набор
Одна из задач, которую ставили себе разработчики библиотеки
Синтаксис:
Ext.namespace( String namespace1, String namespace2, String etc ) : void
В языке Ext.ux.graphing.GraphPanel перестают быть редкостью. В Ext.namespace, который позволяет определить все пространства имен за один вызов, уменьшая не только затраты на поддержку кода, но и сокращая его размер.
Традиционный код
var Ext = Ext || {};
Ext.ux = Ext.ux || {};
Ext.ux.graphing = Ext.ux.graphing || {};
Ext.ux.soundFx = Ext.ux.soundFx || {};
Ext.ux.maps = Ext.ux.maps || {};
Того же результата можно достичь вызовом всего одного метода:
Ext.namespace("Ext.ux.graphing", "Ext.ux.soundFx", "Ext.ux.maps");
Синтаксис:
Ext.override( Object origclass, Object overrides ) : void
// создаем функцию
function doesStuff() {
alert("Функция один!");
};
// теперь ее перекрываем
doesStuff = function() {
alert("Функция два!");
};
Перекрытие метода класса осуществляется путем переопределения его прототипа:
function MyClass() {
// конструктор класса
}
MyClass.prototype.myMethod = function() {
alert("привет");
};
var x = new MyClass();
x.myMethod(); // отобразит "привет"
MyClass.prototype.myMethod = function() {
alert("пока");
};
x.myMethod(); // отобразит "пока"
Используя тот же способ, разработчик может добавить новые методы в существующий класс.
Ext.override – это удобный способ переопределения методов класса за один присест. Следующий пример перекрывает два метода класса Ext.ux.graphing.GraphPanel. Следуя общепринятым правилам языка
Ext.override(Ext.ux.graphing.GraphPanel, {
clearAllPoints: function() {
// выполнить другие действия
},
loadData: function(newData) {
// загрузка новых данных
}
});
Этот простой метод имеет огромное значение при поддержке собственных изменений в чужом коде. Опытные Ext.override, разработчики могут поместить свой код в отдельный файл, связать его со сторонней библиотекой и быть уверенными, что в новом релизе ничего не сломается.
Синтаксис:
Ext.extend( Function superclass, Object overrides ) : Function
или
Ext.extend( Function subclass, Function superclass, [Object overrides] ) : Function
Рассмотренный ранее метод Ext.override выполняет замену реализации на новый метод целиком, а Ext.extend позволяет осуществить полноценное наследование согласно парадигме ООП. Имеются два варианта вызова этого метода, каждый из которых возвращает определение нового класса, содержащего объекты, унаследованные от родительского, определенного в параметре superclass, и перекрывает методы, заданные в параметре overrides. Также он добавляет к новому классу служебный метод override(), который дает возможность перекрывать , позволяющее получить доступ к родительскому объекту.
Библиотека
Ниже приведен пример использования Ext.extend. Обратите внимание, что имеются два способа наследования. Первый:
var newClass = Ext.extend(Ext.form.ComboBox, {
constructor: function(config) { // явное задание конструктора
config.emptyText = "'5' не допускается";
newClass.superclass.constructor.call(this, config);
},
setValue: function(v) {
if (v == 5) { // если v равно 5, сообщить пользователю
alert("'5' не допускается");
} else { // иначе вызываем метод родителя
newClass.superclass.setValue.call(this, v);
}
}
});
Второй:
function newClass(config) { // конструктор
config.emptyText = "'5' не допускается";
newClass.superclass.constructor.call(this, config);
};
Ext.extend(newClass, Ext.form.ComboBox, {
setValue: function(v) {
if (v == 5) { // если v равно 5, сообщить пользователю
alert("'5' не допускается");
} else { // иначе вызываем метод родителя
newClass.superclass.setValue.call(this, v);
}
}
});
Так как все объекты config.
Синтаксис:
Ext.apply( Object obj, Object config, [Object defaults] ) : Object
Метод Ext.apply производит копирование каждого члена объекта config в объект obj. Опционально может быть задан параметр defaults, содержимое которого также копируется в объект obj, но перед выполнением копирования объекта config.
Синтаксис:
Ext.applyIf( Object obj, Object config ) : Object
Метод Ext.applyIf производит копирование каждого члена объекта config в объект obj, но только в том случае, когда этот член еще не существует в объекте назначения.
Обычно разработчики создают
function MyClass(config) { // конструктор, который принимает конфигурацию в параметре 'config'
// присвоение некоторых значений по умолчанию, если они не заданы в конфигурации
config = Ext.applyIf(config, {
someValue: defaultValue
});
// а здесь присваиваются значения по умолчанию, игнорирующие параметры конструктора
config = Ext.apply(config, {
someOtherValue: defaultValue
});
// вызов конструктора класса-родителя с передачей новой конфигурации
MyClass.superclass.constructor.call(this, config);
}
// не забудьте унаследовать родительский класс
Ext.extend(MyClass, MyBase, {
// ...
});
Библиотека
Самым мощным и известным компонентом является таблица или Grid. Он позволяет выполнять группировку, сортировку и Grid предоставляет возможность редактировать данные, причем при установке некоторых расширений, этот компонент позволит не только редактировать данные в строках, но и будет автоматически создавать всплывающие формы.
Каждый компонент в
В архитектуре библиотеки есть и такое понятие как тема оформления – это обычный CSS-файл, изменяя который можно мгновенно изменить внешний вид всех элементов интерфейса. Уже создано множество различных пользовательских тем, в разной цветовой гамме и стиле, хотя, на мой взгляд, именно стандартная тема наиболее приятная и привычная для большинства пользователей.
Для рассмотрения библиотеки
Самый нижний слой – это низкоуровневые функции по работе с DOM-деревом, событиями, стилями и другие функции. Здесь можно использовать адаптеры для подключения нескольких библиотек. В особенности это нужно, когда необходимо смешать в одном приложении функциональность, к примеру,
Core – это основные базовые модули и функционал, который необходим для работы всех остальных компонентов библиотеки и приложения. Он разбит на несколько модулей:
Работа с данными. Так как любое веб-приложение основано на каких-то данных, то этот слой в библиотеке не менее насыщенный различным функционалом, чем визуальные компоненты. Обмен данными с сервером может вестись в двух форматах –
Вся работа с данными построена на следующей компонентной схеме:
Исходя из нужного функционала, можно использовать компоненты, которые работают с
Помимо замещения всех стандартных для форм элементов,
Управление общей компоновкой обеспечивают компоненты группы Layout, которые позволяют разметить блоками всю область окна приложения и в дальнейшем работать с ними по отдельности, обеспечивая в то же время общую целостность интерфейса и его структуры (рис. 13.1). Отдельные части страницы можно сворачивать, скрывая полностью или менять их размер, передвигать границы областей – все, что привыкли делать пользователи в обычных приложениях.
(рис 13.1) Управление общей компоновкойДинамическая подсказка или Tooltip – позволяет для любого элемента на странице (как визуального, так и к любому DOM-объекту) прицепить подсказку, которая будет показана при наведении мыши. Сама подсказка может содержать в себе произвольный HTML-код, изображения и даже быть контекстно-зависимой – подгружаться через
При необходимости можно подключать и использовать множество виджетов – кнопки (разного вида, с изображениями и текстом, кнопки-переключатели, кнопки с выпадающим меню и т.п.), меню (как контекстные, так и тулбары с меню, совсем как в обычных приложениях), индикаторы загрузки и прогресс-бары. Есть и такое, свойственное только Веб-приложениям решение, как Loading Mask, которое позволяет "заморозить" для пользователя все приложение на то время, пока получаются и обновляются данные с сервера. Есть и функциональные компоненты для выбора даты и цвета, есть компоненты для вывода сообщений, как модальные MessageBox, так и полноценные окна, в которые, в свою очередь, можно вставлять любые элементы управления или разделять их закладки, сворачивать и развертывать, перетаскивать по экрану и т.п.
Таб-панель – еще один мощный компонент для построения тех приложений, которые, с одной стороны, требуют, чтобы пользователю показывалось сразу много разной информации, формы, таблицы и другие объекты, в то же время нужны ограничения, и в каждый момент времени показывать только самое необходимое. Для такого структурирования широко применяют вкладочный интерфейс. Даже диалоговые окна в
Tree – часто используемый компонент, позволяющий группировать иерархические структуры и отображать их с любой глубиной вложенности, автоматически подгружая новые элементы, менять местами, перетаскивая мышью отдельные элементы и другие стандартные операции (рис. 13.2). В последних версиях деревья были расширенны путем добавления функций редактирования элементов прямо на месте отрисовки (Inline item editing).
(рис 13.2) TreeФорма является одной из основных высокоуровневых абстракций библиотеки, и использует почти все из описанных компонентов, в частности большинство визуальных виджетов, которые расширяют стандартные элементы форм. Она также использует слой доступа к данным для заполнения некоторых компонентов (например, ComboBox может получать данные от сервера). В
Таблица Grid – самый востребованный и самый мощный из компонентов, которым располагает разработчик на
(рис 13.3) AJAX ТаблицаРазвитие библиотеки не стоит на месте. Например, вместе с выходом среды
Заявлено, что данный фреймворк поддерживается следующими браузерами: Internet Explorer 6.0+, Mozilla Firefox 1.5+, Apple Safari 2.0+ и Opera 9.25+.
В XMLHttpRequest. Ниже приведены некоторые примеры.
Для обращения к DOM элементу HTML-страницы обычно используется функция:
document.getElementById:
document.getElementById("id_of_element")
Функция $() уменьшает код до [8]:
$("id_of_element")
Но в отличие от функции DOM, функции $() можно передавать более одного аргумента и функция вернет массив ( Array ) объектов со всеми соответствующими элементами:
var ar = $('id_1', 'id_2', 'id_3');
for (i = 0; i < ar.length; i++) {
alert(ar[i].innerHTML);
}
Например, для указания цвета текста можно использовать следующий код:
$("id_of_element").style.color = "#ffffff";
Или, используя расширенные функции
$("id_of_element").setStyle({ color: '#ffffff' });
Код для версий ниже 1.5:
Element.setStyle("id_of_element", { color: "#ffffff" });
Функция $$() используется для разделения CSS от контента. Она разбивает один или несколько CSS фильтров, которые поступают на вход в виде выражения подобного регулярному выражению и возвращает элементы, которые соответствуют этим фильтрам. Например, при выполнении данного скрипта:
var f = $$('div#block .inp');
получим массив, содержащий все элементы с классом .inp, которые находятся в контейнере div с идентификатором id="block".
Похожая на $(), функция $F() возвращает значение определенного элемента HTML формы. Для текстового поля функция будет возвращать данные, содержащиеся в элементе. Для элемента "select" функция возвратит выбранное в текущий момент значение:
$F("id_of_input_element")
Функция $A() преобразует один аргумент, который она получает, в объект Array. Эта функция, в сочетании с расширениями для класса Array, облегчает конвертирование или копирование любых перечислимых списков в объект Array. Один из вариантов использования заключается в том, чтобы преобразовать DOM NodeLists в регулярные массивы, которые могут быть более эффективно использованы.
Функция $H() преобразовывает объекты в перечислимые Хэш-объекты, которые похожи на ассоциативный массив:
//Допустим имеем объект:
var hash = { method: post, type: 2, flag: t };
//При использовании функции:
var h = $H(hash);
//Получим:
alert(h.toQueryString());
//На экране будет отображено: posttype=2flag=t
Объект XMLHttpRequest, без необходимости подстраивать код под нужный браузер. Существует два способа вызова объекта: Ajax.Request возвращает XML вывод Ajax.Updater помещает ответ сервера в выбранную ветвь DOM.
Ajax.Request в примере ниже находит значения двух полей ввода, запрашивает страницу с сервера, используя значения в виде POST -запроса, а после завершения выполняет пользовательскую функцию showResponse():
var val1 = escape($F("name_of_id_1"));
var val2 = escape($F("name_of_id_2"));
var url = "http://yourserver/path/server_script";
var pars = { value1: val1, value2: val2 };
var myAjax = new Ajax.Request(
url,
{
method: "post",
parameters: pars,
onComplete: showResponse
});
Методы класса предназначены для работы с элементами HTML. Для создания HTML элемента используется конструктор класса:
new Element(tagName[,{attributes}])
В конструктор передается HTML-тег в строковом виде и, если необходимо, атрибуты тега.
Пример создания нового элемента:
// Создаем элемент <div> в памяти и указываем атрибуты id, class
var newElement = new Element('div',{id: 'childDiv', class: 'divStyle'});
// Включаем созданный элемент в DOM браузера, а именно в существующий <div> с помощью метода Element.insert
Element.insert($('parrentDiv'),newElement);
Для создания нового класса используется метод Class.create(). Классу присваивается прототип prototype, который выступает в качестве основы для каждого экземпляра класса. Старые классы могут быть расширены новыми с помощью Object.extend:
// создания нового класса в стиле prototype 1.6
var FirstClass = Class.create({
// Инициализация конструктора
initialize: function() {
this.data = "Hello World";
}
});
// создания нового класса в стиле prototype 1.5
var DataWriter = Class.create();
DataWriter.prototype = {
printData: function() {
document.write(this.data);
}
};
Object.extend(DataWriter, FirstClass);
Возможности:
Точно так же, как CSS отделяет визуализацию от структуры HTML,
Библиотека
<head>
<script type="text/javascript" src="путь/к/jQuery.js"></script>
</head>
Вся работа с $. Если на сайте применяются другие $ может использоваться для своих нужд, то можно использовать ее синоним –
jQuery(function($) {
// Тут код скрипта, где в $ будет jQuery
})
Работу с
$(). Например, передав в нее CSS-селектор, можно получить $, например, удобных итераторов по массиву.Типичный пример манипуляции сразу несколькими узлами DOM заключается в вызове $ функции со строкой селектора CSS, что возвращает объект , содержащий некоторое количество элементов HTML-страницы. Эти элементы затем обрабатываются методами
$("div.test").add("p.quote").addClass("blue").slideDown("slow");
находит все элементы <div> с классом test, а также все элементы <p> с классом quote, и затем добавляет им всем класс blue и визуально плавно спускает вниз.
Методы, начинающиеся с $., удобно применять для обработки глобальных объектов. Например:
$.each([1, 2, 3], function() {
document.write(this + 1);
});
добавит на страницу 234.
Оператор $.ajax и соответствующие функции позволяют использовать методы
$.ajax({
type: "POST",
url: "some.html",
data: { name: 'John', location: 'Boston' },
success: function(msg) {
alert("Data Saved: " + msg);
}
});
В этом примере идет обращение к скрипту some. HTML с параметрами name=Johnlocation=Boston и полученный результат выдается в сообщении посредством alert().
Пример добавления к элементу обработчика события click с помощью
jQuery(function($) {
$("a").click(function() {
alert("Привет, Мир!");
});
});
В данном случае при нажатии на элемент <A> происходит вызов alert("Привет, Мир!").
Рассмотрим пример, в котором необходимо раскрасить таблицу в следующем стиле [11, 12]:
| Один | Два | Три | Четыре |
|---|---|---|---|
| Один | Два | Три | Четыре |
| Один | Два | Три | Четыре |
| Один | Два | Три | Четыре |
| Один | Два | Три | Четыре |
| Один | Два | Три | Четыре |
| Один | Два | Три | Четыре |
Предполагается, что есть CSS-файл, в котором определен класс "odd". Все, что нужно сделать, – это наделить нечетные строки в таблице этиv классом.
Для начала – решение на чистом
var tables = document.getElementsByTagName("table");
for (var t = 0; t < tables.length; t++) {
var rows = tables[t].getElementsByTagName("tr");
for (var i = 1; i < rows.length; i += 2)
if (!/(^|s)odd(s|$)/.test(rows[i].className))
rows[i].className += " odd";
}
Теперь – решение, использующее одну из самых популярных на сегодняшний день библиотек,
$$("table").each(function(table) {
Selector.findChildElements(table, ["tr"])
.findAll(function(row, i) { return i % 2 == 1; })
.invoke("addClassName", "odd");
});
Ну а теперь –
$("tr:nth-child(odd)").addClass("odd");
Как видно из этого примера, библиотека
Ключом к пониманию работы $(). Эта функция, так или иначе, вызывается всеми методами
Определение функции $ можно увидеть в следующем примере:
$(html) $(elems) $(fn) $(expr, context)
Вне зависимости от параметров, переданных в функцию, знак доллара вернет список объектов, над которым уже определены все доступные
Рассмотрим каждый объект подробнее.
Позволяет создать html-элементы "на лету" из "чистого" HTML. Например, можно создать элемент div, содержащий параграф с текстом "Привет!" и добавить его к элементу с id="body" таким образом:
var my_div = $("<div><p>Привет, Мир!</p></div>");
my_div.appendTo("#body");
Или еще короче:
$("<div><p>Привет, мир!</p></div>").appendTo("#body");
Элемент до отработки скрипта:
<div id="body"></div>
Элемент после отработки скрипта:
<div id="body"><div><p>Привет, Мир!</p></div></div>
Позволяет "прицепить" всю функциональность
$(document.body).css("background-color", "black");
$(myForm.elements).hide();
Это наиболее часто используемая форма функции $. Первый, обязательный, параметр – это выражение, которое позволит
Пример поиска всех элементов p, находящихся внутри всех элементов div на странице:
$("div > p");
В документе:
<p>один</p> <div><p>два</p></div> <p>три</p>
Результат:
[ <p>два</p> ]
Пример поиска всех радиокнопок в первой форме на странице:
$("input:radio", document.forms[0]);
Пример поиска всех элементов div в XML, что прислан с сервера с помощью технологии
$("div", xml.responseXML);
Рассмотрим, принцип работы. Дело в том, что в div в параграфах с классом "highlight" красным цветом, разработчик может составить такую конструкцию:
p.highlight > div
{
color: #F00;
}
Если обратиться к рассмотренному ранее примеру с раскраской таблицы, то согласно CSS 3 раскрасить таблицу можно следующим образом:
table tr:nth-child(odd)
{
background-color: magenta;
}
С помощью
$("tr:nth-child(odd)").addClass("odd");
Практически все селекторы из CSS 1-3 можно использовать для нахождения элементов на странице.
Рассмотрим примеры.
Поиск элемента с id="unique":
$("#unique"); // аналог из CSS: #unique {...}
Поиск всех элементов A, имеющие класс "external" (то есть все <a class="external"> ):
$("a.external"); // аналог из CSS: a.external {...}
Поиск всех нечетных элементов div, находящиеся внутри элементов div с классом news-item, который находится внутри элемента div с id="outer"
$("#outer > div.news-item > p:nth-child(odd)");
Как видно, фантазия разработчика ограничена только возможностями CSS. Когда же возможностей CSS не хватает, на помощь приходит XPath.
XPath (XML Path Language) является языком для обращения к частям XML-документа, а соответственно с помощью него можно обращаться к частям HTML-документа. Из этого следует, что тоже можно сделать и с помощью
Поиск всех элементов P, которые содержат ссылку:
$("p[a]");
Поиск всех элементов A, которые содержат атрибут rel, равный "nofollow":
$("//a[@rel='nofollow']");
Поиск всех видимых элементов LI внутри элемента UL:
$("ul/li:visible"); // XPath + селектор
$("ul > li:visible"); // CSS + селектор
Как видно, если известно, какой элемент необходимо выбрать,
Большинство библиотек window.onload. Это событие вызывается после того, как документ полностью загрузился в окно браузера. Это значит, что вызываемый в обработчике этого события код не сработает, пока не загрузятся все изображения, баннеры и видеоролики на странице.
Возможность выполнить такой код предлагается методом .ready():
$(document).ready(
function() { /* ... */ }
);
или его сокращенным вариантом, $(fn):
$(
function() { /* ... */ }
);
В качестве аргумента в .ready() передается функция, которая будет выполнять все необходимые действия.
$(document).ready(
function() {
// добавим ко всем ссылкам на странице некий текст
$("a").append("<span>(открыть в новом окне)</span>");
}
);
$(document).ready(init);
function init() {
// находим все элементы Р с классом highlight и задаем им другой фон
$("p.highlight").css("background-color", "#000");
// выполняем любые действия
alert('Функция init()');
// вызывать другие функции
anotherFunc();
// манипулируем объектами в документе
document.getElementById("some_id");
}
// Используем кратую форму записи
$(
function() {
alert('Документ готов!');
}
)
| Метод | Описание |
|---|---|
append(content)/ |
Добавить переданный элемент или выражение в конец/в начало выбранного элемента. |
appendTo(expr)/prependTo(expr) |
Добавить выбранный элемент в конец/в начало переданного элемента. |
attr(name) |
Получить значение атрибута. |
attr(params) |
Установить значение атрибутов. Атрибуты передаются в виде {ключ1:значение1[, ключ2:значение2[, …]]} |
attr(name, value) |
Установить значение одного атрибута. |
css(name)/css(params)/css(name, value) |
Получить/установить значение отдельных параметров CSS. Аналогично функции attr(). |
text()/text(val) |
Получить/задать текст элемента. В случае ввода текста специальные символы HTML заменяются символьными примитивами ( entities, например, знак ">" будет заменен gt; ). |
empty() |
Удалить все подэлементы текущего элемента. |
В следующих примерах работа происходит со следующим HTML-кодом:
<div id="my-div"> <a href="http://example.com/" id="my-link">Ссылка</a> </div>
Пример 1:
$("#my-div").html(); //Вернет <a href="#" id="my-link">Ссылка</a>
Пример 2:
$("#my-link").attr("href"); // Вернет http://example.com/
Пример 3:
$("#my-div").append("<strong>Полужирный текст</strong>");
// или
$("<strong>Полужирный текст</strong>").appendTo($("#my-div"));
HTML станет таким:
<div id="my-div"> <a href="http://example.com/" id="my-link">Ссылка</a> <strong>Полужирный текст</strong> </div>
Пример 4:
$("#my-div").empty();
HTML станет таким:
<div id="#my-div"></div>
Пример 5:
$("#my-div").text("<a>Привет!</a>");
HTML станет таким:
<div id="#my-div">lt;agt;Привет!lt;/agt;</div>
Пример 6:
$("#my-div").css(
{
backgroundColor: "#F00",
color: "#00F"
}
);
HTML станет таким:
<div id="my-div" style="background-color: #F00; color: #00F"> lt;agt;Привет!lt;/agt; </div>
В последнем примере стоит обратить внимание на то, что для сложносоставных свойств CSS вроде background-color, font-weight и прочих используются их эквиваленты из backgroundColor, fontWeight и т.п.).
Главная особенность большинства методов
// Заполняем скрытый элемент <div id="divEdit"></div> текстом и показываем его
$("#divEdit").html(response).show();
// найти <select id="my_select">...</select>
var sel = $("#my_select");
// добавляем к нему <option value="1">Пример опции</option>
$("<option></option>") // создаем требуемый элемент
.attr("value", 1) // устанавливаем значение одного из его атрибутов
.html("Пример опции") // записываем в него текст
.appendTo(sel); // прикрепляем к уже существующему элементу
Таким образом, можно легко описать все действия, происходящие с выбранным элементом, не затрудняясь введением большого количества временных переменных.
Функция $() возвращает коллекцию элементов. Так, $("p") вернет массив всех элементов <p>, какие только могут присутствовать на странице (или пустой массив, если таких элементов не существует). Одним из условий работы большинства функций
Например:
$("a").css("color", "green");
div с классом test будет добавлен новый элемент:$("div.test").append("<span>Тестовый элемент</span>");
Но иногда необходимо обратиться к индивидуальным элементам возвращаемой коллекции.
Возвращаемая функцией $() коллекция является "псевдо-массивом" DOM-элементов. Поэтому можно обратиться к индивидуальным элементам по их индексу:
$("p")[0].className = "test";
Иногда, правда, необходимо обратиться непосредственно к массиву DOM-объектов, скрытых внутри "псевдо-массива", которым является объект get():
$("p"); // Получили объект jQuery
$("p").get(); // Получили соответствующую коллекцию DOM-элементов
Более того, метод get позволяет обращаться непосредственно к индивидуальным элементам коллекции:
$("a").get(0); // Получили первую из всех ссылок на странице
Иногда нужно пробежаться по всем элементам коллекции и выполнить над ними какие-то действия. Для этого понадобится функция each. Эта функция принимает в качестве аргумента другую функцию. each() работает в контексте найденных элементов и поэтому каждый раз, когда выполняется переданная ей функция, в этой функции доступна переменная this, указывающая на соответствующий DOM-элемент:
$("p").each(
function() {
// внутри функции this указывает на текущий DOM-элемент
alert(this.innerHTML);
}
);
В этом примере находятся все элементы p на странице, и для каждого из этих элементов вызывается функция, которая показывает его содержимое.
Функция, передаваемая в метод each(), может принимать на вход один аргумент, который является индексом текущего элемента в коллекции.
Для иллюстрации перепишем пример с раскраской нечетных строк таблицы с помощью each(). Если есть некая таблица с id="zebra" и CSS-класс "odd" для нечетных строк, то можно написать так:
$("#zebra tr").each(colorize); // передаем в each функцию colorize
function colorize(index) {
if (index % 2 == 1) // index является индексом текущего элемента в коллекции
$(this).addClass("odd");
}
Грамотная манипуляция свойствами элементов на странице позволила создателям
В базовой поставке
Ключевой функцией, на которой базируются все остальные, является функция animate:
animate(params, speed, easing, callback);
Здесь:
params – свойства, которые участвуют в анимации в виде пар {ключ: значение}, например: { height: "show"} или {opacity: 50, width: 100, height: 200} ;speed – скорость в миллисекундах;easing – замедление анимации (замедляется ли к концу, "easein", или, наоборот, ускоряется, "easeout" );callback – функция, которая будет вызвана после завершения анимации.Пусть, например, есть элемент div с каким-нибудь текстом, и необходимо скрыть этот текст, заменить новым и показать обновленный текст:
$("#mydiv")
.animate({ height: "hide" }, 300)
.text("Новый текст")
.animate({ height: "show" }, 300);
Метод animate является основой большинства эффектов
show([speed[, callback]]) – показать элемент;hide([speed[, callback]]) – скрыть элемент;fadeIn(speed[, callback]) – показать элемент путем изменения его прозрачности;fadeOut(speed[, callback]) – скрыть элемент путем изменения его прозрачности;slideDown(speed, callback) – показать элемент, спустив его сверху;slideUp(speed, callback) – показать элемент, подняв его снизу;где
speed – скорость в миллисекундах или одно из "slow" (600 миллисекунд) или "fast" (200 миллисекунд);callback – функция, которая будет вызвана после выполнения анимации.Скрытая мощь функции animate позволяет создавать поистине удивительные эффекты, многие из которых уже реализованы, например, в модуле расширения Interface (http://interface.eyecon.ro/).
Необходимо также заметить, что все эффекты библиотеки
for (i = 0; i < 10; i++) {
$("#my-div").animate({ height: "show" }, 300);
$("#my-div").animate({ height: "hide" }, 300);
}
В результате будет получено не беспорядочное моргание, пока двадцать эффектов "борются" за право показать/скрыть элемент "my-div", а плавный показ, потом сокрытие, потом снова показ – и так 20 раз. Стоит обратить внимание на то, что очередь эффектов составляется поэлементно. То есть эффекты, примененные к разным элементам одновременно, будут выполняться одновременно.
Базовыми функциями для работы с post() и get() (есть еще более низкоуровневая, ajax() ):
$.post(url[, params[, callback]]) $.get(url[, params[, callback]])
Здесь:
url – адрес страницы, на которую будет отправлен запрос;params – параметры, передаваемые в запросе в виде пар "ключ : значение";callback – функция, которая будет вызвана в случае успешного завершения вызова.Например:
$.post(
'/ajaxtest.php',
{
type: "test-request",
param1: "param1",
param2: 2
},
onAjaxSuccess
);
function onAjaxSuccess(data) {
// Здесь получаем данные, отправленные сервером
alert(data);
}
Технология push ) данные браузеру без дополнительного запроса со стороны браузера [13, 14, 15, 16]. Название "
HTTP server push (так же называемое HTTP streaming) – механизм отправки данных с Веб-сервера к Веб-браузеру (рис. 13.4) [15]. HTTP server push может быть реализовано посредством нескольких механизмов. Основной – это когда Веб-сервер не закрывает соединение после отправки ответа клиенту. Веб-сервер оставляет соединение открытым, так что если произойдет событие, то оно может быть отправлено одному или множеству клиентов. Иначе данные составляются в очередь до следующего запроса клиента. Большинство серверов реализуют эту функциональность через CGI (например, NPH скрипты в Apache).
(рис 13.4) Схема работы Comet – HTTP-streaming Другой механизм относится к специальному MIME type, называемый multipart/x-mixed-replace, который был введен Netscape в 1995. Веб-браузер интерпретирует это как изменения документа всякий раз, когда сервер сообщает о новой версии клиенту. Сегодня это все еще поддерживается Firefox, Opera и Safari, но традиционно игнорируется Internet Explorer. Это применимо к HTML-документам, но также для потокового отображения картинок для приложений работающих с
WHATWG Web Applications 1.0 предлагает включить механизм "проталкивания" содержимого клиенту. 1 сентября 2006 браузер Opera реализовала эту новую экспериментальную технологию в функциональности с названием "Server-Sent Events". Сейчас это часть стандартов HTML5. Другой, относящейся к вопросу, частью HTML5 стали Веб-сокеты, которые доступны в Google Chrome, начиная с версии 4.0.249.0, и существуют так же
В последнее время часто можно услышать выражение real-time web, за которым, как говорят, будущее Интернета. По сути, это набор технологий, который позволяет получать в реальном времени данные добавляемые в Сеть. Частным случаем этой идеи является real-time search – поиск в реальном времени.
На данный момент существует несколько поисковиков в реальном времени, а так же несколько экспериментов от гигантов вроде компании Google. Остаются не решенными некоторые практические вопросы, например определение релевантности в поисковой выдаче, но сама технология трансляции данных в браузер пользователя вполне работоспособна.
Один из способов узнать, нет ли на сервере каких либо обновлений, применять технологию
(рис 13.5) Пример асинхронных запросов в AJAX – short pollingТакой тип взаимодействия называется polling (от англ. poll – тянуть), именно вытягиванием данных и занимается браузер. Преимущества перед полным обновлением страницы очевидны, но есть и недостатки. Главным из них является "холостая работа" – часто браузер делает сотни запросов, а в ответ узнает, что новых данных нет. Именно для решения этой проблемы и появилась технология long polling, позволяющая делать запросы, которые возвращают результат, как только он появляется. Пример взаимодействия показан на рис. 13.6 [15].
(рис 13.6) Пример долгих асинхронных запросов – long pollingЭта техника является золотой серединой между простым
Практическая польза использования
Хотя
eval() ;Ext.namespace ;Ext.override ;Ext.extend и соглашения о параметрах конструкторов;Ext.apply ;Ext.applyIf.Компоненты библиотеки
Core:Store ;Reader ;Proxy ;Record.Layout;Tooltip ;Tree ;Grid.В XMLHttpRequest:
$() ;$$() ;$F() ;$A() ;$H() ;Ajax ;Element.Возможности
Вся работа с $.
Главная особенность большинства методов
Технология
HTTP server push – механизм отправки данных с Веб-сервера к Веб-браузеру
Один из способов узнать, нет ли на сервере каких либо обновлений, применять технологию
Технология long polling, позволяет делать запросы, которые возвращают результат, как только он появляется.
Презентацию к данной лекции Вы можете скачать здесь.
Несмотря на происхождение от
Практическая польза использования eval() ). Кроме того, в
Следующий пример показывает
{
"firstName": "Иван",
"lastName": "Иванов",
"address": {
"streetAddress": "Московское ш., 101, кв.101",
"city": "Ленинград",
"postalCode": 101101
},
"phoneNumbers": [
"916 123-4567"
]
}
На языке XML подобная структура выглядела бы примерно так:
<person>
<firstName>Иван</firstName>
<lastName>Иванов</lastName>
<address>
<streetAddress>Московское ш., 101, кв.101</streetAddress>
<city>Ленинград</city>
<postalCode>101101</postalCode>
</address>
<phoneNumbers>
<phoneNumber>916 123-4567</phoneNumber>
</phoneNumbers>
</person>
Следующий фрагмент XMLHttpRequest, чтобы запрашивать с сервера объект в формате
var the_object;
var http_request = new XMLHttpRequest();
http_request.open("GET", url, true);
http_request.send(null);
http_request.onreadystatechange = function() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
the_object = eval("(" + http_request.responseText + ")");
} else {
alert("Проблема с URL.");
}
http_request = null;
}
};
Полезность XMLHttpRequest ограничивается политикой ограничения домена: URL ответа на запрос должен проживать в том же DNS домене, что и сервер, на котором находится страница, содержащая запрос.
Браузеры могут также использовать элементы <iframe> асинхронный запрос <form action="url_to_cgi_script" target="name_of_hidden_iframe"> представлений. Эти подходы были распространены до появления широкой поддержки XMLHttpRequest.
Хотя eval() без какой-либо предварительной проверки.
Поскольку eval(), которая предназначена для выполнения
Техника использования eval() делает систему уязвимой, если источник используемых eval() полученные от внешнего источника данные могут проверяться с помощью регулярных выражений. В RFC, определяющей
var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g, ''))) eval('(' + text + ')');
Как более безопасная альтернатива eval() была предложена новая функция parseJSON(), способная обрабатывать только
Непродуманное использование <script> допускает использование источника, не принадлежащего к тому же домену, что и использующий ресурс, это позволяет выполнять код под видом данных, представленных в формате
Это представляется проблемой только в случае содержания в
С версии 2.1 библиотека
Начиная с версии Ext JS 3.0, библиотека разбивается на две части: Ext Core (набор
Одна из задач, которую ставили себе разработчики библиотеки
Синтаксис:
Ext.namespace( String namespace1, String namespace2, String etc ) : void
В языке Ext.ux.graphing.GraphPanel перестают быть редкостью. В Ext.namespace, который позволяет определить все пространства имен за один вызов, уменьшая не только затраты на поддержку кода, но и сокращая его размер.
Традиционный код
var Ext = Ext || {};
Ext.ux = Ext.ux || {};
Ext.ux.graphing = Ext.ux.graphing || {};
Ext.ux.soundFx = Ext.ux.soundFx || {};
Ext.ux.maps = Ext.ux.maps || {};
Того же результата можно достичь вызовом всего одного метода:
Ext.namespace("Ext.ux.graphing", "Ext.ux.soundFx", "Ext.ux.maps");
Синтаксис:
Ext.override( Object origclass, Object overrides ) : void
// создаем функцию
function doesStuff() {
alert("Функция один!");
};
// теперь ее перекрываем
doesStuff = function() {
alert("Функция два!");
};
Перекрытие метода класса осуществляется путем переопределения его прототипа:
function MyClass() {
// конструктор класса
}
MyClass.prototype.myMethod = function() {
alert("привет");
};
var x = new MyClass();
x.myMethod(); // отобразит "привет"
MyClass.prototype.myMethod = function() {
alert("пока");
};
x.myMethod(); // отобразит "пока"
Используя тот же способ, разработчик может добавить новые методы в существующий класс.
Ext.override – это удобный способ переопределения методов класса за один присест. Следующий пример перекрывает два метода класса Ext.ux.graphing.GraphPanel. Следуя общепринятым правилам языка
Ext.override(Ext.ux.graphing.GraphPanel, {
clearAllPoints: function() {
// выполнить другие действия
},
loadData: function(newData) {
// загрузка новых данных
}
});
Этот простой метод имеет огромное значение при поддержке собственных изменений в чужом коде. Опытные Ext.override, разработчики могут поместить свой код в отдельный файл, связать его со сторонней библиотекой и быть уверенными, что в новом релизе ничего не сломается.
Синтаксис:
Ext.extend( Function superclass, Object overrides ) : Function
или
Ext.extend( Function subclass, Function superclass, [Object overrides] ) : Function
Рассмотренный ранее метод Ext.override выполняет замену реализации на новый метод целиком, а Ext.extend позволяет осуществить полноценное наследование согласно парадигме ООП. Имеются два варианта вызова этого метода, каждый из которых возвращает определение нового класса, содержащего объекты, унаследованные от родительского, определенного в параметре superclass, и перекрывает методы, заданные в параметре overrides. Также он добавляет к новому классу служебный метод override(), который дает возможность перекрывать , позволяющее получить доступ к родительскому объекту.
Библиотека
Ниже приведен пример использования Ext.extend. Обратите внимание, что имеются два способа наследования. Первый:
var newClass = Ext.extend(Ext.form.ComboBox, {
constructor: function(config) { // явное задание конструктора
config.emptyText = "'5' не допускается";
newClass.superclass.constructor.call(this, config);
},
setValue: function(v) {
if (v == 5) { // если v равно 5, сообщить пользователю
alert("'5' не допускается");
} else { // иначе вызываем метод родителя
newClass.superclass.setValue.call(this, v);
}
}
});
Второй:
function newClass(config) { // конструктор
config.emptyText = "'5' не допускается";
newClass.superclass.constructor.call(this, config);
};
Ext.extend(newClass, Ext.form.ComboBox, {
setValue: function(v) {
if (v == 5) { // если v равно 5, сообщить пользователю
alert("'5' не допускается");
} else { // иначе вызываем метод родителя
newClass.superclass.setValue.call(this, v);
}
}
});
Так как все объекты config.
Синтаксис:
Ext.apply( Object obj, Object config, [Object defaults] ) : Object
Метод Ext.apply производит копирование каждого члена объекта config в объект obj. Опционально может быть задан параметр defaults, содержимое которого также копируется в объект obj, но перед выполнением копирования объекта config.
Синтаксис:
Ext.applyIf( Object obj, Object config ) : Object
Метод Ext.applyIf производит копирование каждого члена объекта config в объект obj, но только в том случае, когда этот член еще не существует в объекте назначения.
Обычно разработчики создают
function MyClass(config) { // конструктор, который принимает конфигурацию в параметре 'config'
// присвоение некоторых значений по умолчанию, если они не заданы в конфигурации
config = Ext.applyIf(config, {
someValue: defaultValue
});
// а здесь присваиваются значения по умолчанию, игнорирующие параметры конструктора
config = Ext.apply(config, {
someOtherValue: defaultValue
});
// вызов конструктора класса-родителя с передачей новой конфигурации
MyClass.superclass.constructor.call(this, config);
}
// не забудьте унаследовать родительский класс
Ext.extend(MyClass, MyBase, {
// ...
});
Библиотека
Самым мощным и известным компонентом является таблица или Grid. Он позволяет выполнять группировку, сортировку и Grid предоставляет возможность редактировать данные, причем при установке некоторых расширений, этот компонент позволит не только редактировать данные в строках, но и будет автоматически создавать всплывающие формы.
Каждый компонент в
В архитектуре библиотеки есть и такое понятие как тема оформления – это обычный CSS-файл, изменяя который можно мгновенно изменить внешний вид всех элементов интерфейса. Уже создано множество различных пользовательских тем, в разной цветовой гамме и стиле, хотя, на мой взгляд, именно стандартная тема наиболее приятная и привычная для большинства пользователей.
Для рассмотрения библиотеки
Самый нижний слой – это низкоуровневые функции по работе с DOM-деревом, событиями, стилями и другие функции. Здесь можно использовать адаптеры для подключения нескольких библиотек. В особенности это нужно, когда необходимо смешать в одном приложении функциональность, к примеру,
Core – это основные базовые модули и функционал, который необходим для работы всех остальных компонентов библиотеки и приложения. Он разбит на несколько модулей:
Работа с данными. Так как любое веб-приложение основано на каких-то данных, то этот слой в библиотеке не менее насыщенный различным функционалом, чем визуальные компоненты. Обмен данными с сервером может вестись в двух форматах –
Вся работа с данными построена на следующей компонентной схеме:
Исходя из нужного функционала, можно использовать компоненты, которые работают с
Помимо замещения всех стандартных для форм элементов,
Управление общей компоновкой обеспечивают компоненты группы Layout, которые позволяют разметить блоками всю область окна приложения и в дальнейшем работать с ними по отдельности, обеспечивая в то же время общую целостность интерфейса и его структуры (рис. 13.1). Отдельные части страницы можно сворачивать, скрывая полностью или менять их размер, передвигать границы областей – все, что привыкли делать пользователи в обычных приложениях.
(рис 13.1) Управление общей компоновкойДинамическая подсказка или Tooltip – позволяет для любого элемента на странице (как визуального, так и к любому DOM-объекту) прицепить подсказку, которая будет показана при наведении мыши. Сама подсказка может содержать в себе произвольный HTML-код, изображения и даже быть контекстно-зависимой – подгружаться через
При необходимости можно подключать и использовать множество виджетов – кнопки (разного вида, с изображениями и текстом, кнопки-переключатели, кнопки с выпадающим меню и т.п.), меню (как контекстные, так и тулбары с меню, совсем как в обычных приложениях), индикаторы загрузки и прогресс-бары. Есть и такое, свойственное только Веб-приложениям решение, как Loading Mask, которое позволяет "заморозить" для пользователя все приложение на то время, пока получаются и обновляются данные с сервера. Есть и функциональные компоненты для выбора даты и цвета, есть компоненты для вывода сообщений, как модальные MessageBox, так и полноценные окна, в которые, в свою очередь, можно вставлять любые элементы управления или разделять их закладки, сворачивать и развертывать, перетаскивать по экрану и т.п.
Таб-панель – еще один мощный компонент для построения тех приложений, которые, с одной стороны, требуют, чтобы пользователю показывалось сразу много разной информации, формы, таблицы и другие объекты, в то же время нужны ограничения, и в каждый момент времени показывать только самое необходимое. Для такого структурирования широко применяют вкладочный интерфейс. Даже диалоговые окна в
Tree – часто используемый компонент, позволяющий группировать иерархические структуры и отображать их с любой глубиной вложенности, автоматически подгружая новые элементы, менять местами, перетаскивая мышью отдельные элементы и другие стандартные операции (рис. 13.2). В последних версиях деревья были расширенны путем добавления функций редактирования элементов прямо на месте отрисовки (Inline item editing).
(рис 13.2) TreeФорма является одной из основных высокоуровневых абстракций библиотеки, и использует почти все из описанных компонентов, в частности большинство визуальных виджетов, которые расширяют стандартные элементы форм. Она также использует слой доступа к данным для заполнения некоторых компонентов (например, ComboBox может получать данные от сервера). В
Таблица Grid – самый востребованный и самый мощный из компонентов, которым располагает разработчик на
(рис 13.3) AJAX ТаблицаРазвитие библиотеки не стоит на месте. Например, вместе с выходом среды
Заявлено, что данный фреймворк поддерживается следующими браузерами: Internet Explorer 6.0+, Mozilla Firefox 1.5+, Apple Safari 2.0+ и Opera 9.25+.
В XMLHttpRequest. Ниже приведены некоторые примеры.
Для обращения к DOM элементу HTML-страницы обычно используется функция:
document.getElementById:
document.getElementById("id_of_element")
Функция $() уменьшает код до [8]:
$("id_of_element")
Но в отличие от функции DOM, функции $() можно передавать более одного аргумента и функция вернет массив ( Array ) объектов со всеми соответствующими элементами:
var ar = $('id_1', 'id_2', 'id_3');
for (i = 0; i < ar.length; i++) {
alert(ar[i].innerHTML);
}
Например, для указания цвета текста можно использовать следующий код:
$("id_of_element").style.color = "#ffffff";
Или, используя расширенные функции
$("id_of_element").setStyle({ color: '#ffffff' });
Код для версий ниже 1.5:
Element.setStyle("id_of_element", { color: "#ffffff" });
Функция $$() используется для разделения CSS от контента. Она разбивает один или несколько CSS фильтров, которые поступают на вход в виде выражения подобного регулярному выражению и возвращает элементы, которые соответствуют этим фильтрам. Например, при выполнении данного скрипта:
var f = $$('div#block .inp');
получим массив, содержащий все элементы с классом .inp, которые находятся в контейнере div с идентификатором id="block".
Похожая на $(), функция $F() возвращает значение определенного элемента HTML формы. Для текстового поля функция будет возвращать данные, содержащиеся в элементе. Для элемента "select" функция возвратит выбранное в текущий момент значение:
$F("id_of_input_element")
Функция $A() преобразует один аргумент, который она получает, в объект Array. Эта функция, в сочетании с расширениями для класса Array, облегчает конвертирование или копирование любых перечислимых списков в объект Array. Один из вариантов использования заключается в том, чтобы преобразовать DOM NodeLists в регулярные массивы, которые могут быть более эффективно использованы.
Функция $H() преобразовывает объекты в перечислимые Хэш-объекты, которые похожи на ассоциативный массив:
//Допустим имеем объект:
var hash = { method: post, type: 2, flag: t };
//При использовании функции:
var h = $H(hash);
//Получим:
alert(h.toQueryString());
//На экране будет отображено: posttype=2flag=t
Объект XMLHttpRequest, без необходимости подстраивать код под нужный браузер. Существует два способа вызова объекта: Ajax.Request возвращает XML вывод Ajax.Updater помещает ответ сервера в выбранную ветвь DOM.
Ajax.Request в примере ниже находит значения двух полей ввода, запрашивает страницу с сервера, используя значения в виде POST -запроса, а после завершения выполняет пользовательскую функцию showResponse():
var val1 = escape($F("name_of_id_1"));
var val2 = escape($F("name_of_id_2"));
var url = "http://yourserver/path/server_script";
var pars = { value1: val1, value2: val2 };
var myAjax = new Ajax.Request(
url,
{
method: "post",
parameters: pars,
onComplete: showResponse
});
Методы класса предназначены для работы с элементами HTML. Для создания HTML элемента используется конструктор класса:
new Element(tagName[,{attributes}])
В конструктор передается HTML-тег в строковом виде и, если необходимо, атрибуты тега.
Пример создания нового элемента:
// Создаем элемент <div> в памяти и указываем атрибуты id, class
var newElement = new Element('div',{id: 'childDiv', class: 'divStyle'});
// Включаем созданный элемент в DOM браузера, а именно в существующий <div> с помощью метода Element.insert
Element.insert($('parrentDiv'),newElement);
Для создания нового класса используется метод Class.create(). Классу присваивается прототип prototype, который выступает в качестве основы для каждого экземпляра класса. Старые классы могут быть расширены новыми с помощью Object.extend:
// создания нового класса в стиле prototype 1.6
var FirstClass = Class.create({
// Инициализация конструктора
initialize: function() {
this.data = "Hello World";
}
});
// создания нового класса в стиле prototype 1.5
var DataWriter = Class.create();
DataWriter.prototype = {
printData: function() {
document.write(this.data);
}
};
Object.extend(DataWriter, FirstClass);
Возможности:
Точно так же, как CSS отделяет визуализацию от структуры HTML,
Библиотека
<head>
<script type="text/javascript" src="путь/к/jQuery.js"></script>
</head>
Вся работа с $. Если на сайте применяются другие $ может использоваться для своих нужд, то можно использовать ее синоним –
jQuery(function($) {
// Тут код скрипта, где в $ будет jQuery
})
Работу с
$(). Например, передав в нее CSS-селектор, можно получить $, например, удобных итераторов по массиву.Типичный пример манипуляции сразу несколькими узлами DOM заключается в вызове $ функции со строкой селектора CSS, что возвращает объект , содержащий некоторое количество элементов HTML-страницы. Эти элементы затем обрабатываются методами
$("div.test").add("p.quote").addClass("blue").slideDown("slow");
находит все элементы <div> с классом test, а также все элементы <p> с классом quote, и затем добавляет им всем класс blue и визуально плавно спускает вниз.
Методы, начинающиеся с $., удобно применять для обработки глобальных объектов. Например:
$.each([1, 2, 3], function() {
document.write(this + 1);
});
добавит на страницу 234.
Оператор $.ajax и соответствующие функции позволяют использовать методы
$.ajax({
type: "POST",
url: "some.html",
data: { name: 'John', location: 'Boston' },
success: function(msg) {
alert("Data Saved: " + msg);
}
});
В этом примере идет обращение к скрипту some. HTML с параметрами name=Johnlocation=Boston и полученный результат выдается в сообщении посредством alert().
Пример добавления к элементу обработчика события click с помощью
jQuery(function($) {
$("a").click(function() {
alert("Привет, Мир!");
});
});
В данном случае при нажатии на элемент <A> происходит вызов alert("Привет, Мир!").
Рассмотрим пример, в котором необходимо раскрасить таблицу в следующем стиле [11, 12]:
| Один | Два | Три | Четыре |
|---|---|---|---|
| Один | Два | Три | Четыре |
| Один | Два | Три | Четыре |
| Один | Два | Три | Четыре |
| Один | Два | Три | Четыре |
| Один | Два | Три | Четыре |
| Один | Два | Три | Четыре |
Предполагается, что есть CSS-файл, в котором определен класс "odd". Все, что нужно сделать, – это наделить нечетные строки в таблице этиv классом.
Для начала – решение на чистом
var tables = document.getElementsByTagName("table");
for (var t = 0; t < tables.length; t++) {
var rows = tables[t].getElementsByTagName("tr");
for (var i = 1; i < rows.length; i += 2)
if (!/(^|s)odd(s|$)/.test(rows[i].className))
rows[i].className += " odd";
}
Теперь – решение, использующее одну из самых популярных на сегодняшний день библиотек,
$$("table").each(function(table) {
Selector.findChildElements(table, ["tr"])
.findAll(function(row, i) { return i % 2 == 1; })
.invoke("addClassName", "odd");
});
Ну а теперь –
$("tr:nth-child(odd)").addClass("odd");
Как видно из этого примера, библиотека
Ключом к пониманию работы $(). Эта функция, так или иначе, вызывается всеми методами
Определение функции $ можно увидеть в следующем примере:
$(html) $(elems) $(fn) $(expr, context)
Вне зависимости от параметров, переданных в функцию, знак доллара вернет список объектов, над которым уже определены все доступные
Рассмотрим каждый объект подробнее.
Позволяет создать html-элементы "на лету" из "чистого" HTML. Например, можно создать элемент div, содержащий параграф с текстом "Привет!" и добавить его к элементу с id="body" таким образом:
var my_div = $("<div><p>Привет, Мир!</p></div>");
my_div.appendTo("#body");
Или еще короче:
$("<div><p>Привет, мир!</p></div>").appendTo("#body");
Элемент до отработки скрипта:
<div id="body"></div>
Элемент после отработки скрипта:
<div id="body"><div><p>Привет, Мир!</p></div></div>
Позволяет "прицепить" всю функциональность
$(document.body).css("background-color", "black");
$(myForm.elements).hide();
Это наиболее часто используемая форма функции $. Первый, обязательный, параметр – это выражение, которое позволит
Пример поиска всех элементов p, находящихся внутри всех элементов div на странице:
$("div > p");
В документе:
<p>один</p> <div><p>два</p></div> <p>три</p>
Результат:
[ <p>два</p> ]
Пример поиска всех радиокнопок в первой форме на странице:
$("input:radio", document.forms[0]);
Пример поиска всех элементов div в XML, что прислан с сервера с помощью технологии
$("div", xml.responseXML);
Рассмотрим, принцип работы. Дело в том, что в div в параграфах с классом "highlight" красным цветом, разработчик может составить такую конструкцию:
p.highlight > div
{
color: #F00;
}
Если обратиться к рассмотренному ранее примеру с раскраской таблицы, то согласно CSS 3 раскрасить таблицу можно следующим образом:
table tr:nth-child(odd)
{
background-color: magenta;
}
С помощью
$("tr:nth-child(odd)").addClass("odd");
Практически все селекторы из CSS 1-3 можно использовать для нахождения элементов на странице.
Рассмотрим примеры.
Поиск элемента с id="unique":
$("#unique"); // аналог из CSS: #unique {...}
Поиск всех элементов A, имеющие класс "external" (то есть все <a class="external"> ):
$("a.external"); // аналог из CSS: a.external {...}
Поиск всех нечетных элементов div, находящиеся внутри элементов div с классом news-item, который находится внутри элемента div с id="outer"
$("#outer > div.news-item > p:nth-child(odd)");
Как видно, фантазия разработчика ограничена только возможностями CSS. Когда же возможностей CSS не хватает, на помощь приходит XPath.
XPath (XML Path Language) является языком для обращения к частям XML-документа, а соответственно с помощью него можно обращаться к частям HTML-документа. Из этого следует, что тоже можно сделать и с помощью
Поиск всех элементов P, которые содержат ссылку:
$("p[a]");
Поиск всех элементов A, которые содержат атрибут rel, равный "nofollow":
$("//a[@rel='nofollow']");
Поиск всех видимых элементов LI внутри элемента UL:
$("ul/li:visible"); // XPath + селектор
$("ul > li:visible"); // CSS + селектор
Как видно, если известно, какой элемент необходимо выбрать,
Большинство библиотек window.onload. Это событие вызывается после того, как документ полностью загрузился в окно браузера. Это значит, что вызываемый в обработчике этого события код не сработает, пока не загрузятся все изображения, баннеры и видеоролики на странице.
Возможность выполнить такой код предлагается методом .ready():
$(document).ready(
function() { /* ... */ }
);
или его сокращенным вариантом, $(fn):
$(
function() { /* ... */ }
);
В качестве аргумента в .ready() передается функция, которая будет выполнять все необходимые действия.
$(document).ready(
function() {
// добавим ко всем ссылкам на странице некий текст
$("a").append("<span>(открыть в новом окне)</span>");
}
);
$(document).ready(init);
function init() {
// находим все элементы Р с классом highlight и задаем им другой фон
$("p.highlight").css("background-color", "#000");
// выполняем любые действия
alert('Функция init()');
// вызывать другие функции
anotherFunc();
// манипулируем объектами в документе
document.getElementById("some_id");
}
// Используем кратую форму записи
$(
function() {
alert('Документ готов!');
}
)
| Метод | Описание |
|---|---|
append(content)/ |
Добавить переданный элемент или выражение в конец/в начало выбранного элемента. |
appendTo(expr)/prependTo(expr) |
Добавить выбранный элемент в конец/в начало переданного элемента. |
attr(name) |
Получить значение атрибута. |
attr(params) |
Установить значение атрибутов. Атрибуты передаются в виде {ключ1:значение1[, ключ2:значение2[, …]]} |
attr(name, value) |
Установить значение одного атрибута. |
css(name)/css(params)/css(name, value) |
Получить/установить значение отдельных параметров CSS. Аналогично функции attr(). |
text()/text(val) |
Получить/задать текст элемента. В случае ввода текста специальные символы HTML заменяются символьными примитивами ( entities, например, знак ">" будет заменен gt; ). |
empty() |
Удалить все подэлементы текущего элемента. |
В следующих примерах работа происходит со следующим HTML-кодом:
<div id="my-div"> <a href="http://example.com/" id="my-link">Ссылка</a> </div>
Пример 1:
$("#my-div").html(); //Вернет <a href="#" id="my-link">Ссылка</a>
Пример 2:
$("#my-link").attr("href"); // Вернет http://example.com/
Пример 3:
$("#my-div").append("<strong>Полужирный текст</strong>");
// или
$("<strong>Полужирный текст</strong>").appendTo($("#my-div"));
HTML станет таким:
<div id="my-div"> <a href="http://example.com/" id="my-link">Ссылка</a> <strong>Полужирный текст</strong> </div>
Пример 4:
$("#my-div").empty();
HTML станет таким:
<div id="#my-div"></div>
Пример 5:
$("#my-div").text("<a>Привет!</a>");
HTML станет таким:
<div id="#my-div">lt;agt;Привет!lt;/agt;</div>
Пример 6:
$("#my-div").css(
{
backgroundColor: "#F00",
color: "#00F"
}
);
HTML станет таким:
<div id="my-div" style="background-color: #F00; color: #00F"> lt;agt;Привет!lt;/agt; </div>
В последнем примере стоит обратить внимание на то, что для сложносоставных свойств CSS вроде background-color, font-weight и прочих используются их эквиваленты из backgroundColor, fontWeight и т.п.).
Главная особенность большинства методов
// Заполняем скрытый элемент <div id="divEdit"></div> текстом и показываем его
$("#divEdit").html(response).show();
// найти <select id="my_select">...</select>
var sel = $("#my_select");
// добавляем к нему <option value="1">Пример опции</option>
$("<option></option>") // создаем требуемый элемент
.attr("value", 1) // устанавливаем значение одного из его атрибутов
.html("Пример опции") // записываем в него текст
.appendTo(sel); // прикрепляем к уже существующему элементу
Таким образом, можно легко описать все действия, происходящие с выбранным элементом, не затрудняясь введением большого количества временных переменных.
Функция $() возвращает коллекцию элементов. Так, $("p") вернет массив всех элементов <p>, какие только могут присутствовать на странице (или пустой массив, если таких элементов не существует). Одним из условий работы большинства функций
Например:
$("a").css("color", "green");
div с классом test будет добавлен новый элемент:$("div.test").append("<span>Тестовый элемент</span>");
Но иногда необходимо обратиться к индивидуальным элементам возвращаемой коллекции.
Возвращаемая функцией $() коллекция является "псевдо-массивом" DOM-элементов. Поэтому можно обратиться к индивидуальным элементам по их индексу:
$("p")[0].className = "test";
Иногда, правда, необходимо обратиться непосредственно к массиву DOM-объектов, скрытых внутри "псевдо-массива", которым является объект get():
$("p"); // Получили объект jQuery
$("p").get(); // Получили соответствующую коллекцию DOM-элементов
Более того, метод get позволяет обращаться непосредственно к индивидуальным элементам коллекции:
$("a").get(0); // Получили первую из всех ссылок на странице
Иногда нужно пробежаться по всем элементам коллекции и выполнить над ними какие-то действия. Для этого понадобится функция each. Эта функция принимает в качестве аргумента другую функцию. each() работает в контексте найденных элементов и поэтому каждый раз, когда выполняется переданная ей функция, в этой функции доступна переменная this, указывающая на соответствующий DOM-элемент:
$("p").each(
function() {
// внутри функции this указывает на текущий DOM-элемент
alert(this.innerHTML);
}
);
В этом примере находятся все элементы p на странице, и для каждого из этих элементов вызывается функция, которая показывает его содержимое.
Функция, передаваемая в метод each(), может принимать на вход один аргумент, который является индексом текущего элемента в коллекции.
Для иллюстрации перепишем пример с раскраской нечетных строк таблицы с помощью each(). Если есть некая таблица с id="zebra" и CSS-класс "odd" для нечетных строк, то можно написать так:
$("#zebra tr").each(colorize); // передаем в each функцию colorize
function colorize(index) {
if (index % 2 == 1) // index является индексом текущего элемента в коллекции
$(this).addClass("odd");
}
Грамотная манипуляция свойствами элементов на странице позволила создателям
В базовой поставке
Ключевой функцией, на которой базируются все остальные, является функция animate:
animate(params, speed, easing, callback);
Здесь:
params – свойства, которые участвуют в анимации в виде пар {ключ: значение}, например: { height: "show"} или {opacity: 50, width: 100, height: 200} ;speed – скорость в миллисекундах;easing – замедление анимации (замедляется ли к концу, "easein", или, наоборот, ускоряется, "easeout" );callback – функция, которая будет вызвана после завершения анимации.Пусть, например, есть элемент div с каким-нибудь текстом, и необходимо скрыть этот текст, заменить новым и показать обновленный текст:
$("#mydiv")
.animate({ height: "hide" }, 300)
.text("Новый текст")
.animate({ height: "show" }, 300);
Метод animate является основой большинства эффектов
show([speed[, callback]]) – показать элемент;hide([speed[, callback]]) – скрыть элемент;fadeIn(speed[, callback]) – показать элемент путем изменения его прозрачности;fadeOut(speed[, callback]) – скрыть элемент путем изменения его прозрачности;slideDown(speed, callback) – показать элемент, спустив его сверху;slideUp(speed, callback) – показать элемент, подняв его снизу;где
speed – скорость в миллисекундах или одно из "slow" (600 миллисекунд) или "fast" (200 миллисекунд);callback – функция, которая будет вызвана после выполнения анимации.Скрытая мощь функции animate позволяет создавать поистине удивительные эффекты, многие из которых уже реализованы, например, в модуле расширения Interface (http://interface.eyecon.ro/).
Необходимо также заметить, что все эффекты библиотеки
for (i = 0; i < 10; i++) {
$("#my-div").animate({ height: "show" }, 300);
$("#my-div").animate({ height: "hide" }, 300);
}
В результате будет получено не беспорядочное моргание, пока двадцать эффектов "борются" за право показать/скрыть элемент "my-div", а плавный показ, потом сокрытие, потом снова показ – и так 20 раз. Стоит обратить внимание на то, что очередь эффектов составляется поэлементно. То есть эффекты, примененные к разным элементам одновременно, будут выполняться одновременно.
Базовыми функциями для работы с post() и get() (есть еще более низкоуровневая, ajax() ):
$.post(url[, params[, callback]]) $.get(url[, params[, callback]])
Здесь:
url – адрес страницы, на которую будет отправлен запрос;params – параметры, передаваемые в запросе в виде пар "ключ : значение";callback – функция, которая будет вызвана в случае успешного завершения вызова.Например:
$.post(
'/ajaxtest.php',
{
type: "test-request",
param1: "param1",
param2: 2
},
onAjaxSuccess
);
function onAjaxSuccess(data) {
// Здесь получаем данные, отправленные сервером
alert(data);
}
Технология push ) данные браузеру без дополнительного запроса со стороны браузера [13, 14, 15, 16]. Название "
HTTP server push (так же называемое HTTP streaming) – механизм отправки данных с Веб-сервера к Веб-браузеру (рис. 13.4) [15]. HTTP server push может быть реализовано посредством нескольких механизмов. Основной – это когда Веб-сервер не закрывает соединение после отправки ответа клиенту. Веб-сервер оставляет соединение открытым, так что если произойдет событие, то оно может быть отправлено одному или множеству клиентов. Иначе данные составляются в очередь до следующего запроса клиента. Большинство серверов реализуют эту функциональность через CGI (например, NPH скрипты в Apache).
(рис 13.4) Схема работы Comet – HTTP-streaming Другой механизм относится к специальному MIME type, называемый multipart/x-mixed-replace, который был введен Netscape в 1995. Веб-браузер интерпретирует это как изменения документа всякий раз, когда сервер сообщает о новой версии клиенту. Сегодня это все еще поддерживается Firefox, Opera и Safari, но традиционно игнорируется Internet Explorer. Это применимо к HTML-документам, но также для потокового отображения картинок для приложений работающих с
WHATWG Web Applications 1.0 предлагает включить механизм "проталкивания" содержимого клиенту. 1 сентября 2006 браузер Opera реализовала эту новую экспериментальную технологию в функциональности с названием "Server-Sent Events". Сейчас это часть стандартов HTML5. Другой, относящейся к вопросу, частью HTML5 стали Веб-сокеты, которые доступны в Google Chrome, начиная с версии 4.0.249.0, и существуют так же
В последнее время часто можно услышать выражение real-time web, за которым, как говорят, будущее Интернета. По сути, это набор технологий, который позволяет получать в реальном времени данные добавляемые в Сеть. Частным случаем этой идеи является real-time search – поиск в реальном времени.
На данный момент существует несколько поисковиков в реальном времени, а так же несколько экспериментов от гигантов вроде компании Google. Остаются не решенными некоторые практические вопросы, например определение релевантности в поисковой выдаче, но сама технология трансляции данных в браузер пользователя вполне работоспособна.
Один из способов узнать, нет ли на сервере каких либо обновлений, применять технологию
(рис 13.5) Пример асинхронных запросов в AJAX – short pollingТакой тип взаимодействия называется polling (от англ. poll – тянуть), именно вытягиванием данных и занимается браузер. Преимущества перед полным обновлением страницы очевидны, но есть и недостатки. Главным из них является "холостая работа" – часто браузер делает сотни запросов, а в ответ узнает, что новых данных нет. Именно для решения этой проблемы и появилась технология long polling, позволяющая делать запросы, которые возвращают результат, как только он появляется. Пример взаимодействия показан на рис. 13.6 [15].
(рис 13.6) Пример долгих асинхронных запросов – long pollingЭта техника является золотой серединой между простым
Практическая польза использования
Хотя
eval() ;Ext.namespace ;Ext.override ;Ext.extend и соглашения о параметрах конструкторов;Ext.apply ;Ext.applyIf.Компоненты библиотеки
Core:Store ;Reader ;Proxy ;Record.Layout;Tooltip ;Tree ;Grid.В XMLHttpRequest:
$() ;$$() ;$F() ;$A() ;$H() ;Ajax ;Element.Возможности
Вся работа с $.
Главная особенность большинства методов
Технология
HTTP server push – механизм отправки данных с Веб-сервера к Веб-браузеру
Один из способов узнать, нет ли на сервере каких либо обновлений, применять технологию
Технология long polling, позволяет делать запросы, которые возвращают результат, как только он появляется.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.