Javascript.RU

10 лучших функций на JavaScript

Переписанный вариант статьи Дастина Диаза

Если бы существовал универсальный файл common.js, которым пользовались бы все разработчики, вы бы нашли там эти десять (плюс одна бонусная) функций.

UPDATE март 2010: Эта статья была обновлена и переписана, чтобы соответствовать сегодняшнему дню и общему уровню сайта.

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

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

Несомненно, важнейший инструмент в управлении событиями! Вне зависимости от того, какой версией вы пользуетесь и кем она написана, она делает то, что написано у неё в названии: присоединяет к элементу обработчик события.

function addEvent(elem, evType, fn) {
	if (elem.addEventListener) {
		elem.addEventListener(evType, fn, false);
	}
	else if (elem.attachEvent) {
		elem.attachEvent('on' + evType, fn)
	}
	else {
		elem['on' + evType] = fn
	}
}

Этот код обладает двумя достоинствами - он простой и кросс-браузерный.

Основной его недостаток - в том, он не передает this в обработчик для IE. Точнее, этого не делает attachEvent.

Для передачи правильного this можно заменить соответствующую строку addEvent на:

elem.attachEvent("on"+evType, function() { fn.apply(elem) })

Это решит проблему с передачей this, но обработчик никак нельзя будет снять, т.к. detachEvent должен вызывать в точности ту функцию, которая была передана attachEvent.

Существует два варианта обхода проблемы:

  1. Возвращать функцию, использованную для назначения обработчика:
    function addEvent(elem, evType, fn) {
    	if (elem.addEventListener) {
    		elem.addEventListener(evType, fn, false)
                    return fn
    	}
    
            iefn = function() { fn.call(elem) } 
            elem.attachEvent('on' + evType, iefn)
    	return iefn
    }
    
    function removeEvent(elem, evType, fn) {
    	if (elem.addEventListener) {
    		elem.removeEventListener(evType, fn, false)
                    return
    	}
     
            elem.detachEvent('on' + evType, fn)
    }
    

    Используется так:

    function handler() { 
        alert(this) 
    }
    var fn = addEvent(elem, "click", handler)
    ...
    removeEvent(elem, "click", fn)
    
  2. Можно не использовать this в обработчике события вообще, а передавать элемент через замыкание:

    function handler() { 
       // используем не this, а переменную, ссылающуюся на элемент
        alert(*!*elem*/!*) 
    }
    ...
    

В качестве альтернативы и для примера более серьезной библиотеки обработки событий вы можете рассмотреть статью Кросс-браузерное добавление и обработка событий.

Для инициализации страницы исторически использовалось событие window.onload, которое срабатывает после полной загрузки страницы и всех объектов на ней: счетчиков, картинок и т.п.

Событие onDOMContentLoaded - гораздо лучший выбор в 99% случаев. Это событие срабатывает, как только готов DOM документ, до загрузки картинок и других не влияющих на структуру документа объектов.

Это очень удобно, т.к. картинки могут загружаться долго, а обработчик onDOMContentLoaded может произвести необходимые изменения на странице и инициализацию интерфейсов тут же, не дожидаясь загрузки всего.

Для добавления обработчика можно использовать следующий кроссбраузерный код:

function bindReady(handler){

	var called = false

	function ready() { // (1)
		if (called) return
		called = true
		handler()
	}

	if ( document.addEventListener ) { // (2)
		document.addEventListener( "DOMContentLoaded", function(){
			ready()
		}, false )
	} else if ( document.attachEvent ) {  // (3)

		// (3.1)
		if ( document.documentElement.doScroll && window == window.top ) {
			function tryScroll(){
				if (called) return
				if (!document.body) return
				try {
					document.documentElement.doScroll("left")
					ready()
				} catch(e) {
					setTimeout(tryScroll, 0)
				}
			}
			tryScroll()
		}

		// (3.2)
		document.attachEvent("onreadystatechange", function(){

			if ( document.readyState === "complete" ) {
				ready()
			}
		})
	}

	// (4)
    if (window.addEventListener)
        window.addEventListener('load', ready, false)
    else if (window.attachEvent)
        window.attachEvent('onload', ready)
    /*  else  // (4.1)
        window.onload=ready
	*/
}
readyList = []

function onReady(handler) {

	if (!readyList.length) {
		bindReady(function() {
			for(var i=0; i<readyList.length; i++) {
				readyList[i]()
			}
		})
	}

	readyList.push(handler)
}

Использование:

onReady(function() {
  // ... 
})

Подробное описание функций bindReady, onReady и принципы их работы вы можете почерпнуть в статье Кроссбраузерное событие onDOMContentLoaded.

Изначально не написана никем конкретно. Многие разработчики писали свои собственные версии и ничья не показала себя лучше остальных.

Следующая функция использует встроенный метод getElementsByClass, если он есть, и ищет элементы самостоятельно в тех браузерах, где этого метода нет.

if(document.getElementsByClassName) {

	getElementsByClass = function(classList, node) {    
		return (node || document).getElementsByClassName(classList)
	}

} else {

	getElementsByClass = function(classList, node) {			
		var node = node || document,
		list = node.getElementsByTagName('*'), 
		length = list.length,  
		classArray = classList.split(/\s+/), 
		classes = classArray.length, 
		result = [], i,j
		for(i = 0; i < length; i++) {
			for(j = 0; j < classes; j++)  {
				if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) {
					result.push(list[i])
					break
				}
			}
		}
	
		return result
	}
}
classList
Список классов, разделенный пробелами, элементы с которыми нужно искать.
node
Контекст поиска, внутри какого узла искать

Например:

var div = document.getElementById("mydiv")
elements = getElementsByClass('class1 class2', div)

Следующие две функции добавляют и удаляют класс DOM элемента.

function addClass(o, c){
    var re = new RegExp("(^|\\s)" + c + "(\\s|$)", "g")
    if (re.test(o.className)) return
    o.className = (o.className + " " + c).replace(/\s+/g, " ").replace(/(^ | $)/g, "")
}
 
function removeClass(o, c){
    var re = new RegExp("(^|\\s)" + c + "(\\s|$)", "g")
    o.className = o.className.replace(re, "$1").replace(/\s+/g, " ").replace(/(^ | $)/g, "")
}

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

Этот вариант никоим образом он не претендует на звание универсальной функции-"переключателя", но он выполняет основную функциональность показывания и спрятывания.

function toggle(el) {
    el.style.display = (el.style.display == 'none') ? '' : 'none'
}

Обратите внимание, в функции нет ни слова про display='block', вместо этого используется пустое значение display=''. Пустое значение означает сброс свойства, т.е. свойство возвращается к значению, указанному в CSS.

Таким образом, если значение display для данного элемента, взятое из CSS - none (элемент спрятан по умолчанию), то эта функция toggle не будет работать.

Этот вариант функции toggle красив и прост, однако этот и некоторые другие недостатки делают его недостаточно универсальным. Более правильный вариант toggle, а также функции show и hide описаны в статье Правильные show/hide/toggle.

Как и getElementsByClass, этой функции почему-то нет в стандарте DOM. Возможно, чтобы избежать дублирования функционала, т.к. insertAfter реализуется всего одной строчкой.

function insertAfter(parent, node, referenceNode) {
	parent.insertBefore(node, referenceNode.nextSibling);
}

Очень жаль, что это не часть встроенной функциональности DOM. Зато теперь у нас есть возможность всё время вставлять такие вот замечания!

Для поиска эта функция использует проверку ===, которая осуществляет поиск по точному сравнению, без приведения типов.

Метод Array.prototype.indexOf поддерживается не во всех браузерах, поэтому используется, если существует.

inArray = Array.prototype.indexOf ?
    function (arr, val) {
        return arr.indexOf(val) != -1
    } :
    function (arr, val) {
        var i = arr.length
        while (i--) {
            if (arr[i] === val) return true
        }
        return false
    }

В javascript нет способа нормально работать с cookie без дополнительных функций. Не знаю, кто проектировал document.cookie, но сделано на редкость убого.

Поэтому следующие функции или их аналоги просто необходимы.

// возвращает cookie если есть или undefined
function getCookie(name) {
	var matches = document.cookie.match(new RegExp(
	  "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
	))
	return matches ? decodeURIComponent(matches[1]) : undefined 
}

// уcтанавливает cookie
function setCookie(name, value, props) {
	props = props || {}
	var exp = props.expires
	if (typeof exp == "number" && exp) {
		var d = new Date()
		d.setTime(d.getTime() + exp*1000)
		exp = props.expires = d
	}
	if(exp && exp.toUTCString) { props.expires = exp.toUTCString() }

	value = encodeURIComponent(value)
	var updatedCookie = name + "=" + value
	for(var propName in props){
		updatedCookie += "; " + propName
		var propValue = props[propName]
		if(propValue !== true){ updatedCookie += "=" + propValue }
	}
	document.cookie = updatedCookie

}

// удаляет cookie
function deleteCookie(name) {
	setCookie(name, null, { expires: -1 })
}

Аргументы:

name
название cookie
value
значение cookie (строка)
props
Объект с дополнительными свойствами для установки cookie:

expires
Время истечения cookie. Интерпретируется по-разному, в зависимости от типа:

  • Если число - количество секунд до истечения.
  • Если объект типа Date - точная дата истечения.
  • Если expires в прошлом, то cookie будет удалено.
  • Если expires отсутствует или равно 0, то cookie будет установлено как сессионное и исчезнет при закрытии браузера.
path
Путь для cookie.
domain
Домен для cookie.
secure
Пересылать cookie только по защищенному соединению.

Она позволяет функции работать одинаково при передаче DOM-узла или его id.

function byId(node) {
        return typeof node == 'string' ? document.getElementById(node) : node
}

Используется просто:

function hide(node) {
    node = byId(node)
    node.style.display = 'none'
}

function animateHide(node)
   node = byId(node)
   something(node)
   hide(node)
}

Здесь обе функции полиморфны, допускают и узел и его id, что довольно удобно, т.к. позволяет не делать лишних преобразований node <-> id.


Надеюсь, этот небольшой и удобный список JavaScript-функций будет столь же полезен вам, сколь он полезен мне.


Автор: Арсений (не зарегистрирован), дата: 16 февраля, 2009 - 12:03
#permalink

в JS нет худших и лучших функций, все нужны и полезны в конкретных ситуациях


Автор: Dmitris (не зарегистрирован), дата: 19 февраля, 2009 - 10:22
#permalink

Я бы еще добавил динамическую подгрузку JavaScript файлов, например этот метод: http://www.artlebedev.ru/tools/technogrette/js/include/

или метод который используется в Scriptalicous


Автор: Aleko (не зарегистрирован), дата: 8 января, 2010 - 02:40
#permalink

Не нашел куда написать, поэтому пишу сюда. Я написал самое компактное определение IE из всех которые я знаю. Думаю пригодится:

var ie=!-[1,];
alert(ie);

можно и в 5 символов, но будет возвращаться false в эксплорере

var notie=-[1,];
alert(notie);

Используется баг с подсчетом элементов массива.

Подробнее здесь: линк


Автор: Илья Кантор, дата: 11 января, 2010 - 12:18
#permalink

Статью переписал. Как следствие, многие комментарии перестали относиться к переписанному варианту и были убраны.
По виду, получилось более актуально чем было...


Автор: Бобр, дата: 21 января, 2010 - 10:14
#permalink

Функции setCookie и getCookie работают в FireFox, но не работают в Chrome:

setCookie('Test1', 'TestText1', "");
alert(getCookie('Test1'));

В чём тут дело? Либо можно пример вызова, который точно работает?


Автор: Илья Кантор, дата: 21 января, 2010 - 11:40
#permalink

Дело в том, что 3й аргумент - props - объект. Если не хотите его указывать - не надо ставить "".

setCookie('Test1', 'TestText1');
alert(getCookie('Test1'));

Автор: Бобр, дата: 21 января, 2010 - 12:49
#permalink

Так тоже не работает. У вас установлен Хром? Ну, попробуйте создать пустую страничку с одним этим скриптом. Выдаст undefined. A FireFox - "TestText1".


Автор: Илья Кантор, дата: 21 января, 2010 - 13:09
#permalink

Да, установлен. Попробуйте сами - вот страничка http://javascript.ru/test.html . Все работает.


Автор: Бобр, дата: 21 января, 2010 - 13:24
#permalink

Но я же не могу свои странички к вам на сервер закачивать. Я запускаю со своего винчестера. И не работает.


Автор: Илья Кантор, дата: 21 января, 2010 - 13:51
#permalink

Закачайте их к себе на сервер и запустите. Дело, видимо, как раз в том, что вы с винчестера запускаете, а надо - с сайта.


Автор: Бобр, дата: 21 января, 2010 - 17:24
#permalink

А у меня сейчас нету сервера. Да и неудобно это. Вот на винчестере страничка, я её правлю, и сразу проверяю в браузере, никуда не закачивая.

Да и в FireFox'e то работает нормально. Может что-то не учтено, надо в скрипт ещё какую-то строчку кода для Хрома добавить?


Автор: Гость (не зарегистрирован), дата: 22 января, 2010 - 23:34
#permalink

Насколько я знаю, кука ставиться для УРЛа (Домена).
Если вы открываете страничку с винта, то где там имя домена?
Возможно Хром понимает бесполезность такого действия и ничего не предпринимает.
Насчет сервера: почему это неудобно? Неужели трудно поставить Денвер или какой-нибудь его аналог и работать в нормальных условиях, приближенных к реальным?


Автор: Гость (не зарегистрирован), дата: 5 ноября, 2010 - 14:37
#permalink

localhost )


Автор: SergeyM (не зарегистрирован), дата: 21 марта, 2011 - 18:06
#permalink

В хроме, начиная с 5й версии локально многие вещи не работают.
Например "ajax" и cookie.

Чтобы это работало "с винчестера" нужно запускать chrome.exe с ключами (можно дописать в свойства ярлыка):
--allow-file-access-from-files --enable-file-cookies


Автор: Гость (не зарегистрирован), дата: 21 мая, 2010 - 08:25
#permalink

у хрома (по крайней мере на начальных этапах его становления и развития) наблюдается проблема с работой кук. долго бился, пока не понял это =( куки ни одним обычным методом не удалялись: и пустоту в них писал, и нулл, и время в прошлое... просто голову сломал.


Автор: smashercosmo, дата: 4 марта, 2010 - 20:57
#permalink

Объясните пожалуйста, зачем в функции getElementsByClass():
a) нужна переменная key
b) нужны границы слова в

'\\b' + classArray[j] + '\\b'

Автор: Илья Кантор, дата: 31 марта, 2010 - 01:05
#permalink

а) убрал, она лишняя была
б) границы нужны, чтобы корректно обрабатывать элемент со множеством классов:

<div class="header logo">...</div>

Автор: smashercosmo, дата: 15 апреля, 2010 - 12:49
#permalink

Без указания границ слова всё обрабатывается корректно. По крайней мере я не смог создать такую ситуацию, когда отсутствие границ слова вызвало бы ошибку. Проверял с разными классами, с разным количеством пробелов, в разных браузерах. Не могли бы вы привести пример когда без границ слова, будет выводиться что-то неправильное?


Автор: smashercosmo, дата: 21 апреля, 2010 - 12:54
#permalink

Всё. Дошло. На самом деле "\\b" нужно не для того чтобы обрабатывать элементы с несколькими классами. А для таких случаев, если у меня есть один элемент с "class1" и другой элемент с "class11111". Без "\\b" по запросу "class1" будут найдены оба элемента.


Автор: Гость (не зарегистрирован), дата: 17 мая, 2010 - 15:58
#permalink

Пожалуйста верните комментарий, в котором приведены аналоги на JQuery.
Он был очень полезным.


Автор: GreatRash, дата: 17 августа, 2010 - 13:52
#permalink

Нашел красивейшую функцию по замене inArray:

function oc(a) {
	var o = {};
	
	for (var i = 0, l = a.length; i < l; i++) {
		o[a[i]] = '';
	}
	
	return o;
}

alert('test' in oc(['te', 'st', 'test']));
alert('test' in oc(['te', 'st', 'es', 't']));
alert(25 in oc([1, 2, 3, 4, 25]));
alert(1 in oc([2, 3, 4, 25]));

Источник


Автор: MainBuh, дата: 3 декабря, 2010 - 13:51
#permalink

Да действительно орининальное решение - но бесполезное - слишком много итераций. Это при больших массивах очень долго, особенно если искомое значение (по "закону полдлости") будет вначале масива.
Еще недостаток она не универсальна - с объектами работать не будет
("...a.length ...").

Знаю что не открываю Америку и не изобретаю велосипед - поэтому это только для GreatRash (автора комментария):

//-Проверяет содержится ли значение в массиве/объекте
inObject=inArray=function(obj, value, flEqualityType){
/*
Параметры:
- obj - объект или массив значений в котором ищем
- value - искомое значение
- flEqualityType - (необязательный) - флаг сравнения типов [true | false]
(по умолчанию false - сравнение без типов данных)
*/
var obj=obj, value=value, flEqualityType=flEqualityType || false;
if(!obj || typeof(obj)!='object') return false;
for(var i in obj){
if(flEqualityType===true && obj[i]===value) return true;
if(flEqualityType===false && obj[i]==value) return true;
}
return false;
};


Автор: blogic (не зарегистрирован), дата: 20 августа, 2010 - 21:06
#permalink

Функция insertAfter не будет работать, если попытаться вставить ноду после последнего элемента в узле, т.к. его nextSibling == null. Вот рабочий вариант:

function insertAfter(node, ref_node) {
	var next = ref_node.nextSibling;

	if (next) next.parentNode.insertBefore(node, next);
	else ref_node.parentNode.appendChild(node);
}

Можно обойтись и без дополнительной переменной next, но так наглядней...


Автор: RomanWeberov (не зарегистрирован), дата: 10 сентября, 2010 - 18:49
#permalink

Ваш пример нужно дорабатывать, т.к. nextsibling может указывать на текстовый элемент.

function next(elem) {
do {
elem = elem.nextSibling;
} while ( elem && elem.nodeType != 1 );
return elem;
}

Ну и соответственно

var next = next(ref_node);

Автор: blogic (не зарегистрирован), дата: 17 сентября, 2010 - 12:43
#permalink

RomanWeberov, с какой такой стати текстовые элементы не должны учитываться? Функция insertAfter() должна вставлять элемент строго после указанного и никак иначе.


Автор: Илья Кантор, дата: 11 сентября, 2010 - 13:41
#permalink

Вы проверяли, что не будет работать?

Относительно текстового элемента - он тоже элемент..


Автор: blogic (не зарегистрирован), дата: 17 сентября, 2010 - 13:01
#permalink

Да, надо было проверить:(
Теперь буду знать:)
Но в любом случае, функцию можно упростить, убрав из списка аргументов parent'а.


Автор: юрист (не зарегистрирован), дата: 13 октября, 2010 - 20:57
#permalink

Отличная подборка сценариев Обожаю ваш блог и ваш труд


Автор: monolithed, дата: 5 января, 2011 - 00:08
#permalink

Илья, мне кажется пример с getElementsByClassName() может ввести в заблуждение новичков, потому как этот метод по спецификации принимает один аргумент, а у тебя в примере использования их несколько причем еще и ID. Для этого есть querySelector(), querySelectorAll();

К тому же код можно упростить, сделать более универсальным, а также значительно увеличить производительность:

<script type="text/javascript">
window.onload = function() {
	getElementsByClass = function(getClass){
		if(document.querySelectorAll) {
			return document.querySelectorAll("." + getClass);
		}
		else if(document.getElementsByClassName) {
			return document.getElementsByClassName(getClass);
		}
		else {
			var list = document.getElementsByTagName('*'), i = list.length,
			classArray = getClass.split(/\s+/), result = [];
			while(i--) {
				if(list[i].className.search('\\b' + classArray + '\\b') != -1) {
					result.push(list[i]);
				}
			}
			return result;
		}
	};
	getElementsByClass('class')[0].style.color = 'red';
};
</script>
<p class="class">text</p>

PS: добавление querySelectorAll() дает нам возможность работать с IE8+, а обратный цикл уменьшает время выполнения функции в несколько раз


Автор: Илья Кантор, дата: 5 января, 2011 - 00:12
#permalink

Отличный вариант, спасибо.


Автор: Denisko-Redisko, дата: 28 августа, 2011 - 09:31
#permalink

Нельзя использовать в регулярках \bneedle\b, так как christmas-tree-needle это один класс.

<div id="d1">
<p class="par">Текстовый блок НЕ ДОЛЖЕН быть подсвечен</p>
<p class="par-tition">Текстовый блок НЕ ДОЛЖЕН быть подсвечен</p>
<p class="par par1">Текстовый блок должен быть подсвечен</p>
<p class="par asd par1 qwe">Текстовый блок должен быть подсвечен</p>
</div>
<div id="d2">
<p class="par">Текстовый блок НЕ ДОЛЖЕН быть подсвечен</p>
<p class="par-tition">Текстовый блок НЕ ДОЛЖЕН быть подсвечен</p>
<p class="par par1">Текстовый блок должен быть подсвечен</p>
<p class="par asd par1 qwe">Текстовый блок должен быть подсвечен</p>
</div>

<script type="text/javascript">
if (document.getElementsByClassName) {
    getElementsByClass = function(classList, node) {    
        return (node || document).getElementsByClassName(classList)
    }
} else {

    getElementsByClass = function(classList, node) {            
        var node = node || document,
        list = node.getElementsByTagName('*'), 
        length = list.length,
        classArray = classList.split(/\s+/), 
        classes = classArray.length, 
        result = [], i,j
        for(i = 0; i < length; i++) {
            for(j = 0; j < classes; j++)  {
                if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) {
                    result.push(list[i])
                    break
                }
            }
        }
        return result
    }
}

function findByClass(str, node) {

    node || (node = document);

    if (node.getElementsByClassName) {
        return node.getElementsByClassName(str);
    } else {
        var nodeList = node.getElementsByTagName('*'),
            nodeListIndex = 0,
            classList = (' '+str.split(/\s+/).join(' ; ')+' ').split(';'),
            classListIndex,
            result = [],
            className,
            index;

        while (node = nodeList[nodeListIndex++]) {
            index = 0;
            classListIndex = 0;
            while (className = classList[classListIndex++]) {
                if ((' ' + node.className + ' ').indexOf(className) >= 0) {
                    index++;
                }
            }
            if (index == classList.length) {
                result.push(node);
            }
        }
        return result;
    }
}


var elems = getElementsByClass('par par1', document.getElementById("d1"));
for (var i = 0, len = elems.length; i < len; i++) {
    elems[i].style['color'] = 'red';
}

var elems = findByClass('par par1', document.getElementById("d2"));
for (var i = 0, len = elems.length; i < len; i++) {
    elems[i].style['color'] = 'blue';
}
</script>

Автор: VitAl2013, дата: 2 апреля, 2012 - 08:44
#permalink

В FireFox 11 подсветка не работает.


Автор: chernavin.a.a (не зарегистрирован), дата: 7 февраля, 2011 - 13:44
#permalink

Функция getElementsByClass() работает неверно в IE при поиске узлов с несколькими классами.

<script type="text/javascript">
if(document.getElementsByClassName) {

	getElementsByClass = function(classList, node) {    
		return (node || document).getElementsByClassName(classList)
	}

} else {

	getElementsByClass = function(classList, node) {			
		var node = node || document,
		list = node.getElementsByTagName('*'), 
		length = list.length,  
		classArray = classList.split(/\s+/), 
		classes = classArray.length, 
		result = [], i,j
		for(i = 0; i < length; i++) {
			for(j = 0; j < classes; j++)  {
				if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) {
					result.push(list[i])
					break
				}
			}
		}
	
		return result
	}
}

		elems=getElementsByClass('par par1');
		for (var i=0;elems.length;i++)
			elems[i].style.color='red';
		</script>

<p class="par">Текстовый блок</p>
<p class="par par1">Текстовый блок под номером два</p>

В FF и Opera будет выделен второй абзац, т.к. используется встроенная функция, а IE выделит оба.


Автор: medium, дата: 2 апреля, 2011 - 17:32
#permalink

8) getElementsByClass()
Все таки не представлен настоящии универсальный метод:(
По моему самый лучшии вариант от monolithed
НО он загружает только 1 класс
Как правильно сделать полный обход?

var classl=getElementsByClass('class1').length;
for (var i=0; i<classl; i++) {
getElementsByClass('class1')[i].style.color='red';
};// пока только так придумал.. подскажите плиз


Автор: Гость (не зарегистрирован), дата: 12 апреля, 2011 - 03:41
#permalink

Я для себя написал вот такой inArray, он работает и для многомерных массивов

Array.prototype.inArray = Array.prototype.indexOf ? function(elem){
		for(var i = 0, len = this.length; i < len; i ++){
			if(this.indexOf(elem) != -1 || (this[i] instanceof Array && this[i].inArray(elem))){
				return true;
			}
		}
		return false;
	} : function(elem){
			for(var i = 0, len = this.length; i < len; i ++){
				if(elem === this[i] || (this[i] instanceof Array && this[i].inArray(elem))){
					return true;
				}
			}
			return false;
		}

Автор: poorking, дата: 12 апреля, 2011 - 04:11
#permalink

Точнее так

Array.prototype.inArray = Array.prototype.indexOf ? function(elem){
		if(this.indexOf(elem) != -1){
			return true;
		}else{
			for(var i = 0, len = this.length; i < len; i ++){
				if(this[i] instanceof Array && this[i].inArray(elem)){
					return true;
				}
			}
		}
		return false;
	} : function(elem){
			for(var i = 0, len = this.length; i < len; i ++){
				if(elem === this[i] || (this[i] instanceof Array && this[i].inArray(elem))){
					return true;
				}
			}
			return false;
		}

Автор: Гость (не зарегистрирован), дата: 8 октября, 2011 - 12:49
#permalink

Ошибка в inArray(), строка 8. вместо a[] надо arr[]


Автор: m4gz, дата: 1 ноября, 2011 - 18:52
#permalink
document.getElementsByClassName = function(cl) {
var retnode = [];
var myclass = new RegExp('\\b'+cl+'\\b');
var elem = this.getElementsByTagName('*');
for (var i = 0; i < elem.length; i++) {
var classes = elem[i].className;
if (myclass.test(classes)) retnode.push(elem[i]);
}
return retnode;
};

GET
CLASS


Автор: Гость (не зарегистрирован), дата: 21 декабря, 2011 - 11:31
#permalink

Как по мне, так такой вариант выборки классов будет побыстрее:

getElementsByClassName = function(klass, root) {
	root = root || document;
	if (root.querySelectorAll) {
		return root.querySelectorAll('.' + klass)
	} else if (root.getElementsByClassName) {
		return root.getElementsByClassName(klass)
	} else {
		var list = root.all || root.getElementsByTagName('*');
		var result = [];
		for (var index = 0,
		elem; elem = list[index++];) {
			if (elem.className && (' ' + elem.className + ' ').indexOf(' ' + klass + ' ') > -1) {
				result[result.length] = elem
			}
		}
		return result
	}
};

Автор: Гость (не зарегистрирован), дата: 16 февраля, 2012 - 16:06
#permalink


Автор: evgh, дата: 17 февраля, 2012 - 15:15
#permalink

мой вариант функции inArray
без цикла, и символов меньше


Автор: WolF™ (не зарегистрирован), дата: 31 марта, 2012 - 13:27
#permalink

А не легче использовать такой код:

document.getElementsByClassName = function (cl) {
     return document.querySelectorAll('.' + cl);
}

Или я чего-то не понимаю?


Автор: Гость (не зарегистрирован), дата: 27 августа, 2012 - 13:05
#permalink

Например, того, что некоторые недобраузеры функции querySelectorAll не понимают.


Автор: C.I.A. (Гость) (не зарегистрирован), дата: 8 сентября, 2012 - 14:48
#permalink

8) getElementsByClass()

if(document.getElementsByClassName){
 /*
 Здесь логика AND:
 getElementsByClassName - ищет строгое соответствие строке classList
 т.е. к элементу должно быть применено class1 && class2
*/
}else{
 /*
 Здесь логика OR:
 разбор строки classList
 т.е. к элементу может быть применено море классов и поиск такой
 class1 || class2
*/
}

Вариант:

if(document.getElementsByClassName){
  var getElementsByClass = function(classList, node){
  var node = node || document,
       classArray = classList.split(/\s+/),
       result=[];
  for(i=0; i<classArray.length; i++){
    j=node.getElementsByClassName(classArray[i]);
    if(j!='undefined'){
     result.push(node.getElementsByClassName(classArray[i]));
    }
  }
  return result;//aray nodes
 }
}else{
// ... для недобраузеров код прежний
}

Автор: KoVaLsKy (не зарегистрирован), дата: 19 октября, 2012 - 13:35
#permalink

Подскажите, пожалуйста setCookie(name, value, props)
как у эту функцию установить время или дату.
я так понимаю что она сидит в props
как задать в него параметры


Автор: Гость (не зарегистрирован), дата: 23 ноября, 2012 - 15:17
#permalink

подскожите пож. как из .csv где есть много строк, наити самыю длиныю строку и выведить её ,при етом показати сколько букв содержит строка и какой ряд?


Автор: Гость (не зарегистрирован), дата: 6 мая, 2013 - 17:51
#permalink

Предлагаю свой вариант работы с классами:

var has_class=function(obj,class_name){	return _has_class.apply(null,arguments); };
	var _has_class=function(obj,class_name){
		
		var hc1=function( obj , class_name ){ return obj.classList.contains(class_name); }
		var hc2=function( obj , class_name ){ class_name = " " + class_name + " "; return ( (' '+obj.className+' ').indexOf(class_name) >= 0 );	}
		
		if( obj.classList ){ _has_class=hc2; }else{	_has_class=hc2;	}		
		hc1=hc2=null;
		return _has_class.apply(null,arguments);
	};
	
	var add_class=function( obj , class_name ){return _add_class.apply(null,arguments); };
	var _add_class=function( obj , class_name ){
		var ac1=function( obj , class_name ){	obj.classList.add(class_name); return this;}			
		var ac2=function( obj , class_name ){
			var re = new RegExp("(^|\\s)" + class_name + "(\\s|$)", "g");
			if (!re.test(obj.className)) {obj.className = (obj.className + " " + class_name).replace(/\s+/g, " ").replace(/(^ | $)/g, "");}
		};
		
		if( obj.classList ){ _add_class=ac1; }else{ _add_class=ac2;	}
		ac1=ac2=null;
		_add_class.apply( null, arguments );
	};
	
	var remove_class=function( obj , class_name ){ return _remove_class.apply(null,arguments); };
	var _remove_class=function( obj , class_name ){
		var rc1=function( obj , class_name ){ obj.classList.remove(class_name); };			
		var rc2=function( obj , class_name ){
			var re = new RegExp("(^|\\s)" + class_name + "(\\s|$)", "g"); obj.className = obj.className.replace(re, "$1").replace(/\s+/g, " ").replace(/(^ | $)/g, "");
		}
		if( obj.classList ){_remove_class=rc1;}else{_remove_class=rc2;}
		rc1=rc2=null;
		remove_class.apply(null,arguments);
	};

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

Преимущества: определение пути выполнения осуществляется только один раз, при первом вызове функции, при этом используются возможности HTML5. Нормальные браузеры будут работать еще быстрее (чем в JQuery, но не проверял), не нормальные - на том же уровне.

Немного переживаю за излишнее замыкание, но пошел на наго из-за компактности.

Еще пара функций:

var get_offset=function(elem){ return _get_offset(elem); };
	var _get_offset=function(elem){
	
		var __getOffsetRect=function(elem) {
			var box = elem.getBoundingClientRect();
			var body = document.body;
			var docElem = document.documentElement;
			var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
			var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
			var clientTop = docElem.clientTop || body.clientTop || 0;
			var clientLeft = docElem.clientLeft || body.clientLeft || 0;
			var top  = box.top +  scrollTop - clientTop;
			var left = box.left + scrollLeft - clientLeft;
			return { top: Math.round(top), left: Math.round(left) };
		};
		
		var __getOffsetSum=function(elem) {
			var top=0, left=0;
			while(elem) {top = top + parseInt(elem.offsetTop);left = left + parseInt(elem.offsetLeft);elem = elem.offsetParent ;}
			return {top: top, left: left};
		};
	
		if (elem.getBoundingClientRect) { _get_offset=__getOffsetRect; } else { _get_offset=__getOffsetSum; }
		
		__getOffsetRect=__getOffsetSum=null;
		
		return _get_offset(elem);
	};
	
	var fix_event=function(e){ return _fix_event(e); };
	var _fix_event=function(e){
		var __fix_event_ie=function(e){	
			e = e || window.event;
			var html = document.documentElement;
			var body = document.body;
			e.pageX = e.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);
			e.pageY = e.clientY + (html && html.scrollTop || body && body.scrollTop || 0) - (html.clientTop || 0);
			if (e.button & 1) { e.which = 1; } else if (e.button & 4) { e.which = 2; } else if (e.button & 2) {e.which = 3;}
			e.target=e.srcElement;
			return e;
		};
		var __fix_event_html5=function(e){ return e; };
		e = e || window.event;
		if( e.pageX == null && e.clientX != null ){ _fix_event=__fix_event_ie; }else{ _fix_event=__fix_event_html5; }
		__fix_event_ie=__fix_event_html5=null;
		return _fix_event(e);
	};

Автор: psyhonaut (не зарегистрирован), дата: 8 декабря, 2013 - 19:42
#permalink

Добрый день.

Не могу разобраться с клонированием картинок при перетаскивании. Можете направить где копать?


Автор: Гость (не зарегистрирован), дата: 10 декабря, 2014 - 15:40
#permalink

addClass
Какая-то стрёмная замена classList.add()


Автор: Glor (не зарегистрирован), дата: 18 марта, 2015 - 17:18
#permalink

function insertAfter(parent, node, referenceNode) {
parent.insertBefore(node, referenceNode.nextSibling);
}

И где тут проверка, что это не младший сын?


Автор: Seitbekir (не зарегистрирован), дата: 9 сентября, 2015 - 18:13
#permalink

Эти приемы слишком не соответствуют сути прототипно-ориентированного языка.

Почему бы не myObject.addEvent?

как де queryString?

Где демонстрация работы с динамическими элементами?

Да, порой фреймворк использовать не получается (покажите мне такой, в ЛС), но это плохой подход.

ПС: Кину свою мини-библиотеку нужнрых мне порой функций.

Array.prototype.last = function(){ return this[this.length - 1]; }
Array.prototype.unique = function(){
   var u = {}, a = [];
   for(var i = 0, l = this.length; i < l; ++i){
      if(u.hasOwnProperty(this[i])) {
         continue;
      }
      a.push(this[i]);
      u[this[i]] = 1;
   }
   return a;
}
Array.prototype.remove = function(i){ this.splice(i, 1); }

String.prototype.times = function(n){
	var s = '';
	for (var i = 0; i < n; i++){ s += this; }
	return s;
}
ObjLength = function(obj) { if(typeof(obj) != "object") return null; var n = 0; for(var i in obj){ n++; } return n; }
String.prototype.zp = function(n) { return '0'.times(n - this.length) + this; }
Number.prototype.zp = function(n) { return this.toString().zp(n); }
String.prototype.zt = function(n) { return this + '0'.times(n - this.length); } 
Number.prototype.zt = function(n) { return this.toString().zt(n); }

String.prototype.toInt = function() { return parseInt(this); }
String.prototype.toFloat = function() { return parseFloat(this); }
String.prototype.toNumber = function() { return parseFloat(this); }
Number.prototype.toInt = function() { return parseInt(this); }
Number.prototype.toFloat = function() { return parseFloat(this); }
Number.prototype.toNumber = function() { return parseFloat(this); }

Date.prototype.daysInMonth = function() {
	return 33 - new Date(this.getFullYear(), this.getMonth(), 33).getDate();
};

HTMLElement.prototype.remove = function(){ if(this.parentNode != null) this.parentNode.removeChild(this); else delete(this); }
HTMLElement.prototype.insertAfter = function(elem){ this.parentNode.insertBefore(elem, this.nextSibling); }
HTMLElement.prototype.replace = function(elem){ this.parentNode.insertBefore(elem, this.nextSibling); this.remove(); }

var webStore = 
{
	setItem: function (name, object)
		{
			localStorage.setItem(name, JSON.stringify(object))
		},
	getItem: function (name)
		{
			return JSON.parse(localStorage.getItem(name))
		},
	clear: function (name)
		{
			localStorage.clear()
		}
}

ПС2: Пользуйтесь jQ, Angular, polymer и все будет в порядке.


Автор: Гость (не зарегистрирован), дата: 14 января, 2017 - 07:07
#permalink

onReady() дала течь. Вернулся к windows.onload

onReady(function () {
	var out = document.getElementById('out');
	var n7 = getElementsByClass('n7')[0];
	var fff = getComputedStyle(n7);

	//Выводит ложные данные!
	out.innerHTML = n7.offsetTop + '<br>';
	out.innerHTML += fff.width;
});

Автор: dzn, дата: 5 мая, 2017 - 11:24
#permalink

А jQuery использовать мешает высокомерие - мы же крутые JS-разработчики а не х.пойми что )))


Автор: Гость (не зарегистрирован), дата: 11 апреля, 2018 - 12:03
#permalink

K;/K//LK/L


Автор: Гость (не зарегистрирован), дата: 4 октября, 2018 - 12:51
#permalink

Функции полезные, но можно использовать jQuery и разрабатывать на Javascript еще быстрее и эффективнее.


Автор: Bullet (не зарегистрирован), дата: 27 августа, 2019 - 09:26
#permalink

Поэтому, без лишних вступлений, вот список из десяти, по моему мнению, величайших пользовательских функций на JavaScript, которые используются в настоящее время.
bullet force game online.


Автор: Patsy J. Moore (не зарегистрирован), дата: 10 октября, 2019 - 12:28
#permalink

it's been so long since I last read such a favorable article... clash royale


Автор: Гость (не зарегистрирован), дата: 11 ноября, 2019 - 04:27
#permalink

Nice


Автор: osama skh (не зарегистрирован), дата: 1 февраля, 2020 - 16:55
#permalink

I have read your blog it is very helpful for me. I want to say thanks to you. I have bookmark your site for future updates.
translated from spanish


Автор: Гость (не зарегистрирован), дата: 22 февраля, 2020 - 15:53
#permalink

Some truly wonderful work on behalf of the owner of this internet site , perfectly great articles .
high blood pressure


Автор: Гость (не зарегистрирован), дата: 21 марта, 2020 - 06:11
#permalink

Great article. It helps a lot for my work. Thanks for sharing the effective and helpful ways.
mapquest directions


Автор: limdi (не зарегистрирован), дата: 14 апреля, 2020 - 07:06
#permalink

This is a great thing, I think everyone feels this information is very valuable, thank you happy wheels


Автор: Гость (не зарегистрирован), дата: 4 июня, 2020 - 07:10
#permalink

Useless


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:46
#permalink

Wow the blog you give us is amazing, no wonder many people want to read this. https://celebrityinsider.org/


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:48
#permalink

I will recomend this blog to all of my friends. Great article.
https://happygamer.com/


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:49
#permalink

Thank you for this inspiring blog. I wait for more
https://ballstepded.com/


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:50
#permalink

I learned so much from this blog. Good inforamtion. https://fixoserror.com/


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:50
#permalink

I wait for more.Great article.
https://premiereretail.com


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:51
#permalink

I stumbled across this blog.Great article. https://tecsprint.com


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:52
#permalink

Thank you for this amazing blog. Congratulations.
https://howtolose10poundsinaweek.com


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:52
#permalink

The things i see here are very informative. Keep going. https://bargainistafashionista.com


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:52
#permalink

I can say that is one of the best articles out on the internet. https://bankncard.com


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:53
#permalink

I readed all the article. So informative https://vhan.net


Автор: Гость (не зарегистрирован), дата: 10 сентября, 2020 - 16:21
#permalink

This is one of the best sites i have found on the internet until now. Nice article keep going.
https://millikenconstructioninc.com/


Автор: Гость (не зарегистрирован), дата: 11 сентября, 2020 - 16:15
#permalink

Thanks for the information, very clear and simple. I will try to use it.Love the way you write. Working my way through your article links
https://vvhen.to/


Автор: Гость (не зарегистрирован), дата: 15 сентября, 2020 - 12:09
#permalink

This is one of the best articles i found on the blogs around the internet. I am really interested in seeing more of this. Keep going with the great work!
https://gzgjskpzz1m.ga


Автор: Гость (не зарегистрирован), дата: 19 сентября, 2020 - 10:56
#permalink

First of all ,you have picked a very unique theme . I think i might design something similar for a future project that i want to build .
On top of that ,i in truth enjoy most of your content pieces and your different point of view.
Thank you https://seoconsultants24.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 19 сентября, 2020 - 11:34
#permalink

Nice information, many thanks to the author. It is incomprehensible to me now, but in general, the usefulness and significance is overwhelming.https://seokarma24.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 19 сентября, 2020 - 15:20
#permalink

I have reviewed the article many times and I find it very impressive. The information is extremely useful especially the last part I care about that information very much. I have been looking for this certain information for a long time.
https://packseo.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 23 сентября, 2020 - 16:58
#permalink

I’m gone to tell my little brother, that he should
also pay a quick visit this blog on regular basis to take updated from hottest information.
https://connectorseo.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 23 сентября, 2020 - 17:06
#permalink

You have made some really good points there. I looked on the web to find out
more about the issue and found most individuals will go along with your views on this website
https://digitalseo24h.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 23 сентября, 2020 - 17:13
#permalink

Fantastic blog! Do you have any helpful hints for aspiring writers?
I’m hoping to start my own site soon but I’m a little lost on everything.
https://sweetseo24h.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 23 сентября, 2020 - 18:16
#permalink

I am hoping the same best effort from you in the future as well. In fact your creative writing skills has inspired me.
https://fancyseo24h.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 29 сентября, 2020 - 16:25
#permalink

You have made some really good points there. I looked on the web to find out
more about the issue and found most individuals will go along with your views on this website
https://phoenixseogeek.com/


Автор: Гость (не зарегистрирован), дата: 1 октября, 2020 - 21:56
#permalink

Nice information, many thanks to the author. It is incomprehensible to me now, but in general, the usefulness and significance is overwhelming.
https://zgjskpzz1m.ga/


Автор: 먹튀검증 (не зарегистрирован), дата: 14 ноября, 2020 - 17:26
#permalink

Some genuinely interesting information, well written and broadly user pleasant 먹튀검증


Автор: 대출 (не зарегистрирован), дата: 14 ноября, 2020 - 17:27
#permalink

I saw two other comparable posts although yours was the most beneficial so a lot 대출


Автор: 안전놀이터 (не зарегистрирован), дата: 3 декабря, 2020 - 07:42
#permalink

That's a really good article. I'm so happy to read this. What you wrote was very helpful to me.Thank you. When did you start uploading these posts? That's amazing. Actually, I upload articles often like 안전한놀이터, but it is quite difficult to upload quality content like you. If you have time, could you visit my 안전놀이터?


Автор: 안전놀이터 (не зарегистрирован), дата: 3 декабря, 2020 - 07:42
#permalink

What kind of article do you like?? If someone asks, they will say that they like the article related to 안전놀이터 just like your article. If you are interested in my writing, please visit 메이저놀이터!!


Автор: 안전놀이터 (не зарегистрирован), дата: 3 декабря, 2020 - 07:42
#permalink

Your post is very interesting to me. I had so much fun reading. I do a similar kind of posting. Please visit my site once. The site name Is 안전놀이터.In general, there are a lot of materials related to 토토커뮤니티. If you have time, please visit my site 토토커뮤니티사이트!


Автор: 안전놀이터 (не зарегистрирован), дата: 3 декабря, 2020 - 07:42
#permalink

I've never read this kind of story before 안전놀이터. What a great story! I read it really interestingly.As much as I find it interesting, I think you can be impressed with my 토토커뮤니티. My site name is 토토커뮤니티사이트. Please visit!!


Автор: Гость (не зарегистрирован), дата: 10 декабря, 2020 - 20:10
#permalink

This is highly information, crisp and clear. You have a way of writing compelling information that sparks much interest.
https://larkenequity.com/ https://larkenequity.com//


Автор: Гость (не зарегистрирован), дата: 14 декабря, 2020 - 17:18
#permalink

Wow very good post, please dont stop posting things like this because ie really enjoy this
https://hrma-llc.com/
https://hrma-llc.com/


Автор: Гость (не зарегистрирован), дата: 14 декабря, 2020 - 17:33
#permalink

You are a very persuasive writer. I can see this in your article. You have a way of writing compelling information that sparks much interest.
https://nuestropsicologoenmadrid.com/
https://nuestropsicologoenmadrid.com/


Автор: Гость (не зарегистрирован), дата: 14 декабря, 2020 - 18:16
#permalink

I wish more authors of this type of content Wow.!This is highly information, crisp and clear. You have a way of writing compelling information that sparks much interest.!!!
https://cremationconsultancy.com/ https://cremationconsultancy.com//


Автор: Гость (не зарегистрирован), дата: 14 декабря, 2020 - 18:52
#permalink

This is very educational content and written well for a change. It's nice to see that some people still understand how to write a quality post!
https://i-repaircenter.nl/
https://i-repaircenter.nl/


Автор: Гость (не зарегистрирован), дата: 14 декабря, 2020 - 20:21
#permalink

I really thank you for the valuable info on this great subject and look forward to more great posts. Thanks a lot for enjoying this beauty article with me.
https://zoekmachineservices.nl/
https://zoekmachineservices.nl/


Автор: DouglasMRafferty (не зарегистрирован), дата: 15 декабря, 2020 - 03:16
#permalink

I have a bookmark you look at your new things.


Автор: DouglasMRafferty (не зарегистрирован), дата: 15 декабря, 2020 - 03:16
#permalink

I have a bookmark you look at your new things.


Автор: DouglasMRafferty (не зарегистрирован), дата: 15 декабря, 2020 - 03:16
#permalink

I have a bookmark you look at your new things.


Автор: Гость (не зарегистрирован), дата: 15 декабря, 2020 - 16:09
#permalink

I do not know what to say really what you share very well and useful to the community, I feel that it makes our community much more developed
https://hetonderdelenhuis-emmen.nl/ https://hetonderdelenhuis-emmen.nl/


Автор: Гость (не зарегистрирован), дата: 15 декабря, 2020 - 16:28
#permalink

This is very educational content and written well for a change. It's nice to see that some people still understand how to write a quality post!
https://casinoonline-bet.com/
https://casinoonline-bet.com/


Автор: Гость (не зарегистрирован), дата: 15 декабря, 2020 - 16:40
#permalink

Great post! I am actually getting ready to across this information, is very helpful my friend. Also great blog here with all of the valuable information you have. Keep up the good work you are doing here
https://restorationdoctorva.com/
https://restorationdoctorva.com/


Автор: Гость (не зарегистрирован), дата: 15 декабря, 2020 - 17:49
#permalink

You are a very persuasive writer. I can see this in your article. You have a way of writing compelling information that sparks much interest.
https://fixoserror.com/
https://fixoserror.com/


Автор: Гость (не зарегистрирован), дата: 16 декабря, 2020 - 18:21
#permalink

Wow very good post, please dont stop posting things like this because ie really enjoy this
https://vvhen.to/
https://vvhen.to/


Автор: Гость (не зарегистрирован), дата: 16 декабря, 2020 - 21:24
#permalink

You are a very persuasive writer. I can see this in your article. You have a way of writing compelling information that sparks much interest.
https://millikenconstructioninc.com/
https://millikenconstructioninc.com/


Автор: Гость (не зарегистрирован), дата: 21 декабря, 2020 - 17:25
#permalink

You are a very persuasive writer. I can see this in your article. You have a way of writing compelling information that sparks much interest.
https://findcosmeticsurgeons.net/
https://findcosmeticsurgeons.net/


Автор: Гость (не зарегистрирован), дата: 21 декабря, 2020 - 18:52
#permalink

I high appreciate this post. It’s hard to find the good from the bad sometimes, but I think you’ve nailed it!
https://safetytechnology.com
https://safetytechnology.com


Автор: Гость (не зарегистрирован), дата: 21 декабря, 2020 - 18:53
#permalink

I loved your post so much I became a fan of you, promise that you will continue to share such good and knowledgeable posts even further, we will be waiting for your post thank you.
https://bestpestcontrolservices.com.au
https://bestpestcontrolservices.com.au


Автор: Гость (не зарегистрирован), дата: 22 декабря, 2020 - 18:46
#permalink

It is wonderful to be here with everyone, I have a lot of knowledge from what you share, to say thank you, the information and knowledge here helps me a lot
https://bankncard.com/
https://bankncard.com/


Автор: Гость (не зарегистрирован), дата: 22 декабря, 2020 - 19:12
#permalink

Thank you so much for sharing this great blog.Very inspiring and helpful too.Hope you continue to share more of your ideas.I will definitely love to read.
https://bargainistafashionista.com/
https://bargainistafashionista.com/


Автор: Гость (не зарегистрирован), дата: 22 декабря, 2020 - 19:24
#permalink

Your information was very useful to me. That's exactly what I've been looking for
https://howtolose10poundsinaweek.com/
https://howtolose10poundsinaweek.com/


Автор: Гость (не зарегистрирован), дата: 22 декабря, 2020 - 19:42
#permalink

This is very educational content and written well for a change. It's nice to see that some people still understand how to write a quality post.!
https://tecsprint.com/
https://tecsprint.com/


Автор: Гость (не зарегистрирован), дата: 22 декабря, 2020 - 19:56
#permalink

Excellent article. Very interesting to read. I really love to read such a nice article. Thanks! keep rocking.
https://premiereretail.com/
https://premiereretail.com/


Автор: Гость (не зарегистрирован), дата: 22 декабря, 2020 - 23:50
#permalink

The post is written in very a good manner and it contains many useful information for me.
https://happygamer.com/
https://happygamer.com/


Автор: Гость (не зарегистрирован), дата: 24 декабря, 2020 - 21:08
#permalink

Now with coronavirus is really interesting to read things liek this on the internet when you stay at home
https://closetsphoenix.com/
https://closetsphoenix.com/


Автор: Гость (не зарегистрирован), дата: 24 декабря, 2020 - 22:01
#permalink

Wow very good post, please dont stop posting things like this because ie really enjoy this
https://caboplatinum.com/
https://caboplatinum.com/


Автор: Гость (не зарегистрирован), дата: 25 декабря, 2020 - 15:05
#permalink

Thank you so much for sharing this great blog.Very inspiring and helpful too.Hope you continue to share more of your ideas.I will definitely love to read.
https://zacjohnson.com/
https://zacjohnson.com/


Автор: Гость (не зарегистрирован), дата: 25 декабря, 2020 - 15:27
#permalink

Excellent article. Very interesting to read. I really love to read such a nice article. Thanks! keep rocking.
https://blogreign.com/
https://blogreign.com/


Автор: Гость (не зарегистрирован), дата: 25 декабря, 2020 - 17:39
#permalink

The post is written in very a good manner and it contains many useful information for me.
https://blogging.org/
https:https://blogging.org/


Автор: Гость (не зарегистрирован), дата: 25 декабря, 2020 - 17:47
#permalink

Very inspiring and helpful
https://blogninja.com/
https://blogninja.com/


Автор: Гость (не зарегистрирован), дата: 25 декабря, 2020 - 18:23
#permalink

This is very educational content and written well for a change. It's nice to see that some people still understand how to write a quality post.!
https://phoenixseogeek.com/
https://phoenixseogeek.com/


Автор: Гость (не зарегистрирован), дата: 26 декабря, 2020 - 15:34
#permalink

Thank you for such a well written article. It’s full of insightful information and entertaining descriptions. Your point of view is the best among many.
https://extremevaporizers.com/
https://extremevaporizers.com/


Автор: Гость (не зарегистрирован), дата: 26 декабря, 2020 - 15:56
#permalink

this is really nice to read..informative post is very good to read..thanks a lot!
https://usemybee.com/
https://usemybee.com/


Автор: osama shk (не зарегистрирован), дата: 28 декабря, 2020 - 11:27
#permalink

Thank you for another great article. Where else could anyone get that kind of information in such a perfect way of writing? I have a presentation next week, and I am on the look for such information.
go here


Автор: Гость (не зарегистрирован), дата: 28 декабря, 2020 - 15:45
#permalink

Now with coronavirus is really interesting to read things liek this on the internet when you stay at home
https://spacnetwork.com/
https://spacnetwork.com/


Автор: Гость (не зарегистрирован), дата: 1 января, 2021 - 22:45
#permalink

As a self-proclaimed movie buff, I am just going to say that I love movies no matter what but when it comes to this specific movie, I really am having a hard time loving it. I mean the acting, the plot, and the entire movie as a whole is downright awful. I mean, I would not even have my worst enemy watch this flick ever. I don’t even know where to begin when reviewing this movie because it is just bad. Even if you bundle this with a download リンク for that new roblox pc, I still would not recommend this to the public.


Автор: Гость (не зарегистрирован), дата: 2 января, 2021 - 13:33
#permalink

This new high-powered laser pointer is going to be very useful for my presentations. This way, I don’t have to go to the other side of the board to point out a topic or a line on the slide that is worthy to be noted by the students. This is going to ease all of my presentations for the rest of the semester and I don’t have to keep walking back and forth across the classroom just to point out a single line or topic on the slides. Also, this new game more like this is way better after you play new horror game because the contrast is so jarring that anything after that game is so much better.


Автор: osama shk (не зарегистрирован), дата: 6 января, 2021 - 15:48
#permalink

Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..
binary options brokers


Автор: osama shk (не зарегистрирован), дата: 7 января, 2021 - 17:21
#permalink

I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
covid quintana roo


Автор: Гость (не зарегистрирован), дата: 7 января, 2021 - 17:41
#permalink

Very interesting discussion glad that I came across such informative post. Keep up the good work friend
https://pestcontrolcanberraarea.com.au
https://pestcontrolcanberraarea.com.au


Автор: Гость (не зарегистрирован), дата: 12 января, 2021 - 22:20
#permalink

I do not know what to say really what you share very well and useful to the community, I feel that it makes our community much more developed
https:https://emergencydental247.com/ https://emergencydental247.com/o/


Автор: Гость (не зарегистрирован), дата: 12 января, 2021 - 22:21
#permalink

It’s hard to find the good from the bad sometimes, but I think you’ve nailed it!
audigitalsolutions.com
audigitalsolutions.com


Автор: Гость (не зарегистрирован), дата: 12 января, 2021 - 22:25
#permalink

Great website and the content you shared is very informational and useful.
https://microjobs24.de https://microjobs24.de


Автор: osama shk (не зарегистрирован), дата: 13 января, 2021 - 14:31
#permalink

Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic.
digital marketing


Автор: osama shk (не зарегистрирован), дата: 19 января, 2021 - 11:25
#permalink

Very nice article, I enjoyed reading your post, very nice share, I want to twit this to my followers. Thanks!.
Canon DSLR Camera LUT


Автор: Гость (не зарегистрирован), дата: 22 января, 2021 - 19:42
#permalink

It is wonderful to be here with everyone, I have a lot of knowledge from what you share, to say thank you, the information and https://audigitalsolutions.com/
https://audigitalsolutions.com/


Автор: Гость (не зарегистрирован), дата: 27 января, 2021 - 12:36
#permalink

Now with coronavirus is really interesting to read things liek this on the internet when you stay at home
https://plasticpalletsales.com
https://plasticpalletsales.com


Автор: Гость (не зарегистрирован), дата: 27 января, 2021 - 17:25
#permalink

I have bookmarked your blog, the articles are way better than other similar blogs.. thanks for a great blog!
https://megabonuscasino.nl/
https://megabonuscasino.nl/


Автор: Гость (не зарегистрирован), дата: 28 января, 2021 - 15:31
#permalink

Excellent article. Very interesting to read. I really love to read such a nice article. Thanks! keep rocking.
https://entutorado.com/
https://entutorado.com/


Автор: shemale graz (не зарегистрирован), дата: 29 января, 2021 - 17:46
#permalink

Free sexy chat with hot young local shemales - shemale graz! Visit right now!


Автор: osama shk (не зарегистрирован), дата: 1 февраля, 2021 - 16:50
#permalink

Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..
tulum ruins


Автор: osama shk (не зарегистрирован), дата: 3 февраля, 2021 - 12:01
#permalink

I know your expertise on this. I must say we should have an online discussion on this. Writing only comments will close the discussion straight away! And will restrict the benefits from this information.
schlüsseldienst in köln


Автор: osama shk (не зарегистрирован), дата: 4 февраля, 2021 - 17:47
#permalink

I know your expertise on this. I must say we should have an online discussion on this. Writing only comments will close the discussion straight away! And will restrict the benefits from this information.
ساختمان هوشمند


Автор: hausfrau sex basel (не зарегистрирован), дата: 4 февраля, 2021 - 18:00
#permalink

check out the most amazing ladies on hausfrau sex basel and enjoy hot chat


Автор: Гость (не зарегистрирован), дата: 10 февраля, 2021 - 14:31
#permalink

Hey there, You have done a fantastic job. I will definitely digg it and personally recommend to my friends. I am confident they'll be benefited from this website.
https://atlanticflagpole.com
https://atlanticflagpole.com


Автор: Гость (не зарегистрирован), дата: 12 февраля, 2021 - 19:24
#permalink

I appreciate, lead to I found just what I used to be taking a look for. You've ended my four day lengthy hunt! God Bless you man. Have a nice day. Bye
https://gold4vanilla.com/
https://gold4vanilla.com/


Автор: osama shk (не зарегистрирован), дата: 13 февраля, 2021 - 18:28
#permalink

Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic.
cozumel


Автор: Гость (не зарегистрирован), дата: 18 февраля, 2021 - 13:04
#permalink

It is appropriate time to make a few plans for the future and it's time to be happy. I've learn this publish and if I may just I want to counsel you some attention-grabbing things or tips. Maybe you could write subsequent articles regarding this article. I wish to learn even more issues approximately it!
https://schmidtchristmasmarket.com/
https://schmidtchristmasmarket.com/


Автор: osama shk (не зарегистрирован), дата: 18 февраля, 2021 - 13:16
#permalink

I know your expertise on this. I must say we should have an online discussion on this. Writing only comments will close the discussion straight away! And will restrict the benefits from this information.
teljes körű pályázatírás Debrecen


Автор: Гостьsad (не зарегистрирован), дата: 21 февраля, 2021 - 19:10
#permalink

this is really nice to read..informative post is very good to read..thanks a lot!
cheap smm panel


Автор: Гость (не зарегистрирован), дата: 23 февраля, 2021 - 13:43
#permalink

Attractive component of content. I just stumbled upon your weblog and in accession capital to say that I acquire actually enjoyed account your weblog posts. Any way I will be subscribing in your feeds or even I achievement you get admission to consistently fast.
https://whispersandhoney.com/
https://whispersandhoney.com/


Автор: osama shk (не зарегистрирован), дата: 24 февраля, 2021 - 14:36
#permalink

This is just the information I am finding everywhere. Thanks for your blog, I just subscribe your blog. This is a nice blog..
rumah pintar


Автор: 먹튀검증 (не зарегистрирован), дата: 1 марта, 2021 - 09:39
#permalink

The assignment submission period was over and I was nervous, 먹튀검증 and I am very happy to see your post just in time and it was a great help. Thank you ! Leave your blog address below. Please visit me anytime.


Автор: osama shk (не зарегистрирован), дата: 2 марта, 2021 - 15:54
#permalink

Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic.
mobilház szállítás ajánlat


Автор: Гость (не зарегистрирован), дата: 3 марта, 2021 - 12:24
#permalink

Hi I am so delighted I found your webpage, I really found you by mistake, while I was browsing on Bing for something else, Anyhow I am here now and would just like to say many thanks for a remarkable post and a all round enjoyable blog (I also love the theme/design), I don’t have time to go through it all at the minute but I have bookmarked it and also included your RSS feeds, so when I have time I will be back to read much more, Please do keep up the excellent work.
https://eureka-examens.nl/
https://eureka-examens.nl/


Автор: Гость (не зарегистрирован), дата: 3 марта, 2021 - 12:36
#permalink

Hello, i believe that i noticed you visited my weblog so i came to return the favor?.I'm attempting to in finding issues to improve my web site!I suppose its adequate to make use of some of your ideas!!
https://cbtresultaatuitopleiden.nl/
https://cbtresultaatuitopleiden.nl/


Автор: kim chiimg (не зарегистрирован), дата: 9 марта, 2021 - 11:41
#permalink

Thanks for the very helpful post, I really liked it
resize image


Автор: osama shk (не зарегистрирован), дата: 4 апреля, 2021 - 17:55
#permalink

I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
unique bathroom vanity


Автор: osama shk (не зарегистрирован), дата: 13 апреля, 2021 - 11:35
#permalink

All the contents you mentioned in post is too good and can be very useful. I will keep it in mind, thanks for sharing the information keep updating, looking forward for more posts.Thanks
covid cozumel


Автор: osama shk (не зарегистрирован), дата: 16 апреля, 2021 - 13:29
#permalink

This article gives the light in which we can observe the reality. This is very nice one and gives in depth information. Thanks for this nice article.
Hualien covid


Автор: Гость온라인홀덤 (не зарегистрирован), дата: 18 апреля, 2021 - 09:53
#permalink

In the meantime, I wondered why I couldn't think of the answer to this simple problem like this. Your article is an article that gives the answer to all the content I've been contemplating. 온라인홀덤


Автор: 토토사이트 (не зарегистрирован), дата: 5 мая, 2021 - 12:37
#permalink

I’m thinking some of my readers might find a bit of this interesting. Do you mind if I post a clip from this and link back? Thanks 토토사이트


Автор: kitty durgans (не зарегистрирован), дата: 7 мая, 2021 - 04:58
#permalink

I really love to read such a nice article. Thanks! keep rocking. cookie clicker slope unblocked


Автор: Sexcams Onlinesex (не зарегистрирован), дата: 14 мая, 2021 - 18:00
#permalink

If you are looking for cam contacts in EU check out the best web platform right now Sexcams Onlinesex


Автор: 토토사이트 (не зарегистрирован), дата: 24 мая, 2021 - 05:36
#permalink

Excellent read, I just passed this onto a friend who was doing a little research on that. And he actually bought me lunch as I found it for him smile Therefore let me rephrase that: Thank you for lunch. 토토사이트


Автор: sluts south england (не зарегистрирован), дата: 29 июня, 2021 - 16:19
#permalink

sluts south england is the most popular web place for free sexy chat with local ladies in UK


Автор: Agnes Stokes (не зарегистрирован), дата: 27 июля, 2021 - 15:37
#permalink

Thank you for sharing you can cinema hd app download here to watch the best and latest movies in theaters


Автор: 사설토토사이트 (не зарегистрирован), дата: 3 августа, 2021 - 06:38
#permalink

I'm glad I found this web site, I couldn't find any knowledge on this matter prior to.Also operate a site and if you are ever interested in doing some visitor writing for me if possible feel free to let me know, im always look for people to check out my web site 사설토토사이트


Автор: 안전사이트 (не зарегистрирован), дата: 23 августа, 2021 - 10:38
#permalink

Good day! This post could not be written any better! Reading this post reminds me of my previous room mate! He always kept chatting about this. I will forward this page to him. Pretty sure he will have a good read. Thanks for sharing. 안전사이트


Автор: Гостьasa (не зарегистрирован), дата: 30 августа, 2021 - 12:15
#permalink

Nice to be visiting your blog again, it has been months for me. Well this article that i've been waited for so long. I need this article to complete my assignment in the college, and it has same topic with your article. Thanks, great share.
롤듀오


Автор: farhan (не зарегистрирован), дата: 31 августа, 2021 - 21:12
#permalink

I am definitely enjoying your website. You definitely have some great insight and great stories.

구글상위노출


Автор: fave fave (не зарегистрирован), дата: 2 сентября, 2021 - 19:21
#permalink

Nice blog and absolutely outstanding. You can do something much better but i still say this perfect.Keep trying for the best.
서버모아


Автор: 안전놀이터모음 (не зарегистрирован), дата: 8 сентября, 2021 - 07:32
#permalink

What a nice post! I'm so happy to read this. 안전놀이터모음 What you wrote was very helpful to me. Thank you. Actually, I run a site similar to you. If you have time, could you visit my site? Please leave your comments after reading what I wrote. If you do so, I will actively reflect your opinion. I think it will be a great help to run my site. Have a good day.


Автор: jogazy jogazy (не зарегистрирован), дата: 14 сентября, 2021 - 17:23
#permalink

I recently came across your blog and have been reading along. I thought I would leave my first comment. I don't know what to say except that I have enjoyed reading. Nice blog. I will keep visiting this blog very often.
유흥사이트


Автор: Гостьsd (не зарегистрирован), дата: 30 сентября, 2021 - 20:07
#permalink

Thanks for your insight for your fantastic posting. I’m glad I have taken the time to see this.
롤강의


Автор: Гость (не зарегистрирован), дата: 5 октября, 2021 - 13:19
#permalink

Merely a smiling visitant here to share the love (:, btw outstanding style.
레플리카


Автор: Гостьsd (не зарегистрирован), дата: 7 октября, 2021 - 15:48
#permalink

Interesting post. I Have Been wondering about this issue, so thanks for posting. Pretty cool post.It 's really very nice and Useful post.Thanks
레플리카사이트


Автор: john bond (не зарегистрирован), дата: 11 октября, 2021 - 17:03
#permalink

You have done a great job on this article. It’s very readable and highly intelligent. You have even managed to make it understandable and easy to read. You have some real writing talent. Thank you.
출장마사지


Автор: 먹튀검증 (не зарегистрирован), дата: 16 октября, 2021 - 13:02
#permalink

Your ideas have inspired me a lot. I want to learn your writing skills. There is also a website. Please visit us and leave your comments. Thank you. 먹튀검증


Автор: Гость (не зарегистрирован), дата: 20 октября, 2021 - 22:28
#permalink

This type of message always inspiring and I prefer to read quality content, so happy to find good place to many here in the post, the writing is just great, thanks for the post.
leilao imoveis


Автор: Гость (не зарегистрирован), дата: 21 октября, 2021 - 04:34
#permalink

thanks for sharing visit:


Автор: Гость (не зарегистрирован), дата: 23 октября, 2021 - 16:50
#permalink

I am unable to read articles online very often, but I’m glad I did today. This is very well written and your points are well-expressed. Please, don’t ever stop writing.
강남오피


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
1 + 1 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum