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 .
Существует два варианта обхода проблемы:
- Возвращать функцию, использованную для назначения обработчика:
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)
-
Можно не использовать
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-функций будет столь же полезен вам, сколь он полезен мне.
|
в JS нет худших и лучших функций, все нужны и полезны в конкретных ситуациях
Я бы еще добавил динамическую подгрузку JavaScript файлов, например этот метод: http://www.artlebedev.ru/tools/technogrette/js/include/
или метод который используется в Scriptalicous
Не нашел куда написать, поэтому пишу сюда. Я написал самое компактное определение IE из всех которые я знаю. Думаю пригодится:
можно и в 5 символов, но будет возвращаться false в эксплорере
Используется баг с подсчетом элементов массива.
Подробнее здесь: линк
Статью переписал. Как следствие, многие комментарии перестали относиться к переписанному варианту и были убраны.
По виду, получилось более актуально чем было...
Функции setCookie и getCookie работают в FireFox, но не работают в Chrome:
В чём тут дело? Либо можно пример вызова, который точно работает?
Дело в том, что 3й аргумент - props - объект. Если не хотите его указывать - не надо ставить "".
Так тоже не работает. У вас установлен Хром? Ну, попробуйте создать пустую страничку с одним этим скриптом. Выдаст undefined. A FireFox - "TestText1".
Да, установлен. Попробуйте сами - вот страничка http://javascript.ru/test.html . Все работает.
Но я же не могу свои странички к вам на сервер закачивать. Я запускаю со своего винчестера. И не работает.
Закачайте их к себе на сервер и запустите. Дело, видимо, как раз в том, что вы с винчестера запускаете, а надо - с сайта.
А у меня сейчас нету сервера. Да и неудобно это. Вот на винчестере страничка, я её правлю, и сразу проверяю в браузере, никуда не закачивая.
Да и в FireFox'e то работает нормально. Может что-то не учтено, надо в скрипт ещё какую-то строчку кода для Хрома добавить?
Насколько я знаю, кука ставиться для УРЛа (Домена).
Если вы открываете страничку с винта, то где там имя домена?
Возможно Хром понимает бесполезность такого действия и ничего не предпринимает.
Насчет сервера: почему это неудобно? Неужели трудно поставить Денвер или какой-нибудь его аналог и работать в нормальных условиях, приближенных к реальным?
localhost )
В хроме, начиная с 5й версии локально многие вещи не работают.
Например "ajax" и cookie.
Чтобы это работало "с винчестера" нужно запускать chrome.exe с ключами (можно дописать в свойства ярлыка):
--allow-file-access-from-files --enable-file-cookies
у хрома (по крайней мере на начальных этапах его становления и развития) наблюдается проблема с работой кук. долго бился, пока не понял это =( куки ни одним обычным методом не удалялись: и пустоту в них писал, и нулл, и время в прошлое... просто голову сломал.
Объясните пожалуйста, зачем в функции getElementsByClass():
a) нужна переменная key
b) нужны границы слова в
а) убрал, она лишняя была
б) границы нужны, чтобы корректно обрабатывать элемент со множеством классов:
Без указания границ слова всё обрабатывается корректно. По крайней мере я не смог создать такую ситуацию, когда отсутствие границ слова вызвало бы ошибку. Проверял с разными классами, с разным количеством пробелов, в разных браузерах. Не могли бы вы привести пример когда без границ слова, будет выводиться что-то неправильное?
Всё. Дошло. На самом деле "\\b" нужно не для того чтобы обрабатывать элементы с несколькими классами. А для таких случаев, если у меня есть один элемент с "class1" и другой элемент с "class11111". Без "\\b" по запросу "class1" будут найдены оба элемента.
Пожалуйста верните комментарий, в котором приведены аналоги на JQuery.
Он был очень полезным.
Нашел красивейшую функцию по замене inArray:
Источник
Да действительно орининальное решение - но бесполезное - слишком много итераций. Это при больших массивах очень долго, особенно если искомое значение (по "закону полдлости") будет вначале масива.
Еще недостаток она не универсальна - с объектами работать не будет
("...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;
};
Функция insertAfter не будет работать, если попытаться вставить ноду после последнего элемента в узле, т.к. его nextSibling == null. Вот рабочий вариант:
Можно обойтись и без дополнительной переменной next, но так наглядней...
Ваш пример нужно дорабатывать, т.к. nextsibling может указывать на текстовый элемент.
Ну и соответственно
RomanWeberov, с какой такой стати текстовые элементы не должны учитываться? Функция insertAfter() должна вставлять элемент строго после указанного и никак иначе.
Вы проверяли, что не будет работать?
Относительно текстового элемента - он тоже элемент..
Да, надо было проверить:(
Теперь буду знать:)
Но в любом случае, функцию можно упростить, убрав из списка аргументов parent'а.
Отличная подборка сценариев Обожаю ваш блог и ваш труд
Илья, мне кажется пример с getElementsByClassName() может ввести в заблуждение новичков, потому как этот метод по спецификации принимает один аргумент, а у тебя в примере использования их несколько причем еще и ID. Для этого есть querySelector(), querySelectorAll();
К тому же код можно упростить, сделать более универсальным, а также значительно увеличить производительность:
PS: добавление querySelectorAll() дает нам возможность работать с IE8+, а обратный цикл уменьшает время выполнения функции в несколько раз
Отличный вариант, спасибо.
Нельзя использовать в регулярках \bneedle\b, так как christmas-tree-needle это один класс.
В FireFox 11 подсветка не работает.
Функция getElementsByClass() работает неверно в IE при поиске узлов с несколькими классами.
В FF и Opera будет выделен второй абзац, т.к. используется встроенная функция, а IE выделит оба.
8) getElementsByClass()
Все таки не представлен настоящии универсальный метод:(
По моему самый лучшии вариант от monolithed
НО он загружает только 1 класс
Как правильно сделать полный обход?
var classl=getElementsByClass('class1').length;
for (var i=0; i<classl; i++) {
getElementsByClass('class1')[i].style.color='red';
};// пока только так придумал.. подскажите плиз
Я для себя написал вот такой inArray, он работает и для многомерных массивов
Точнее так
Ошибка в inArray(), строка 8. вместо a[] надо arr[]
GET
CLASS
Как по мне, так такой вариант выборки классов будет побыстрее:
мой вариант функции inArray
без цикла, и символов меньше
А не легче использовать такой код:
Или я чего-то не понимаю?
Например, того, что некоторые недобраузеры функции querySelectorAll не понимают.
8) getElementsByClass()
Вариант:
Подскажите, пожалуйста setCookie(name, value, props)
как у эту функцию установить время или дату.
я так понимаю что она сидит в props
как задать в него параметры
подскожите пож. как из .csv где есть много строк, наити самыю длиныю строку и выведить её ,при етом показати сколько букв содержит строка и какой ряд?
Предлагаю свой вариант работы с классами:
Немного сжато, рабочий вариант.
Применен шаблон самоопределяемых функций.
Функции обертки нужны, чтобы иметь возможность правильно импортировать функции из области видимости.
Преимущества: определение пути выполнения осуществляется только один раз, при первом вызове функции, при этом используются возможности HTML5. Нормальные браузеры будут работать еще быстрее (чем в JQuery, но не проверял), не нормальные - на том же уровне.
Немного переживаю за излишнее замыкание, но пошел на наго из-за компактности.
Еще пара функций:
Добрый день.
Не могу разобраться с клонированием картинок при перетаскивании. Можете направить где копать?
addClass
Какая-то стрёмная замена classList.add()
function insertAfter(parent, node, referenceNode) {
parent.insertBefore(node, referenceNode.nextSibling);
}
И где тут проверка, что это не младший сын?
Эти приемы слишком не соответствуют сути прототипно-ориентированного языка.
Почему бы не myObject.addEvent?
как де queryString?
Где демонстрация работы с динамическими элементами?
Да, порой фреймворк использовать не получается (покажите мне такой, в ЛС), но это плохой подход.
ПС: Кину свою мини-библиотеку нужнрых мне порой функций.
ПС2: Пользуйтесь jQ, Angular, polymer и все будет в порядке.
onReady() дала течь. Вернулся к windows.onload
А jQuery использовать мешает высокомерие - мы же крутые JS-разработчики а не х.пойми что )))
K;/K//LK/L
Функции полезные, но можно использовать jQuery и разрабатывать на Javascript еще быстрее и эффективнее.
Поэтому, без лишних вступлений, вот список из десяти, по моему мнению, величайших пользовательских функций на JavaScript, которые используются в настоящее время.
bullet force game online.
it's been so long since I last read such a favorable article... clash royale
Nice
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
Some truly wonderful work on behalf of the owner of this internet site , perfectly great articles .
high blood pressure
Great article. It helps a lot for my work. Thanks for sharing the effective and helpful ways.
mapquest directions
This is a great thing, I think everyone feels this information is very valuable, thank you happy wheels
Useless
Wow the blog you give us is amazing, no wonder many people want to read this. https://celebrityinsider.org/
I will recomend this blog to all of my friends. Great article.
https://happygamer.com/
Thank you for this inspiring blog. I wait for more
https://ballstepded.com/
I learned so much from this blog. Good inforamtion. https://fixoserror.com/
I wait for more.Great article.
https://premiereretail.com
I stumbled across this blog.Great article. https://tecsprint.com
Thank you for this amazing blog. Congratulations.
https://howtolose10poundsinaweek.com
The things i see here are very informative. Keep going. https://bargainistafashionista.com
I can say that is one of the best articles out on the internet. https://bankncard.com
I readed all the article. So informative https://vhan.net
This is one of the best sites i have found on the internet until now. Nice article keep going.
https://millikenconstructioninc.com/
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/
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
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/
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/
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/
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/
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/
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/
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/
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/
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/
Some genuinely interesting information, well written and broadly user pleasant 먹튀검증
I saw two other comparable posts although yours was the most beneficial so a lot 대출
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 안전놀이터?
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 메이저놀이터!!
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 토토커뮤니티사이트!
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!!
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//
Wow very good post, please dont stop posting things like this because ie really enjoy this
https://hrma-llc.com/
https://hrma-llc.com/
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/
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//
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/
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/
I have a bookmark you look at your new things.
I have a bookmark you look at your new things.
I have a bookmark you look at your new things.
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/
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/
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/
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/
Wow very good post, please dont stop posting things like this because ie really enjoy this
https://vvhen.to/
https://vvhen.to/
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/
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/
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
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
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/
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/
Your information was very useful to me. That's exactly what I've been looking for
https://howtolose10poundsinaweek.com/
https://howtolose10poundsinaweek.com/
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/
Excellent article. Very interesting to read. I really love to read such a nice article. Thanks! keep rocking.
https://premiereretail.com/
https://premiereretail.com/
The post is written in very a good manner and it contains many useful information for me.
https://happygamer.com/
https://happygamer.com/
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/
Wow very good post, please dont stop posting things like this because ie really enjoy this
https://caboplatinum.com/
https://caboplatinum.com/
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/
Excellent article. Very interesting to read. I really love to read such a nice article. Thanks! keep rocking.
https://blogreign.com/
https://blogreign.com/
The post is written in very a good manner and it contains many useful information for me.
https://blogging.org/
https:https://blogging.org/
Very inspiring and helpful
https://blogninja.com/
https://blogninja.com/
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/
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/
this is really nice to read..informative post is very good to read..thanks a lot!
https://usemybee.com/
https://usemybee.com/
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
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/
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.
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.
Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..
binary options brokers
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
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
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/
It’s hard to find the good from the bad sometimes, but I think you’ve nailed it!
audigitalsolutions.com
audigitalsolutions.com
Great website and the content you shared is very informational and useful.
https://microjobs24.de https://microjobs24.de
Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic.
digital marketing
Very nice article, I enjoyed reading your post, very nice share, I want to twit this to my followers. Thanks!.
Canon DSLR Camera LUT
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/
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
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/
Excellent article. Very interesting to read. I really love to read such a nice article. Thanks! keep rocking.
https://entutorado.com/
https://entutorado.com/
Free sexy chat with hot young local shemales - shemale graz! Visit right now!
Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..
tulum ruins
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
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.
ساختمان هوشمند
check out the most amazing ladies on hausfrau sex basel and enjoy hot chat
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
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/
Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic.
cozumel
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/
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
this is really nice to read..informative post is very good to read..thanks a lot!
cheap smm panel
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/
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
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.
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
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/
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/
Thanks for the very helpful post, I really liked it
resize image
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
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
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
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. 온라인홀덤
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 토토사이트
I really love to read such a nice article. Thanks! keep rocking. cookie clicker slope unblocked
If you are looking for cam contacts in EU check out the best web platform right now Sexcams Onlinesex
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 is the most popular web place for free sexy chat with local ladies in UK
Thank you for sharing you can cinema hd app download here to watch the best and latest movies in theaters
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 사설토토사이트
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. 안전사이트
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.
롤듀오
I am definitely enjoying your website. You definitely have some great insight and great stories.
구글상위노출
Nice blog and absolutely outstanding. You can do something much better but i still say this perfect.Keep trying for the best.
서버모아
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.
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.
유흥사이트
Thanks for your insight for your fantastic posting. I’m glad I have taken the time to see this.
롤강의
Merely a smiling visitant here to share the love (:, btw outstanding style.
레플리카
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
레플리카사이트
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.
출장마사지
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. 먹튀검증
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
thanks for sharing visit:
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.
강남오피
I just couldn't leave your website before telling you that I truly enjoyed the top quality info you present to your visitors? Will be back again frequently to check up on new posts.
custom laptop brands
I found a web page that contains the photos and videos you want. Hyperlink 토토사이트
winterthur sex is the best web platform for casual contacts with young ladies in EU check out and enjoy
Impressive web site, Distinguished feedback that I can tackle. I am moving forward and may apply to my current job as a pet sitter, which is very enjoyable, but I need to additional expand. Regards.
세스코 가정집 비용
here is best love status collection
This is a great idea, it will definitely be shared widely, thanks for sharing it with us moto x3m
I’ve been searching for some decent stuff on the subject and haven't had any luck up until this point, You just got a new biggest fan!..
email marketing companies
it was a wonderful chance to visit this kind of site and I am happy to know. thank you so much for giving us a chance to have this opportunity..
butik masaj
Its a great pleasure reading your post.Its full of information I am looking for and I love to post a comment that "The content of your post is awesome" Great work.
류현진 경기중계
Great content material and great layout. Your website deserves all of the positive feedback it’s been getting.
오피스타
I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.
คำคม
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 먹튀검증
I really loved reading your blog. It was very well authored and easy to undertand. Unlike additional blogs I have read which are really not tht good. I also found your posts very interesting. In fact after reading, I had to go show it to my friend and he ejoyed it as well!
Arborist
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.
zinc citrate
These are some great tools that i definitely use for SEO work. This is a great list to use in the future..
banklast
I'm writing on this topic these days, 우리카지노, but I have stopped writing because there is no reference material. Then I accidentally found your article. I can refer to a variety of materials, so I think the work I was preparing will work! Thank you for your efforts.
Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..
부달
You made such an interesting piece to read, giving every subject enlightenment for us to gain knowledge. Thanks for sharing the such information with us to read this. 토토사이트
If you are going for best contents like I do, simply go to see this website all the time as it provides feature contents, thanks 먹튀검증사이트추천
I ll recommend it whenever good comments come up. I ll let people know. I hope you can enjoy this blog. 토토사이트
I think your site is very good. I m growing up by looking at the articles on the site here. Succeed. 먹튀검증
You are sharing interesting articles. It will be of great help to me, my friends and relatives. Thanks for sharing it. drift huntwers
Thanks for your post. The article is neatly organized with the information I want, so there are many things to refer to. Bookmark this site and visit often in the future. Thanks again.^^ keonhacai
What do you think is the best bet? I know some really useful information토토
A very meaningful event, I hope everything will go well run 3
Спасибо за информацию, которой вы делитесь, скачайте бесплатные рингтоны со многими популярными рингтонами прямо сейчас klingeltöne kostenlos
You ought to be a part of a contest for just one of the finest blogs on the web. I am going to suggest this site. 바카라커뮤니티 I hope you can read my post and let me know what to modify. My writing is in I would like you to visit my blog.
I really loved reading your blog. It was very well authored and easy to understand. Unlike other blogs I have read which are really not that good.Thanks alot!
신용카드현금화
Positive site, where did u come up with the information on this posting?I have read a few of the articles on your website now, and I really like your style. Thanks a million and please keep up the effective work. 메이저사이트
Great content material and great layout. Your website deserves all of the positive feedback it’s been getting.
playa del carmen cenotes
Great content material and great layout. Your website deserves all of the positive feedback it’s been getting.
vacationing in tulummexico
site820
I adore this article for its well-researched content and great wording 1v1 battle
Your article has answered the question I was wondering about! I would like to write a thesis on this subject, but I would like you to give your opinion once 토토검증
My curiosity was solved by looking at your writing. Your writing was helpful to me. 룰렛사이트 I want to help you too.
(комментарий удалён)
(комментарий удалён)
Roksa dobczyce
Roksa kurwy
Karmiąca roksa
this is gewar
Lindsey
this is great
Lillian
Regards for helping out, great info . poka88
Professional wedding DJ Services in the Philadelphia area. We provide a personalized music curation experience that makes your wedding unique and unforgettable. Let us turn your dream into reality with our top notch entertainment services. Philadelphia Wedding DJ
Unbelievable!! The problem I was thinking about was solved. 카지노사이트 You are really awesome.
I always think about what is. It seems to be a perfect article that seems to blow away such worries. 마하캔디 seems to be the best way to show something. When you have time, please write an article about what means!!
It seems like I've never seen an article of a kind like . It literally means the best thorn. It seems to be a fantastic article. It is the best among articles related to 열공캔디 . seems very easy, but it's a difficult kind of article, and it's perfect.
There is a lot of information here that can help any business get started with a successful social networking campaign
bitmain antminer s19j pro
I found this is an informative and interesting post so i think so it is very useful and knowledgeable. I would like to thank you for the efforts you have made in writing this article. If more people that write articles really concerned themselves with writing great content like you, more reader s would be interested in their writings. Thank you for caring about your content. You have a real talent for writing unique content. I like how you think and the way you express your views in this article. I am impressed by your writing style a lot. Thanks for making my experience more beautiful . I have recently started a blog, the info you provide on this site has helped me greatly. Thanks for all of your time & work.
007카지노주소
This particular is usually apparently essential and moreover outstanding truth along with for sure fair-minded and moreover admittedly useful My business is looking to find in advance designed for this specific useful stuffs… Really interesting and one of a kind post. I like such things as making more research, developing writing skills, as well as related things. These kinds of secrets help in being a specialist on this topic. This post is very helpful to my family because people like you devoted time to learning. Regularity is the key. But it is not that easy, as has been made out to be. I am not an expert like you and lots of times I feel like giving it up. Looking at a person like me, your posting is of good assistance and booster. Thank you for sharing.
먹튀검증
This is an awesome motivating article.I am practically satisfied with your great work.You put truly extremely supportive data. Keep it up. Continue blogging. Hoping to perusing your next post . I really enjoy simply reading all of your weblogs. Simply wanted to inform you that you have people like me who appreciate your work. Definitely a great post. Hats off to you! The information that you have provided is very helpful. I’m excited to uncover this page. I need to to thank you for ones time for this particularly fantastic read !! I definitely really liked every part of it and i also have you saved to fav to look at new information in your site.
토토
Nice post. I learn something tougher on distinct blogs everyday. Most commonly it is stimulating to see content off their writers and use a little there. I’d want to use some with all the content on my blog whether you don’t mind. Natually I’ll offer you a link on the web weblog. Many thanks sharing. This post is very informative on this topic. I feel strongly that love and read more on this topic. I just tripped upon your blog and wanted to say that I have really enjoyed reading your blog stations. Great post, I think website owners should acquire a lot from this web site its very user pleasant.
코인카지노
Unbelievable!! The problem I was thinking about was solved. 마하캔디 You are really awesome.
That's a great article! The neatly organized content is good to see. Can I quote a blog and write it on my blog? My blog has a variety of communities including these articles. Would you like to visit me later? 카지노사이트추천
That's a great article! The neatly organized content is good to see. Can I quote a blog and write it on my blog? My blog has a variety of communities including these articles. Would you like to visit me later? 카지노사이트추천
That's a really impressive new idea! 바카라사이트추천 It touched me a lot. I would love to hear your opinion on my site. Please come to the site I run once and leave a comment. Thank you.
While looking for articles on these topics, I came across this article on the site here. As I read your article, I felt like an expert in this field. I have several articles on these topics posted on my site. Could you please visit my homepage? 온라인카지노
When I read your article on this topic, the first thought seems profound and difficult. There is also a bulletin board for discussion of articles and photos similar to this topic on my site, but I would like to visit once when I have time to discuss this topic. 카지노게임사이트
That is a really impressive new idea! 바카라사이트추천 It touched me a lot. I would love to hear your opinion on my site. Please come to the site I run once and leave a comment. Thank you!
Hello!!! I'm happy to see some great articles on your site. Would you like to come to my site later? My site also has posts, comments and communities similar to yours. Please visit and take a look 카지노사이트
XDZGDR
Your ideas inspired me very much. 온라인바카라사이트 It's amazing. I want to learn your writing skills. In fact, I also have a website. If you are okay, please visit once and leave your opinion. Thanks
This is the perfect post. 바카라사이트 It helped me a lot. If you have time, I hope you come to my site and share your opinions. Have a nice day. ^^
That is a really impressive new idea! 바카라사이트추천 It touched me a lot. I would love to hear your opinion on my site. Please come to the site I run once and leave a comment. Thank you!
This is the perfect post.바카라사이트 It helped me a lot. If you have time, I hope you come to my site and share your opinions. Have a nice day.
Hello, I read the post well. 온라인바카라 It's a really interesting topic and it has helped me a lot. In fact, I also run a website with similar content to your posting. Please visit once