Javascript.RU

Грамотное javascript-дерево за 7 шагов

В этой статье описана DOM/CSS-структура дерева, которую я в свое время разработал для dojo toolkit.

Основные особенности:

  • Семантическая удобная CSS-разметка.
    Внешний вид дерева определяется исключительно CSS.
  • Скрытие/раскрытие узлов
  • Структура дерева обозначена линиями
  • Допускает многострочное HTML-содержимое в узлах
  • Оптимизация по количеству HTML-тагов
  • Легко дополняется новыми фишками

Например:

Root
  • Item 1
    • Item 1.1
      • Item 1.1.2
    • Item 1.2
  • Item 2
    title long yeah
    • Item 2.1
  • Item 3
    • Item 3.1

Основной строительный блок дерева - его узел.

Каждый узел имеет класс Node и состоит из иконки Expand, заголовка Content и контейнера для детей Container.

Визуальное представление узла:

Например, вот так выглядит разметка просто корневого узла Root, без детей:

  • Root
<ul class="Container">
  <li class="Node IsRoot ExpandOpen">
    <div class="Expand"></div>
    <div class="Content">Root</div>
  </li>
</ul>
Класс IsRoot
говорит о том, что узел является корнем дерева
Класс ExpandOpen
Обозначает, что узел раскрыт
Обратите внимание - вся используемая разметка является исключительно семантической. В данном случае CSS-класс говорит не "каким образом следует выделить элемент", а "что элемент обозначает".

А вот - внутри узла появился Container с (пока) одним потомком Item 1.

  • Root
    • Item 1
<ul class="Container">
  <li class="Node IsRoot ExpandOpen">
    <div class="Expand"></div>
    <div class="Content">Root</div>
    <ul class="Container">
      <li class="Node ExpandLeaf">
        <div class="Expand"></div>
        <div class="Content">Item 1</div>
      </li>
    </ul>
  </li>
</ul>

Семантические элементы:

Контейнер Container
В контейнере содержатся все дети, т.е 1 или больше Node. Это удобно, ведь чтобы скрыть/показать потомков - достаточно обратиться к контейнеру.

Перебрать всех детей можно, используя Container.childNodes.

Класс ExpandLeaf
Обозначает, что узел является листом дерева.

Узел-потомок уже не имеет класса IsRoot.

Для начала - немного почистим стили для UL и LI: обнулим по умолчанию заданные значения margin, padding и list-style-type.

/* контейнер просто содержит узлы.
 Узел сам будет отвечать за свой отступ */
.Container {
        padding: 0;
        margin: 0;
}

.Container li {
        list-style-type: none; /* убрать кружочки/точечки */
}

Самым базовым является стиль для собственно узла Node.
Он задает иерархическую структуру за счет свойства margin-left, которое отодвигает узел-потомок от левой стенки контейнера.

/* узел отодвинут от левой стенки контейнера на 18px
    благодаря этим отступам вложенные узлы формируют иерархию
 */
.Node {
    margin-left: 18px;
    zoom: 1; /* спецсвойство против багов IE6,7. Ставит hasLayout */
}

/* Корневой узел от родительского контейнера не отодвинут. 
   Ему же не надо демонстрировать отступом, чей он сын.
   Это правило идет после .Node, поэтому имеет более высокий приоритет 
   Так что class="Node IsRoot" дает margin-left:0
*/ 
.IsRoot {
    margin-left: 0;
}

Для того, чтобы иконка Expand находилась слева от содержания - использован принцип двухколоночной верстки.

Левая колонка с фиксированной шириной - Expand, правая колонка - Content.

/* иконка скрытого/раскрытого поддерева или листа
    сами иконки идут дальше, здесь общие свойства
 */
.Expand {
    width: 18px;
    height: 18px;
    /* принцип двухколоночной верстки. */
    /* float:left и width дива Expand + margin-left дива Content */
    float: left; 
}

/* содержание (заголовок) узла */
 .Content {
    /* чтобы не налезать на Expand */
    margin-left:18px;
    /* высота заголовка - как минимум равна Expand 
        Т.е правая колонка всегда выше или равна левой.
        Иначе нижний float будет пытаться разместиться на получившейся ступеньке
    */    
    min-height: 18px; 
}

 /* все правила после * html выполняет только IE6 */
* html .Content {
    height: 18px; /* аналог min-height для IE6 */
}

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

/* открытое поддерево */
.ExpandOpen .Expand {  
    background-image: url(/forum/img/minus.gif);  
}

/* закрытое поддерево */
.ExpandClosed .Expand {
    background-image: url(/forum/img/plus.gif);
}

/* лист */
.ExpandLeaf .Expand {
    background-image: url(/forum/img/leaf.gif);
}

Здесь очень важен порядок, в котором следуют определения.

Поддеревья вложены, из-за этого получается такая конструкция:

<li class="...Node ExpandOpen...">
  ...
  <li class="...Node ExpandClosed...">
     <div class="Expand"></div> 
     ..
  </li>
</li>

Внутренний див Expand подходит под оба CSS-правила: и под ExpandOpen .Expand и под .ExpandClosed .Expand.

Правило .ExpandClosed .Expand идет позже, поэтому имеет более высокий приоритет, и будет (правильно) показана иконка закрытого раздела.

Структурные линии обрисовывают дерево, делая иерархию более наглядной.

В некоторых javascript-деревьях они пунктирные и используют кучу лишних тагов из-за неудачно выбранной DOM/CSS-модели.

Метод построения линий, который будем использовать мы, позволяет сделать линии гладкие, растягивающиеся при изменении размера деревьев.
Впрочем, пунктир добавить тоже никто не помешает.

И все это без добавления дополнительных тагов, исключительно средствами CSS.

Наша цель - получить дерево, которое выглядит так:

Info
  • Root
    • Item 1
      Multiline test
      • Item 1.1
    • Item 2
<div>Info</div>
<ul class="Container">
  <li class="Node IsRoot IsLast ExpandOpen">
    <div class="Expand"></div>
    <div class="Content">Root</div>
    <ul class="Container">
      <li class="Node ExpandOpen">
        <div class="Expand"></div>
        <div class="Content">Item 1<br/>Multiline test</div>
        <ul class="Container">
          <li class="Node ExpandLeaf IsLast">
            <div class="Expand"></div>
            <div class="Content">Item 1.1</div>
          </li>
        </ul>
      </li>
      <li class="Node ExpandLeaf IsLast">
        <div class="Expand"></div>
        <div class="Content">Item 2</div>
      </li>
    </ul>
  </li>
</ul>

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

  1. Узел Node поддерживает вертикальную линию к своему следующему соседу
    .Node {
        margin-left: 18px;
        zoom: 1;
        /* линия слева образуется повторяющимся фоновым рисунком */
        background-image : url(/forum/img/i.gif);
        background-position : top left;
        background-repeat : repeat-y;
    }
    
  2. Если соседа ниже нет, то линию вниз продолжать не надо:
    /* это правило - ниже .Node, поэтому имеет больший приоритет */
    .IsLast {
        /* добавить соединительную черточку наверх */
        background-image: url(/forum/img/i_half.gif);
        background-repeat : no-repeat;
    }
    

Получается, что все узлы на одном уровне соединены вертикальной чертой.

Размер рисунков для фоновых черточек сделан такой, чтобы вертикальная черта проходила строго посередине иконок Expand.

Поэтому получается, что эти иконки автоматически "нанизываются" на вертикальную линию.

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

Вот такие новые иконки для Expand*-классов.

Открытый узел ExpandOpen
Закрытый узел ExpandClosed
Лист ExpandLeaf
Горизонтальные коннекторы готовы.

Вертикальные линии образуют каркас, а новые иконки Expand* присоединяют узлы к каркасу. Структурные линии построены .

Для скрытия-раскрытия добавим два CSS-правила.

.ExpandOpen .Container {
	display: block;
}

.ExpandClosed .Container {
	display: none;
}

Как всегда, важен порядок. ExpandClosed идет после ExpandOpen, поэтому имеет больший приоритет, и вложенные закрытые узлы отображаются закрытыми.

Для скрытия-раскрытия javascript-функция всего лишь меняет класс узла. Остальное делает CSS.

Чтобы в дереве поддерживалось скрытие-раскрытие - достаточно повесить обработчик на самый внешний div.

И для красоты - обязательно поправить курсор при наведении на иконки скрытия/раскрытия:

.ExpandOpen .Expand, .ExpandClosed .Expand {
	cursor: pointer; /* иконки скрытия-раскрытия */
}

.ExpandLeaf .Expand {
	cursor: auto; /* листовой узел */
}

Обязательно задать определение для листового узла тоже, иначе курсор на нем тоже станет pointer (почему? - из-за вложенности div'ов).

Root
  • Item 1
    • Item 1.1
      • Item 1.1.2
    • Item 1.2
  • Item 2
    title long yeah
    • Item 2.1
  • Item 3
    • Item 3.1
<div onclick="tree_toggle(arguments[0])">
<div>Root</div>
<ul class="Container">
  <li class="Node IsRoot ExpandClosed">
    <div class="Expand"></div>
    <div class="Content">Item 1</div>
    <ul class="Container">
      <li class="Node ExpandClosed">
        <div class="Expand"></div>
        <div class="Content">Item 1.1</div>
        <ul class="Container">
          <li class="Node ExpandLeaf IsLast">
            <div class="Expand"></div>
            <div class="Content">Item 1.1.2</div>
          </li>
        </ul>
      </li>
      <li class="Node ExpandLeaf IsLast">
        <div class="Expand"></div>
        <div class="Content">Item 1.2</div>
      </li>
    </ul>
  </li>
  <li class="Node IsRoot ExpandClosed">
    <div class="Expand"></div>
    <div class="Content">Item 2<br/>title long yeah</div>
    <ul class="Container">
      <li class="Node ExpandLeaf IsLast">
        <div class="Expand"></div>
        <div class="Content">Item 2.1</div>
      </li>
    </ul>
  </li>
  <li class="Node ExpandOpen IsRoot IsLast">
    <div class="Expand"></div>
    <div class="Content">Item 3</div>
    <ul class="Container">
      <li class="Node ExpandLeaf IsLast">
        <div class="Expand"></div>
        <div class="Content">Item 3.1</div>
      </li>
    </ul>
  </li>
</ul>

</div>

А вот и сам обработчик события onclick. После правил CSS делать ему осталось всего ничего:

  1. Определить, произошел ли клик на иконке Expand, используя event.target(или event.srcElement для IE)
  2. Получить узел Node для иконки
  3. Если узел - не лист, то поменять класс ExpandOpen <-> ExpandClosed
function tree_toggle(event) {
	event = event || window.event
	var clickedElem = event.target || event.srcElement

	if (!hasClass(clickedElem, 'Expand')) {
		return // клик не там
	}

	// Node, на который кликнули
	var node = clickedElem.parentNode
	if (hasClass(node, 'ExpandLeaf')) {
		return // клик на листе
	}

	// определить новый класс для узла
	var newClass = hasClass(node, 'ExpandOpen') ? 'ExpandClosed' : 'ExpandOpen'
	// заменить текущий класс на newClass
	// регексп находит отдельно стоящий open|close и меняет на newClass
	var re =  /(^|\s)(ExpandOpen|ExpandClosed)(\s|$)/
	node.className = node.className.replace(re, '$1'+newClass+'$3')
}


function hasClass(elem, className) {
	return new RegExp("(^|\\s)"+className+"(\\s|$)").test(elem.className)
}

Пока что мы строили дерево исключительно из HTML-разметки.

Полностью аналогично дерево работает при создании разметки при помощи Javascript. Как загружать данные с сервера в формате JSON, и многое другое Вы можете прочитать в цикле статей AJAX.

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

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

Опишем его CSS-правилом:

.ExpandLoading   {
    width: 18px;
    height: 18px;
    float: left;
    background-image: url(/forum/img/expand_loading.gif);
}

Класс ExpandLoading на время операции будет заменять обычный класс Expand.

Почему нельзя добавить класс ExpandLoading к ExpandOpen/Closed/.. ?

Индикатор может понадобиться в любом месте. Среди потомков "активного" узла могут быть "неактивные" узлы, и среди его родителей - тоже.

Если поставить класс ExpandLoading в один ряд с ExpandOpen/Closed/.., то он будет либо более приоритетен - и тогда все узлы под ним получат часики, либо менее приоритетен - тогда вообще ничего не будет видно.

И тот и другой варианты - не подходят, когда индикация нужна на одном-единственном узле посередине, например, после редактирования названия узла.

Например, так может выглядеть участок дерева с активным узлом Item 1.1:

  • Item 1
    • Item 1.1
      • Item 1.1.1
<ul class="Container">
<li class="Node IsRoot IsLast ExpandOpen">
	<div class="Expand"></div>
	<div class="Content">Item 1</div>
	<ul class="Container">
		<li class="Node ExpandOpen IsLast">
			<div class="ExpandLoading"></div>
			<div class="Content">Item 1.1</div>
			<ul class="Container">
				<li class="Node ExpandOpen">
					<div class="Expand"></div>
					<div class="Content">Item 1.1.1</div>
				</li>
			</ul>
		</li>
	</ul>
</li>
</ul>

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

Для добавления, например, чекбокса <input type="checkbox"> после иконки Expand, нужно для начала вставить его в структуру сразу после иконки открытия/закрытия.

Указываем размеры, отступ и float: left:

/* Общий размер 14+2+2 = 18 - такой же как Expand */
.Node input {
    width: 14px;
    height: 14px;
    float: left; 
    margin: 2px;
}

Теперь, сохраняя двухколоночную верстку, нужно отодвинуть Content вправо уже не на 18, а на общую ширину двух float'ов - 36px.

После того как сдвинулся заголовок Content - естественно сдвинуть и сам узел Node, чтобы структурная линия шла от заголовка.

Все это осуществляется добавлением пары правил:

/* подвинем за оба float'а Node, Content */
.Node, .Content {
	margin-left: 36px;
}
/* заново переопределим .IsRoot */
.IsRoot { margin-left: 0; }
Root
  • Item 1
    • Item 1.1
      • Item 1.1.2
    • Item 1.2
  • Item 2
    title long yeah
    • Item 2.1
  • Item 3
    • Item 3.1
<div onclick="tree_toggle(arguments[0])">
<div>Root</div>
<ul class="Container">
  <li class="Node IsRoot ExpandOpen">
    <div class="Expand"></div>
    <input type="checkbox"/>
    <div class="Content">Item 1</div>
    <ul class="Container">
      <li class="Node ExpandOpen">
        <div class="Expand"></div>
        <input type="checkbox"/>
        <div class="Content">Item 1.1 </div>
        <ul class="Container">
          <li class="Node ExpandLeaf IsLast">
            <div class="Expand"></div>
            <input type="checkbox"/>
            <div class="Content">Item 1.1.2</div>
          </li>
        </ul>
      </li>
      <li class="Node ExpandLeaf IsLast">
        <div class="Expand"></div>
        <input type="checkbox"/>
        <div class="Content">Item 1.2</div>
      </li>
    </ul>
  </li>
  <li class="Node IsRoot ExpandOpen">
    <div class="Expand"></div>
    <input type="checkbox"/>
    <div class="Content">Item 2<br/>title long yeah</div>
    <ul class="Container">
      <li class="Node ExpandLeaf IsLast">
        <div class="Expand"></div>
        <input type="checkbox"/>
        <div class="Content">Item 2.1</div>
      </li>
    </ul>
  </li>
  <li class="Node ExpandOpen IsRoot IsLast">
    <div class="Expand"></div>
    <input type="checkbox"/>
    <div class="Content">Item 3</div>
    <ul class="Container">
      <li class="Node ExpandLeaf IsLast">
        <div class="Expand"></div>
        <input type="checkbox"/>
        <div class="Content">Item 3.1</div>
      </li>
    </ul>
  </li>
</ul>
</div>

В принципе, можно использовать и CSS/JS/картинки напрямую со страницы, но они содержат некоторое количество лишних классов.

Для удобства дерево все-в-одном с JS/CSS/HTML находится на отдельной странице. В этом примере полностью расписано дерево без AJAX-индикации и чекбоксов.

Кроме того, можно скачать материалы по статье:

При использовании в своем окружении Вы, наверное, захотите удлинить все классы. добавив какой-то префикс. Например, TreeContainer, TreeNode, и т.п.

Другой вариант, возможно, более удобный - ограничить классы внешним селектором. Например, .Tree .Container, .Tree .Node, * html .Tree .Content и т.п.


Автор: ROYAL HONEY TURKEY (не зарегистрирован), дата: 11 апреля, 2024 - 14:27
#permalink

https://royalhoneyturkey.com/ # Best Male and Female Potency Enhancement online store


Автор: everex (не зарегистрирован), дата: 15 апреля, 2024 - 15:21
#permalink

Автор: oscar (не зарегистрирован), дата: 18 апреля, 2024 - 02:23
#permalink

Werther’s Original

Sprinklez Candy Apple Cannabis Strain

Köp / Beställ Ritalin online utan recept

KÖP Concerta 54 mg i Sverige till salu

KÖP adderall 20mg svenska online

Xanor till salu i Sverige utan recept

KÖP I SVERIGE prometazin actavis 25 mg

Rybelsus viktnedgång Sverige (Semaglutid)

Koop Testogel zonder recept

Köp Testogel utan recept

Sitka Gear Equinox Turkey Vest

Blackhorn 209 Powder

Diamondback db15 5.56 NATO Semi Auto Rifle FDE

Buy AR-15s

Buy Hodgdon H1000 Powder

Sig Sauer MCX Spear Semi-Automatic

CZ 527 Carbine 7.62×39 18.5 inch ba…

Sitka Gear Equinox Turkey Vest

Fantastic Funfetti

Froot Loops Ice Cream

Neapolitan Cookies

Rainbow Cookies Bubblegum

White Chocolate Strawberry

Bubblegum Gelato Strain

Orange Creamsicle Strain

Cookies & Cream Milkshake

Original Torchiez

Dulce de Leche

Kiwi Strawberry Splash

Rainbow sherbet Cotton Candy

Deep Fried Oreo Cookies

Strawberry Banana strain Pudding

Cookies Monster

M&M Cookie Bars Dough Cream

Rainbow Confetti Birthday cake

S'mores Stuffed Cookies French Toast

Red Velvet Cheesecake

Fresas Con Crema Near Me

Strawberry Frosted Flakes Milkshake

Juicy Yellow Watermelon

Mississipi Mud Pie

Gumdropz Wild Berry

Gumdropz Berry Bonanza

Gumdropz Island Punch

Gumdropz Strawberry Splash

Key Lime Marshmallow

Fruity Pebblez Marshmallow

Sprinklez Takeover

Torchiez Chili Mango

Sprinklez Pumpkin strain

Lemon Blueberry Cheesecake Bar

Werther’s Original

Torchiez Red Hotz

Grapefruit Cooler

Sprinklez Creamy Peanut Butter

Sprinklez Marshmallow Madness

Sprinklez Peach Perfection

Sprinklez Sweet Tartz

Sprinklez Cherry Lemonade

Sprinklez Candy Apple Cannabis Strain

Sprinklez Cotton Candy

Sprinklez Candy Apple Cannabis Strain

Hot Honey Butter Blondies

Twisted Caribbean

Confetti Cookies Dough Cream

Cherry Ripe Bars Marshmallow

Peach Cobbler Near Me

Brooklyn Blackout Cake

Hot Fudge Sundae Near Me

Caramel Apple Cheesecake

Hagelslag

Blackhorn 209 Powder

Diamondback db15 5.56 NATO Semi Auto Rifle FDE

Fantastic Funfetti

Froot Loops Ice Cream

Neapolitan Cookies

Rainbow Cookies Bubblegum

White Chocolate Strawberry

Bubblegum Gelato Strain

Orange Creamsicle Strain

Cookies & Cream Milkshake

Original Torchiez

Dulce de Leche

Kiwi Strawberry Splash

Rainbow sherbet Cotton Candy

Deep Fried Oreo Cookies

Strawberry Banana strain Pudding

Cookies Monster

M&M Cookie Bars Dough Cream

Rainbow Confetti Birthday cake

S'mores Stuffed Cookies French Toast

Red Velvet Cheesecake

Fresas Con Crema Near Me

Strawberry Frosted Flakes Milkshake

Juicy Yellow Watermelon

Mississipi Mud Pie

Gumdropz Wild Berry

Gumdropz Berry Bonanza

Gumdropz Island Punch

Gumdropz Strawberry Splash

Key Lime Marshmallow

Fruity Pebblez Marshmallow

Sprinklez Takeover

Torchiez Chili Mango

Sprinklez Pumpkin strain

Lemon Blueberry Cheesecake Bar

Werther’s Original

Torchiez Red Hotz

Grapefruit Cooler

Sprinklez Creamy Peanut Butter

Sprinklez Marshmallow Madness

Sprinklez Peach Perfection

Sprinklez Sweet Tartz

Sprinklez Cherry Lemonade

Sprinklez Candy Apple Cannabis Strain

Sprinklez Cotton Candy

Sprinklez Candy Apple Cannabis Strain

Hot Honey Butter Blondies

Twisted Caribbean

Confetti Cookies Dough Cream

Cherry Ripe Bars Marshmallow

Peach Cobbler Near Me

Brooklyn Blackout Cake

Hot Fudge Sundae Near Me

Caramel Apple Cheesecake

Buy AR-15s

Buy Hodgdon H1000 Powder

Oxycodon

Adderall 20mg

temazepam kopen etos

Nolvadex

tylenol kruidvat

Doxycycline 50 mg

Adderall 30mg

Imovane

oxazepam kruidvat

Codeïne

Methadon Kopen

Vyvanse Nederland

Omnadren 250 mg

diazepam kruidvat

Rohypnol 1/2 mg

OxyContin 40 mg

Fentanyl Pleister

Diazepam 10 mg

rohypnol

ritalin snuiven

Sig Sauer MCX Spear Semi-Automatic

CZ 527 Carbine 7.62×39 18.5 inch barrel

CZ 457 American Bolt Action Rimfire Rifle

CZ-USA 457 Premium Bolt Action

Big Boy Steel Side Gate .44 Mag/Spl

LabRadar Chronograph with Bluetooth

Benelli Super Black Eagle 3 Semi-Automatic Shotgun

Bergara Rifles Premier Mountain 2.0 Bolt Action

adderall svenska

rybelsus viktnedgång

tylenol sverige

varning för lyrica

mounjaro sverige

mdpv shop sverige

maxdos imovane

Koop dmt online in nederland

Lsd kopen online

Mdma kopen

OG Kush Wiet kopen

Gelato wiet kopen

Shiitake Mushroom

Rybelsus (Semaglutide) weight loss tablets online

Köp APAURIN DIAZEPAM 10MG Online

Adderall svenska 30mg

Beställa imovane 7.5mg online

Clenbuterol köpa 20mcg i sverige

Gabapentin biverkningar 300mg att köpa

Kodein Apotek 60mg syrup sverige

Köp Fentanyl Drog 100mcg utan kvitto

KÖP Metamfetamin i online

Köp Xanor 2mg i sverige till salu

Köp Rivotril 2mg i sverige

Köp / Beställ Petidin online i sverige

Köp / Beställ Ritalin online utan recept

KÖP adderall 20mg svenska online

Köp Ambien (Zolpidem) 10mg Online

Köp Attentin 5 mg i SVERIGE

Köp Citodon online i sverige utan recept

KÖP Concerta 54 mg i Sverige till salu

köp treo comp 500mg/ 50mg

Köp Dildos online i svenska

KÖP elvanse till salu i Sverige

Köp flytande oxynorm i Sverige

KÖP I SVERIGE Cialis online

Köp i sverige concerta första veckan

Köp i sverige gabapentin 300 mg till salu

KÖP I SVERIGE hydrokodon till salu

Köp Stilnoct 10mg online

KÖP I SVERIGE xanax till salu

Köp Xenical i sverige

KÖP lorazepam sömn

Köp mdpv i sverige

Köp Morfin 60mg i Sverige

Köp mounjaro online i sverige

Köp Naproxen utan recept

Köp Ozempic online utan recept

Köp Rohypnol 2mg online i Sverige

Köp saxenda online utan recept

Köp Sobril online i sverige

Köp Stesolid online i Sverige

Köp Stilnoct 10mg online

Köp stilnoct online i sverige

Köp Suboxone 8mg online i svenska

KÖP subutex 8mg i Sverige

Köp Tramadol 100mg kapsel online

Köp vyvanse 70mg online

Köp Wegovy online i sverige

KÖp Xanax Svenska utan recept

Köp Xenical i sverige

köpa bensodiazepiner in Sverige Pharms

köpa Ketamin till salu online i sverige

köpa sexleksaker

Köpa Viagra I SVERIGE utan recept online

Lyrica 300mg til salg

Metadon 40mg til salg

Naproxen 500 mg online

Oxazepam till salu i Sverige

Oxikodon actavis online

Oxikodon actavis 5 mg Till salu

Oxycontin 80mg till salu i Sverige

Oxynorm till salu i sverige

Paracetamol alvedon / Percocert

Sobril 25 mg

Tylenol svenska 500mg

Xanor till salu i Sverige utan recept

Oxynorm i sverige utan recept

Rybelsus (Semaglutide) weight loss tablets online

Buy Ozempic Online


Автор: chems planet (не зарегистрирован), дата: 19 апреля, 2024 - 04:00
#permalink

research chemicals for sale, you may find many websites or research chemicals vendors who are selling chemical planet. But you need to be sure about the quality and price. To research chemicals for sale at an affordable range and high quality products, you are at right place.

nep

mdphp

a-pihp

5-mmpa

4-cec

34-dmmc

3-mec

3-fmc

3-cec

2-mmc 250mg pellets

2-mmc 220mg pellets

newphoria 2-3-fea 35-mg 100mg pellets

3-mma

4f-mph 30mg pellets

4f-mph 15mg pellets

4-me-tmp

4-fma pure

4-fma 60mg pellets

4-fma 150mg pellets

4-fma 100mg pellets

4-fluorine 4-fma 120mg pellets

3-fpm 50mg pellets

3-fpm

3-fa 3-fluoroamphetamine

2-fpm

2-fma 30mg pellets

2-fma

2-fea

2-fa

maxtc

benzo fury 6-apb 100mg pellets

6-apb 130mg pellets

5-eapb/

4f-mar

4c-mar

buy 4b-mar

flunitrazolam 0-25mg blotters

pyrazolam 3mg pellets

buy pyrazolam 2-5-mg pellets

norflurazepam for sale

buy gidazepam pellets 3mg

buy flubrotizolam 0-5 mg pellets

fanax bars

buy flubromazepam pure

flubromazepam 10mg pellets

buy deschloroetizolam online

buy deschloroetizolam

buy clonazolam

buy bromonordiazepam

buy ativan 1mg

buy alprazolam 0-25mg blotters

5-meo-mipt hcl

4-ho-mipt fumarate

amt succinate

5-meo-mipt fumarate 10mg pellets

5-meo-dmt hcl

5-meo-dmt fumarate

5-meo-dmt freebase

5-meo-dalt freebase

4-ho-mipt fumarate 20mg pellets

4-ho-met fumarate spray bottle

4-ho-met fumarate 20mg pellets

4-ho-met fumarate

4-aco-met fumarate 20mg pellets

4-aco-met fumarate

6-apb succinate

5-mapb fumarate

3bk-2c-b hcl

pink star pellets blue bliss pellets

2c-b-fly 10mg pellets

mephedrene 5-mmpa

lsz 150mcg blotters

1b-lsd 125mcg blotters

amicro 1p-lsd 20mcg blotters

1p-lsd 150mcg blotters

1p-lsd 100mcg blotters

1cp-lsd 150mcg pellets

1cp-lsd 10mcg micro pellets

micro 1cp-lsd 20mcg blotters

1cp-lsd 150mcg art design blotters

1cp-lsd 100mcg blotters

1v-lsd 225mcg pellets

i1v-lsd 10mcg micro pellets

1v-lsd 225mcg art design blotters

1v-lsd 150mcg blotters

1d-al-lad 100mcg blotters

1d-lsd 100mcg dropper bottle

1d lsd 225mcg pellets

1d-lsd 10mcg micro pellets

d-lsd 150mcg blotters

mxipr hcl

mxpr hcl

hxe hydrochloride

dck hcl spray bottle

3-methyl-pcp

3-ho-pce hcl

3-ho-pcp hcl

3-cl-pcp hcl

o-pce-hcl

dmxe 40mg pellets

dmxe hcl

dck hcl

3-me-pcpy hcl

3-meo-pce hcl

2 fdck hcl

aminorex

buy benzodiazepines

benzofuran

cathinones

dissociatives

fluorinated

buy lysergamides

phenethylaminestryptamines

buy sulbutiamine online

reduced glutathione

buy phenylpiracetam

buy noopept

5-htp

sgt 507

mdmb-butinaca

adb-butinaca

7-aff powder

7-adb

buy 6tp-sgt

blue bliss pellets pink stars

4f-mph hcl pellets 15mg

4-fpm hcl

3-mma

4-ho-met spray bottle

2c-e hcl

5-meo-mipt hcl

5-meo-dmt freebase powder

5-meo-dipt hcl

5-meo dalt

5-br-dmt

4-ho-mpt

4-ho-mipt

4-ho-met pellets 20mg

buy 4-ho-met powder

4-ho-ept

4-aco-mipt

4-aco-met pellets 20mg

buy 4-aco-met powder

lsz blotters 150mcg

1v-lsd blotters 150mcg

1p-lsd blotters 150mcg

1p-lsd blotters 20mcg

1p-lsd blotters 100mcg

1d-lsd pellets 225mcg

1d-lsd blotters 150mcg

1d-lsd pellets 10mg

1cp-lsd blotters 10mcg

1cp-lsd blotters 20mcg

1cp-lsd blotters 100mcg

1cp-lsd pellet 150mcg

methallylescaline-fumarate

buy amt succinate

6-apb powder

5-mapb fumarate

4-fma hcl powder

buy 3-fma powder

2-fma pellet 30mg

2-fma hcl powder

2-fea hcl

buy dibutylone crystal online

buy a-pihp-s liquid

4-mpd crystal

buy 3-cmc powder

3 cmc crystals

buy nep

buy mephedrene

buy mdphp

2-mmc

pyrazolam pellets 3mg

norflurazepam

2-fdck hcl

2-fdck spray bottle

3-me-pcpy hcl powder

3-meo-pce hcl

3-methyl-pcp hcl powder

dck-hcl powder

dmxe hcl powder

hxe hcl powder

mxpr hcl powder

o-pce hcl powder

dck hcl spray bottle

buy bromazolam

deschloroetizolam pellets 5mg

fanax

flubromazepam

fluetizolam

flunitrazolam pellet 0-25mg

buy benzodiazepines online

c-liquid

synthetic cannabinoids

buy synthetic cathinones

herbal incense

buy lysergamides online

buy phenylethylamine hcl

buy tryptamines online


Автор: buy zolpidem (не зарегистрирован), дата: 19 апреля, 2024 - 04:01
#permalink

buy zolpidem, you may find many websites or medicine vendors who are selling buy zolpidem without a prescription. But you need to be sure about the quality and price. To buy zolpidem online at an affordable range and high quality products, you are at right place.

buy zolpidem online

buy lorazepam 2-5mg

buy temazepam online

buy diazepam online

buy bromazepam 6mg online

buy clonazepam 2mg online

buy xanax online overnight

buy tramadol 200mg online


Автор: Parking lotnisko chopina (не зарегистрирован), дата: 22 апреля, 2024 - 17:53
#permalink

Parking lotnisko chopina to zdecydowanie najlepszy pakring


Автор: Trans Annunci Roma (не зарегистрирован), дата: 25 апреля, 2024 - 17:22
#permalink

Trans Annunci Roma is probably the best web platform for free chat with local girls in Italy, so check out and enjoy


Автор: Гость (не зарегистрирован), дата: 29 апреля, 2024 - 20:10
#permalink

Discover top-tier cannabis shopping with our legit online dispensaries ship all 50 states reviews. Glowing reviews attest to our commitment to quality and reliability. Explore our extensive selection, from worldwide weed shipping to premium products. Join satisfied customers who trust our USA-based online dispensary for a discreet and exceptional experience. Buy weed online confidently with our renowned service.


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

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
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 + 18 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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