JavaScript'ы для сайта-визитки

Скрипт поиска дочерних элементов по типу (на уровне непосредственных потомков).

  Node.prototype.getChildElementsByTagName = function (tagName) { // Не работает в старых IE, т.к. нет prototype
    var A=[];
    for (var i=0; i<this.childNodes.length; ++i) if (this.childNodes[i].tagName==tagName) A.push(this.childNodes[i]);
    return A;
  }
  function getChildElementsByTagName (elem, tagName) { // Функция работает везде
    var A=[];
    var chN=elem.childNodes; // Не вызывать с передачей текстовых узлов (элементов)!
    for (var i=0; i<chN.length; ++i) if (chN[i].tagName==tagName) A.push(chN[i]);
    return A;
  }

Функция (объект) буфер стекового типа

function Bufer() {
  var buf=[];
  return function(Data) {
    if (Data===undefined) { // Если функция вызывается без аргумента, то просто возвращается последний элемент массива
      if (buf.length) return buf.pop();
      else return null;
    }
    else return buf.push(Data); // Если передаётся аргумент, то функция вставляет данные в хвост массива buf
  };
}

var bufer = Bufer(), bufer2 = Bufer(); // Инициализация двух буферов
// Демонстрация заполнения и выборки элементов стека
alert("0 "+bufer());
alert("1 "+bufer(0));
alert("2 "+bufer(1));
alert("3 "+bufer2());
alert("4 "+bufer2("нуль"));
alert("5 "+bufer2("адын"));
alert("6 "+bufer2("два"));
alert("7 "+bufer2());
alert("8 "+bufer2());
alert("9 "+bufer2());
alert("10 "+bufer2());
alert("11 "+bufer(2));
alert("12 "+bufer());
alert("13 "+bufer());
alert("14 "+bufer());
alert("15 "+bufer());

Функция получения знака числа

function MathSign(x) { return x?x<0?-1:1:0; }

Функция-декоратор кэширующая вычисления предыдущих вызовов. В примере использована простая математическая функция. Практически, целесообразно кешировать преимущественно сложные функции, т.к. операция хэширования ключа и поиска в кэше затратна относительно сложности математических вычислений.

function f(x) { // Некоторая функция с произвольным количеством аргументов
  return x+Math.random(); /* random() добавлен для демонстрации того, что при
                             прямом запуске производятся полные вычисления.
                             При работе кеширования, результат разных вызовов
                             с одинаковыми аргументами, будет возвращать
                             одинаковый результат и повторного вызова не будет. */
}

function makeCaching(f) { // Собственно ДЕКОРАТОР - функция обёртка
  var cache={}; // Объект для хранения результатов вычислений
  return function(){ // Возвращается функция, которая проверяет наличие результата
           var hashString=[].join.call(arguments,arguments); // Хэш для кэша
           if (!(hashString in cache)) cache[hashString]=f.apply(this,arguments);
           return cache[hashString];
         };
}

alert(f(3)); // До декорации - результаты отличаются
alert(f(3));
f = makeCaching(f); // Операция обёртки
alert(f(3)); // После обёртки - результаты одинаковые
alert(f(3));

Функция проверки отношения предок-потомок для пары элементов. A - потенциальный предок элемента B.

function checkAncestor(A, B) {
  if (!A || !B || A==B) return false;
  do
    B=B.parentNode;
  while (B && B!=A);
  return A==B;
}
function checkAncestor(A, B) {
  while (B && (B=B.parentNode)!=A) ; // Цикл приведения B к родителю или корневому элементу
  return Boolean(A) && A==B;
}
function checkAncestor(A, B) {
  return (A && B && (B=B.parentNode))?(A == B)?true:checkAncestor(A, B):false;
}
function checkAncestor(A, B) { // Рекурсивная функция с мозголомным булевым оператором
  return Boolean(A && B && (B=B.parentNode) && (A==B || checkAncestor(A, B)));
}

JavaScript функция рекурсивного обхода дерева DOM с применением к элементам функции.

function forEachInTree(root, procedure, isTarget, isRecursive) {
  /* Применение procedure к каждому элементу из root при условии isTarget.
     root д.б. строго элементом (с возможными потомками), это кажется более
     удобным в использовании и логичным в реализации рекурсии.
     Рекурсивный вход д.б. до применения procedure. Иначе м.б. неограниченный
     рост DOM.
  */
  for (var i=0; i<root.childNodes.length; ++i) {
    var N=root.childNodes[i];
    if (typeof isRecursive == "function" ? isRecursive(N) : isRecursive)
      arguments.callee(N, procedure, isTarget, isRecursive);
    /* Рекурсивный вход произойдёт даже если N будет текстовым узлом.
       Это следует считать логической ошибкой, но т.к. и у текстовых узлов
       есть childNodes, то алгоритм не сломается. */
    if (typeof isTarget == "function" ? isTarget(N) : isTarget)
      procedure(N);
  }
}

Скрипт переноса элементов HTML-страниц сайта.

Алгоритм Луна для проверки форм.

Резюме и портфолио JavaScript разработчика.