Скрипт поиска дочерних элементов по типу (на уровне непосредственных потомков).
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-страниц сайта.