Вольный перевод статьи. Оригинал располагается здесь.
Первый релиз-кандидат Prototype 1.6.0 наконец созрел! core team продолжает традицию последовательного обновления API ядра в направлении увеличения производительности и исправлении ошибок. Продолжай читать, чтобы узнать какие произошли изменения в этом важном релизе, или скачай библиотеку сейчас чтобы познакомиться с ней безотлагательно.
Расширения Event API
Мы назвали 1.6.0 релизом "реконструкции событий" внутри команды, и это видно невооружённым глазом - одна их наших самых гавёных API стала одной их самых лучших. Вот, собственно, что было изменено:
<div id="container">
<h1><span id="title">Release notes</span></h1>
...
</div> $("container").observe("titleChanged", function(event) {
this.highlight({ duration: 0.5 });
});
$("title").fire("titleChanged");
document.observe ("contentloaded", function(){ ... })String.prototype.capitalize = String.prototype.capitalize.wrap(
function(proceed, eachWord) {
if (eachWord && this.include(" ")) {
// capitalize each word in the string
return this.split(" ").invoke("capitalize").join(" ");
} else {
// proceed using the original function
return proceed();
}
});
"hello world".capitalize() // "Hello world"
"hello world".capitalize(true) // "Hello World"
Для более извращенного примера, смотрите как можно добавить jQuery-стиль методам коллекции элементов. ($$(“div.widget”).show().highlight()) всего за 40 строк кода обертки для $$ и Element.addMethods.function sum(a, b) {
return a + b;
}
sum(10, 5) // 15
var addTen = sum.curry(10);
addTen(5) // 15function addBorder(element, color) {
return $(element).setStyle({
border: "3px solid " + (color || "red")
});
}
addBorder("sidebar", "#ddd");
$("sidebar").addBorder = addBorder.methodize();
$("sidebar").addBorder("#888");
Prototype интенсивно использует methodize внутри; для примера, многие Math методы добавлены к экземплярам Number:
$w("abs round ceil floor").each(function(method) {
Number.prototype[method] = Math[method].methodize();
});
// добавить класс "busy" через одну секунду
(function() { $("form").addClassName("busy") }).delay(1);
// вызвать событие "requestSent" асинхронно
(function() { $("form").fire("requestSent") }).defer();
var Animal = Class.create({
initialize: function(name) {
this.name = name;
},
eat: function() {
return this.say("Yum!");
},
say: function(message) {
return this.name + ": " + message;
}
});
// subclass that augments a method
var Cat = Class.create(Animal, {
eat: function($super, food) {
if (food instanceof Mouse) return $super();
else return this.say("Yuk! I only eat mice.");
}
});
new Ajax.Request("/people/5.json", { // >> GET /people/5.json HTTP/1.1
onSuccess: function(transport) { // << Content-type: application/json
var person = transport.responseJSON; // << { id: 5, name: "Tobie Langel",
person.city // "Geneva" // << city: "Geneva", ... }
...
}, method: "get"
});
new Element("input", { name: "user", disabled: true });
//-> <input name="user" disabled="disabled" />
DOM построитель использует Element#writeAttribute, другое новое дополнение к DOM API, которое помогает выставлять атрибуты элемента в кросс-браузерном виде.
$("items").insert({ after: new Element("p") });
$("items").insert({ top: "<li>an item</li>" });
$("items").insert("<li>another item</li>"); // defaults to bottom
Если в insert передан объект, содержащий метод toHTML или toElement, то вызывается этот метод для создания HTML кода или DOM элемента для вставки.
var Calendar = Class.create({
// ...,
toElement: function() {
var container = new Element("div");
// ...
return container;
}
});
$("sidebar").insert(new Calendar());
// same as $("sidebar").insert({ bottom: new Calendar() }) or
// $("sidebar").insert({ bottom: new Calendar().toElement() })
$("header").setStyle("font-size: 12px; float: left; opacity: 0.5");
Заметка о производительности: uncamelized-стиль имён свойств в случае установки стиля через хеш объявлен устаревшим. Так что если вы имеете код вроде этого:
$("header").setStyle({ "font-size": "12px" });
Вам необходимо заменить его на один из двух вариантов:
$("header").setStyle({ fontSize: "12px" });
$("header").setStyle("font-size: 12px");
<div id="my_div">
<p>some content</p>
</div>
$("my_div").identify();
// -> "my_div"
$("my_div").down().identify();
// -> "anonymous_element_1"
<div id="my_div">
<p id="anonymous_element_1">some content</p>
</div>
<img id="my_img" />
<span id="my_span">a picture</span>
$("my_img").wrap();
$("my_span").wrap('p', { className: "caption" });
<div><img id="my_img" /></div>
<p class="caption"><span id="my_span">a picture</span></p>
Новый объект document.viewport позволяет определить размеры и позицию окна браузера:
document.viewport.getDimensions() // { width: 1149, height: 923 }
document.viewport.getWidth() // 1149
document.viewport.getHeight() // 923
document.viewport.getScrollOffsets() // { left: 0, top: 1592 }
Расширения API шаблонов."#{last}, #{first}".interpolate({ first: "Andrew", last: "Dupont" })
// "Dupont, Andrew"
"#{name.last}, #{name.first[0]}. (#{location})".interpolate({
name: { first: "Christophe", last: "Porteneuve" }, location: "Paris"
}) // "Porteneuve, C. (Paris)"
Prototype 1.6.0 вводит новое соглашение для первого параметра Enumerable#grep: аргумент должен быть объектом, имеющим метод match, который будет просматривать каждый элемент в Enumerable; Если метод возвращает true, то элемент будет добавлен в результирующий массив, возвращаемый grep-ом. Это значит, что вы можте теперь фильтровать массивы с помощью grep-а, передавая ему любой объект имеющий метод match. Для примера, вы можете легко сократить массив DOM до массива, содержащего только элементы, соответствующие заданному CSS селектору:
elements.grep(new Selector("div.widget:first-child"))
Прототайп связывает RegExp#test с RegExp#match, так что существующий код например просматривающий строку массива с помощью регулярных выражений будут работать так, как вы этого и ожидаете. Конвенция метода сравнения навеяна Ruby оператором ===.
Улучшена поддержка JavaScript 1.6 и WHATWG 1.0 стандартов
Мы подчеркнули свою приверженность веб-стандартам в этой версии с улучшенной поддержкой JavaScript 1.6 и Web WHATWG 1.0 спецификации приложений.
... И ещё немного
Это лишь основные изменения; смотри в CHANGELOG полный список изменений. Мы считаем что многочисленные мелкие изменения являются лишь результатом приведения API к более удобному виду. Так что пожалуйста сообщайте нам, что вы думаете, в mailing списках, и о любых багах, найденных вами (желательно с протестированными патчами).
Заметка о этом релиз кандидате
Мы не намерены в Prototype 1.6.0_rc0 изменять API, но оставляем за собой право внести коррективы API и добавить или убрать функции, которые будут представлены в окончательном варианте.
Download