по русски
Позволю себе прокамментить немножко функции и привести свои доработки.
Куки
Приведенная функция getCookie() имеет совершенно жесткие глюки. Например, поиск куки в строке:
var start = document.cookie.indexOf( name + '=' );
Т.е. у нас кука, допустим, имеет имя "x". Ищем мы "x=". А что будет если так же есть кука с именем "sex"? Прально, мы можем напороться первым делом на нее. Совершенно жесткий незачот.
Так же вместо нормальных encodeURIComponent и decodeURIComponent используются к делу не относящиеся escape/unescape.
То есть работать это будет если мы только читаем при помощи getCookie, куки установленные setCookie.
Если мы из getCookie будем пытаться читать куки пришедшие с сервера или на сервере читать установленные setCookie, то ничего хорошего не выйдет.
Посему:
var cookie = new (function() {
var cash;
var self = this;
this.set = (
function(name, value, expires, path, domain, secure)
{
var cook = name + "=" + encodeURIComponent(value);
if (expires) {
var t = new Date();
t.setTime(t.getTime() + expires * 1000);
cook += ";expires=" + t.toGMTString();
}
if (path) {
cook += ";path=" + encodeURIComponent(path);
} else if (path === undefined) {
cook += ";path=/";
}
if (domain) {
cook += ";domain=" + domain;
}
if (secure) {
cook += "secure";
}
document.cookie = cook;
if (cash) {
cash[name] = value;
}
return true;
}
);
this.get = (
function(name)
{
if (cash) {
return cash[name];
}
cash = {};
var cook = document.cookie.split(";");
for (var i = 0; i < cook.length; i++) {
var c = cook[i].split("=");
cash[c[0].replace(/^\s*/, "").replace(/\s*$/, "")] = decodeURIComponent(c[1].replace(/^\s*/, "").replace(/\s*$/, ""));
}
return cash[name];
}
);
this.del = (
function(name, path, domain)
{
self.set(name, "", -1, path, domain);
if (cash) {
cash[name] = undefined;
}
return true;
}
);
})();
Во-первых, создаем не кучу глобальных функций, а только один объект, после чего вызываем cookie.set(), cookie.get(), cookie.del()
Во-вторых, path по умолчанию равен "/".
В-третих, в качестве даты устаревания передается относительное время в секундах. То есть 3600 — кука на час.
В-четвертых, кешируем результаты разбора строки с куками.
В-пятых, нет вышеописанных глюков.
Бакс с кэшем
function $(node, nocash)
{
if (typeof(node) == "object") {
return node;
}
var callee = arguments.callee;
if (!callee.cashEnable) {
return document.getElementById(node);
}
if ((!nocash) && (callee.cash[node])) {
return callee.cash[node];
}
return callee.cash[node] = document.getElementById(node);
}
$.cash = {};
$.cashEnable = true;
$.cashReset = (function() {$.cash = {};});
Возвращает DOM-элемент. На входе сам элемент или его ID.
С множеством аргументом не парюсь, так как необходимость в подобном возникает редко и спокойно решается чем-то вроде
var elements = [$("a"), $("b"), obj];
Результаты поиска по ID кешируются, что при большом количестве элементов дает достаточно ощутимый прирост скорости, по крайней мере на некоторых браузерах.
При этом могут быть глюки, если вносятся изменения в DOM-дерево, после чего по ID ищутся динамически созданные элементы. Решается отключением кеша ($.cashEnable = false) либо указанием аргумента nocash.
inArray()
Пример забавный, конечно. Но, прежде, чем изменять прототипы нужно убедится, что данная функция там не присутствует. Возможно её определила другая библиотека, а, возможно, она уже появилась в браузерах.
Очень грустно, что и inArray не входит в ядро DOM
Вообще глупость. Array встроенный ECMA-объект. К DOM никаким боком не относится.
toggle()
А в подобных функциях можно использовать нашу любимую $:
function toggle(obj) {
var el = $(obj);
//...
}
addEvent()
А мне так нравится :):
function addEvent(node, event, handler)
{
var f;
if (window.addEventListener) {
f = (
function(node, event, handler)
{
return $(node).addEventListener(event, handler, false);
}
);
} else if (window.attachEvent) {
f = (
function(node, event, handler)
{
return $(node).attachEvent("on" + event, handler);
}
);
} else {
f = (
function(node, event, handler)
{
return $(node)["on" + event] = handler;
}
);
}
addEvent = f;
return f(node, event, handler);
}
Во-первых, используем всю ту же $(), позволяя пользователю передавать, как объект, так и ID.
Во-вторых, при первом вызове функция переопределяется на нужную и теперь не будет каждый раз ненужных проверок и ветвлений.