Один из минусов любой долларовой библиотеки -- это создание лишнего объекта на каждый юзаемый в коде нод. В браузерах поддерживающих prototype для Node мы могли бы просто расширить поведение html-элементов, но поскольку в мсие они растут их com-объектов, этот способ как-бы отпадает. Старая идея имитировать prototype через behavior: url(HTMLElement.htc) страдает непреодолимым недостатком -- чрезвычайно медленной работой на большом DOM. Способ, который хочу обсудить, имеет целью убрать создание лишнего объекта за счет расширения prototype в w3c браузерах, (но создания еще одной лишней функции-обертки в мсие). Собственно сама идея: Код | (function () {
var doc = document, css = doc.styleSheets, win = window, etc;
var BucksObject = function (node) { // унифицированное свойство node для доступа к ноду this.node = node.constructor === String ? doc.getElementById(node) : node; },
bucksPrototype = { method : code, etc }; if(window.Node && Node.prototype) {
// расширение Node для стандартных браузеров
window.$ = function (node) { if( node.constructor === String ) { node = doc.getElementById(node) }; // унифицированное свойство node для доступа к ноду node.node = node; return node; };
expand(Node.prototype, bucksPrototype); // копирует только отсутствующие свойства
} else {
// создание объекта-обертки для браузеров без Node.prototype
window.$ = function (argument) { return argument instanceof BucksObject ? argument : new BucksObject(argument) };
// создать обертки для всех методов for (var name in bucksPrototype) { bucksPrototype[name] = (function(method){ return function () { return method.apply(this.node, arguments) }})(bucksPrototype[name]); };
BucksObject.prototype = bucksPrototype; }; })()
|
|