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. 온라인홀덤
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.