Вкладання оптичних груп у випадаючий список / вибір


78

Я створив клієнтський елемент керування c # DropDownList, який може відображати його вміст - це оптигрупи (не з нуля, я відредагував деякий код, знайдений в Інтернеті, хоча я точно розумію, що він робить), і він працює нормально.

Однак зараз я зіткнувся з ситуацією, коли мені потрібно мати два рівні відступу у своєму випадаючому списку, тобто

<select>
  <optgroup label="Level One">
    <option> A.1 </option>
    <optgroup label="Level Two">
      <option> A.B.1 </option>
    </optgroup>
    <option> A.2 </option>
  </optgroup>
</select>

Однак у наведеному вище прикладі фрагмента він відображається так, ніби Level Twoбув на тому ж рівні відступу, що і Level One.

Чи є спосіб створити вкладену поведінку optgroup, яку я шукаю?


Додав цю проблему як пропозицію до HTMLWG: github.com/whatwg/html/issues/5789
oriadam

Відповіді:


67

Специфікація HTML тут дійсно порушена. Це повинно дозволити вкладені групи вибору та рекомендувати агентам користувача відображати їх як вкладені меню. Натомість дозволений лише один рівень optgroup . Однак вони повинні сказати наступне на цю тему:

Примітка. Впроваджувачам рекомендується, що майбутні версії HTML можуть розширити механізм групування, щоб дозволити вкладені групи (тобто елементи OPTGROUP можуть вкладатись). Це дозволить авторам представляти багатшу ієрархію вибору.

Агенти користувачів можуть почати використовувати підменю для візуалізації optgoups замість показу заголовків перед першим елементом опції в optgroup, як це робиться зараз.


Це правда, ви не можете створити багаторівневе вкладене дерево з групами опцій, ані з html 5, також примітка невірна.
inf3rno

Хтось знає, чи планують вони відвідати це у HTML5? Здається, це масовий нагляд.
Sweepster

19
Відповідно до специфікації HTML5 ( dev.w3.org/html5/markup/optgroup.html#optgroup ) єдиним дозволеним батьківським елементомoptgroup є select, що припускає, що ні, це не підтримується в HTML5.
Ден Еткінсон,

2
Хто-небудь знає, чи вкладені оптгрупи є на дорожній карті?
Snæbjørn

52

Це чудово, але якщо ви додасте опцію, яка не входить в optgroup, вона стає глючною.

<select>
  <optgroup label="Level One">
    <option> A.1 </option>
    <optgroup label="&nbsp;&nbsp;&nbsp;&nbsp;Level Two">
      <option>&nbsp;&nbsp;&nbsp;&nbsp; A.B.1 </option>
    </optgroup>
    <option> A.2 </option>
  </optgroup>
  <option> A </option>
</select>

Було б набагато краще, якби ви негайно використали css та закрили optgroup:

<select>
  <optgroup label="Level One"></optgroup>
  <option style="padding-left:15px"> A.1 </option>
  <optgroup label="Level Two" style="padding-left:15px"></optgroup>
  <option style="padding-left:30px"> A.B.1 </option>
  <option style="padding-left:15px"> A.2 </option>
  <option> A </option>
</select>


1
Ідеально, набагато простіше, оскільки ви можете робити style="padding-left:'. (15 * $level). 'px"цикл над деревом елементів.
Xeoncross

3
на жаль, це не працює в сафарі, оскільки paddingв <option>не надається
Маркус

4
CSS на допомогу: ви можете видалити відступ лівих і використовувати текстовий відступ замість цього, додаючи ту ж суму на вибір ширину ящика (джерело: stackoverflow.com/questions/2966855 / ... )
Potherca

Це не баггі, це визначено таким чином. Варіант А не входить до групи.
Suncat2000

45

Добре, якщо хтось коли-небудь прочитає це: найкращий варіант - додати чотири &nbsp;s на кожному додатковому рівні відступу, здавалося б!

так:

<select>
 <optgroup label="Level One">
  <option> A.1 </option>
  <optgroup label="&nbsp;&nbsp;&nbsp;&nbsp;Level Two">
   <option>&nbsp;&nbsp;&nbsp;&nbsp; A.B.1 </option>
  </optgroup>
  <option> A.2 </option>
 </optgroup>
</select>


115
Роблячи це, ви буквально вбиваєте зручність вашого вибору, не дозволяючи користувачам натискати першу літеру елемента, щоб швидко перейти до цієї букви.
Джеффрі Бачелет,

41
Парадоксально, але Джеффрі, це одночасно покращує зручність використання, забезпечуючи візуальну ієрархію. Смішний старий світ.
Джейк Рейсон

1
Ще однією причиною, що це не ідеально, є те, що вибраний параметр з великим відступом виглядає незвично, коли виділення неактивне через усі відступи
Райан

12
Перевірте DOM ... optgroupsвони насправді не вкладені. Принаймні у Firefox. Він закриває першу оптогрупу, коли бачить другу.
mpen

1
@DarkSide Це дуже стара пара запитань / відповідей, тому я був радий сказати, що перевага сумнівів, але я щойно спробував це в Chrome 38.0.2125.104 і ні, працює, як очікувалося.
Ед Джеймс,

16

<style>
  .NestedSelect{display: inline-block; height: 100px; border: 1px Black solid; overflow-y: scroll;}
  .NestedSelect label{display: block; cursor: pointer;}
  .NestedSelect label:hover{background-color: #0092ff; color: White;}
  .NestedSelect input[type="radio"]{display: none;}
  .NestedSelect input[type="radio"] + span{display: block; padding-left: 0px; padding-right: 5px;}
  .NestedSelect input[type="radio"]:checked + span{background-color: Black; color: White;}
  .NestedSelect div{margin-left: 15px; border-left: 1px Black solid;}
  .NestedSelect label > span:before{content: '- ';}
</style>

<div class="NestedSelect">
  <label><input type="radio" name="MySelectInputName"><span>Fruit</span></label>
  <div>
    <label><input type="radio" name="MySelectInputName"><span>Apple</span></label>
    <label><input type="radio" name="MySelectInputName"><span>Banana</span></label>
    <label><input type="radio" name="MySelectInputName"><span>Orange</span></label>
  </div>

  <label><input type="radio" name="MySelectInputName"><span>Drink</span></label>
  <div>
    <label><input type="radio" name="MySelectInputName"><span>Water</span></label>

    <label><input type="radio" name="MySelectInputName"><span>Soft</span></label>
    <div>
      <label><input type="radio" name="MySelectInputName"><span>Cola</span></label>
      <label><input type="radio" name="MySelectInputName"><span>Soda</span></label>
      <label><input type="radio" name="MySelectInputName"><span>Lemonade</span></label>
    </div>

    <label><input type="radio" name="MySelectInputName"><span>Hard</span></label>
    <div>
      <label><input type="radio" name="MySelectInputName"><span>Bear</span></label>
      <label><input type="radio" name="MySelectInputName"><span>Whisky</span></label>
      <label><input type="radio" name="MySelectInputName"><span>Vodka</span></label>
      <label><input type="radio" name="MySelectInputName"><span>Gin</span></label>
    </div>
  </div>
</div>


Це автоматично працюватиме для необмеженого рівня вкладеності без додавання / зміни будь-якого атрибута CSS / Style.
Broken Arrow

Чудовий товариш! Виглядає здорово! : D
Донні ван V

Чудова відповідь. SK joy vai
Rasel

6

Мені дуже подобається рішення Broken Arrow вище у цій публікації. Я щойно вдосконалив / змінив його, так що те, що називалося мітками, можна перемикати і не розглядати як варіанти. Я використовував невеликий фрагмент jQuery, але це можна було зробити і без jQuery.

Я замінив проміжні мітки (без міток листів) на посилання, які викликають функцію за кліком. Ця функція відповідає за перемикання наступного div натиснутого посилання, щоб вона розширювала / згортала параметри. Це дозволяє уникнути можливості вибору проміжного елемента в ієрархії, що зазвичай є бажаним. Скласти варіант, який дозволяє відібрати проміжні елементи, повинен бути простим.

Це модифікований html:

<div class="NestedSelect">
    <a onclick="toggleDiv(this)">Fruit</a>
    <div>
        <label>
            <input type="radio" name="MySelectInputName"><span>Apple</span></label>
        <label>
            <input type="radio" name="MySelectInputName"><span>Banana</span></label>
        <label>
            <input type="radio" name="MySelectInputName"><span>Orange</span></label>
    </div>

    <a onclick="toggleDiv(this)">Drink</a>
    <div>
        <label>
            <input type="radio" name="MySelectInputName"><span>Water</span></label>

        <a onclick="toggleDiv(this)">Soft</a>
        <div>
            <label>
                <input type="radio" name="MySelectInputName"><span>Cola</span></label>
            <label>
                <input type="radio" name="MySelectInputName"><span>Soda</span></label>
            <label>
                <input type="radio" name="MySelectInputName"><span>Lemonade</span></label>
        </div>

        <a onclick="toggleDiv(this)">Hard</a>
        <div>
            <label>
                <input type="radio" name="MySelectInputName"><span>Bear</span></label>
            <label>
                <input type="radio" name="MySelectInputName"><span>Whisky</span></label>
            <label>
                <input type="radio" name="MySelectInputName"><span>Vodka</span></label>
            <label>
                <input type="radio" name="MySelectInputName"><span>Gin</span></label>
        </div>
    </div>
</div>

Невелика функція javascript / jQuery:

function toggleDiv(element) {
    $(element).next('div').toggle('medium');
}

І css:

.NestedSelect {
    display: inline-block;
    height: 100%;
    border: 1px Black solid;
    overflow-y: scroll;
}

.NestedSelect a:hover, .NestedSelect span:hover  {
    background-color: #0092ff;
    color: White;
    cursor: pointer;
}

.NestedSelect input[type="radio"] {
    display: none;
}

.NestedSelect input[type="radio"] + span {
    display: block;
    padding-left: 0px;
    padding-right: 5px;
}

.NestedSelect input[type="radio"]:checked + span {
    background-color: Black;
    color: White;
}

.NestedSelect div {
    display: none;
    margin-left: 15px;
    border-left: 1px black
    solid;
}

.NestedSelect label > span:before, .NestedSelect a:before{
    content: '- ';
}

.NestedSelect a {
    display: block;
}

Запуск зразка в JSFiddle


5

Думаю, якщо у вас є щось таке структуроване та складне, ви можете розглянути щось інше, ніж одне спадне вікно.


4
Не мій дизайн, я просто впроваджую речі, хоча і погоджуюсь, що це досить божевільно. Частина радості від залучення до роботи за попередньо узгодженим дизайном.
Ед Джеймс,

4

Я знаю, що це було досить давно, проте я маю додати трохи додаткового:

Це неможливо в HTML5 або будь-яких попередніх специфікаціях, а також не пропонується в HTML5.1. Я зробив запит до списку public-html-commentsрозсилки, але ми побачимо, чи з цього щось вийде.

Незважаючи на те, що поки це неможливо використовувати <select>, ви можете досягти подібного ефекту за допомогою наступного HTML, а також деяких CSS для красивості:

<ul>
  <li>
	<input type="radio" name="location" value="0" id="loc_0" />
	<label for="loc_0">United States</label>
	<ul>
	  <li>
		Northeast
        <ul>
	      <li>
			<input type="radio" name="location" value="1" id="loc_1" />
			<label for="loc_1">New Hampshire</label>
		  </li>
          <li>
			<input type="radio" name="location" value="2" id="loc_2" />
			<label for="loc_2">Vermont</label>
		  </li>
          <li>
			 <input type="radio" name="location" value="3" id="loc_3" />
			 <label for="loc_3">Maine</label>
		  </li>
		 </ul>
	   </li>
       <li>
		   Southeast
           <ul>
			 <li>
				<input type="radio" name="location" value="4" id="loc_4" />
				<label for="loc_4">Georgia</label>
			 </li>
             <li>
				<input type="radio" name="location" value="5" id="loc_5" />
				<label for="loc_5">Alabama</label>
			 </li>
		   </ul>
		</li>
	  </ul>
    </li>
    <li>
	   <input type="radio" name="location" value="6" id="loc_6" />
	   <label for="loc_6">Canada</label>
       <ul>
		  <li>
			 <input type="radio" name="location" value="7" id="loc_7" />
			 <label for="loc_7">Ontario</label>
		  </li>
          <li>
			  <input type="radio" name="location" value="8" id="loc_8" />
		      <label for="loc_8">Quebec</label>
		  </li>
          <li>
			   <input type="radio" name="location" value="9" id="loc_9" />
			   <label for="loc_9">Manitoba</label>
		  </li>
		</ul>
	 </li>
  </ul>

Як додаткова додаткова перевага, це також означає, що ви можете дозволити вибір <optgroups> самих себе. Це може бути корисно, якщо у вас були, наприклад, вкладені категорії, де категорії вкладаються в деталі, і ви хочете дозволити користувачам вибирати вище в ієрархії.

Це все буде працювати без JavaScript, однак, можливо, ви захочете додати кілька, щоб приховати перемикачі, а потім змінити колір тла вибраного елемента чи щось інше.

Майте на увазі, це далеко не ідеальне рішення, але якщо вам абсолютно потрібен вкладений вибір із розумною сумісністю між браузерами, це, мабуть, настільки близько, наскільки ви збираєтеся отримати.


Чи можете ви додати кілька зразків красивості CSS для тих з нас, хто не знає CSS так добре, як, можливо, слід було б?
Пет

Я вважав би це блискучим рішенням.
Nj Subedi

Це не що інше, як вкладений список. Це повністю пропускає суть питання, а саме - мати якийсь розбірний список.
Цербрус

@Cerbrus Можливо, вам слід прочитати питання ще раз. Жодного разу він не заявляє, що розділи повинні бути розбірними. Конкретною проблемою, яку він прагнув вирішити, був метод вкладеності <optgroup>s, який робить відступ. Очевидно, що можна зробити HTML-рендерінг як випадаючий за допомогою декількох дуже простих CSS та / або JS, але OP не шукав допомоги в цьому.
Джеймс Біллінгем

Це гідна відповідь щодо того, як подати речі наочно, але тег списку не є еквівалентом select. Вам потрібно більше коду CSS та Javascript, щоб він поводився як один.
Suncat2000,

3

Мені потрібне було чисте та легке рішення (отже, жоден jQuery і подібні), який буде виглядати точно так само, як звичайний HTML, також буде продовжувати працювати, коли попередньо встановлений лише звичайний HTML (тому javascript лише покращить його), і який дозволить здійснювати пошук, починаючи з літер ( включаючи національні літери UTF-8), якщо це можливо, якщо це не додає зайвої ваги. Він також повинен працювати швидко на дуже повільних браузерах (думаю, rPi - тому бажано не виконувати JavaScript після завантаження сторінки).

У firefox він використовує ідентифікацію CSS і, таким чином, дозволяє здійснювати пошук за буквами, а в інших браузерах він використовуватиме попередній &nbsp;(але там він не підтримує швидкий пошук за буквами). У будь-якому випадку, я цілком задоволений результатами.

Ви можете спробувати це в дії тут

Це виглядає так:

CSS:

.i0 { }
.i1 { margin-left: 1em; }
.i2 { margin-left: 2em; }
.i3 { margin-left: 3em; }
.i4 { margin-left: 4em; }
.i5 { margin-left: 5em; }

HTML (клас "i1", "i2" тощо позначають рівень ідентифікації):

<form action="/filter/" method="get">
<select name="gdje" id="gdje">
<option value=1 class="i0">Svugdje</option>
<option value=177 class="i1">Bosna i Hercegovina</option>
<option value=190 class="i2">Babin Do</option>  
<option value=258 class="i2">Banja Luka</option>
<option value=181 class="i2">Tuzla</option>
<option value=307 class="i1">Crna Gora</option>
<option value=308 class="i2">Podgorica</option>
<option value=2 SELECTED class="i1">Hrvatska</option>
<option value=5 class="i2">Bjelovarsko-bilogorska županija</option>
<option value=147 class="i3">Bjelovar</option>
<option value=79 class="i3">Daruvar</option>  
<option value=94 class="i3">Garešnica</option>
<option value=329 class="i3">Grubišno Polje</option>
<option value=368 class="i3">Čazma</option>
<option value=6 class="i2">Brodsko-posavska županija</option>
<option value=342 class="i3">Gornji Bogićevci</option>
<option value=158 class="i3">Klakar</option>
<option value=140 class="i3">Nova Gradiška</option>
</select>
</form>

<script>
<!--
        window.onload = loadFilter;
// -->   
</script>

JavaScript:

function loadFilter() {
  'use strict';
  // indents all options depending on "i" CSS class
  function add_nbsp() {
    var opt = document.getElementsByTagName("option");
    for (var i = 0; i < opt.length; i++) {
      if (opt[i].className[0] === 'i') {
      opt[i].innerHTML = Array(3*opt[i].className[1]+1).join("&nbsp;") + opt[i].innerHTML;      // this means "&nbsp;" x (3*$indent)
      }
    }
  }
  // detects browser
  navigator.sayswho= (function() {
    var ua= navigator.userAgent, tem,
    M= ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*([\d\.]+)/i) || [];
    if(/trident/i.test(M[1])){
        tem=  /\brv[ :]+(\d+(\.\d+)?)/g.exec(ua) || [];
        return 'IE '+(tem[1] || '');
    }
    M= M[2]? [M[1], M[2]]:[navigator.appName, navigator.appVersion, '-?'];
    if((tem= ua.match(/version\/([\.\d]+)/i))!= null) M[2]= tem[1];
    return M.join(' ');
  })();
  // quick detection if browser is firefox
  function isFirefox() {
    var ua= navigator.userAgent,
    M= ua.match(/firefox\//i);  
    return M;
  }
  // indented select options support for non-firefox browsers
  if (!isFirefox()) {
    add_nbsp();
  }
}  

Додавання класів CSS для управління відступами вирішить питання OP, не погіршуючи функціональність select. Хороша ідея, оскільки optgroupsїї не можна вкладати.
Suncat2000,

Чому у вас є код, margin-left: 1em; коли він нічого не робить, і ви &nbsp;все одно використовуєте s просто для того, щоб з'явилося поле? Ваш CSS-код тут нічого не робить. Демо лівих полів не працює
HoldOffHunger

@HoldOffHunger зауважимо, що відповідь вище - з 2015 року і має особливу isFirefox()обробку - тоді firefox не потребував &nbsp;(що порушувало функціональність пошуку-як-ти-типу випадаючих списків), і тоді він шанував поля в випадаючих списках (на жаль , принаймні, як і у Firefox 78.5, це вже не працює)
Матія Наліс

2

Я написав гарний, вкладений вибір. Можливо, це вам допоможе.

https://jsfiddle.net/nomorepls/tg13w5r7/1/

function on_change_select(e) {
  alert(e.value, e.title, e.option, e.select);
}

$(document).ready(() => {
  // NESTED SELECT

  $(document).on('click', '.nested-cell', function() {
    $(this).next('div').toggle('medium');
  });

  $(document).on('change', 'input[name="nested-select-hidden-radio"]', function() {
    const parent = $(this).closest(".nested-select");
    const value = $(this).attr('value');
    const title = $(this).attr('title');
    const executer = parent.attr('executer');
    if (executer) {
      const event = new Object();
      event.value = value;
      event.title = title;
      event.option = $(this);
      event.select = parent;
      window[executer].apply(null, [event]);
    }
    parent.attr('value', value);
    parent.parent().slideToggle();
    const button = parent.parent().prev();
    button.toggleClass('active');
    button.addClass('selected');
    button.children('.nested-select-title').html(title);
  });

  $(document).on('click', '.nested-select-button', function() {
    const button = $(this);
    let select = button.parent().children('.nested-select-wrapper');

    if (!button.hasClass('active')) {
      select = select.detach();
      if (button.height() + button.offset().top + $(window).height() * 0.4 > $(window).height()) {
        select.insertBefore(button);
        select.css('margin-top', '-44vh');
        select.css('top', '0');
      } else {
        select.insertAfter(button);
        select.css('margin-top', '');
        select.css('top', '40px');
      }
    }
    select.slideToggle();
    button.toggleClass('active');
  });
});
.container {
  width: 200px;
  position: relative;
  top: 0;
  left: 0;
  right: 0;
  height: auto;
}

.nested-select-box {
  font-family: Arial, Helvetica, sans-serif;
  display: block;
  position: relative;
  width: 100%;
  height: fit-content;
  cursor: pointer;
  color: #2196f3;
  height: 40px;
  font-size: small;
  /* z-index: 2000; */
}

.nested-select-box .nested-select-button {
  border: 1px solid #2196f3;
  position: absolute;
  width: calc(100% - 20px);
  padding: 0 10px;
  min-height: 40px;
  word-wrap: break-word;
  margin: 0 auto;
  overflow: hidden;
}

.nested-select-box.danger .nested-select-button {
  border: 1px solid rgba(250, 33, 33, 0.678);
}

.nested-select-box .nested-select-button .nested-select-title {
  padding-right: 25px;
  padding-left: 25px;
  width: calc(100% - 50px);
  margin: auto;
  height: fit-content;
  text-align: center;
  vertical-align: middle;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
}

.nested-select-box .nested-select-button.selected .nested-select-title {
  bottom: unset;
  top: 5px;
}

.nested-select-box .nested-select-button .nested-select-title-icon {
  position: absolute;
  height: 20px;
  width: 20px;
  top: 10px;
  bottom: 10px;
  right: 7px;
  transition: all 0.5s ease 0s;
}

.nested-select-box .nested-select-button.active .nested-select-title-icon {
  -moz-transform: scale(-1, -1);
  -o-transform: scale(-1, -1);
  -webkit-transform: scale(-1, -1);
  transform: scale(-1, -1);
}

.nested-select-box .nested-select-button .nested-select-title-icon::before,
.nested-select-box .nested-select-button .nested-select-title-icon::after {
  content: "";
  background-color: #2196f3;
  position: absolute;
  width: 70%;
  height: 2px;
  transition: all 0.5s ease 0s;
  top: 9px;
}

.nested-select-box .nested-select-button .nested-select-title-icon::before {
  transform: rotate(45deg);
  left: -1.6px;
}

.nested-select-box .nested-select-button .nested-select-title-icon::after {
  transform: rotate(-45deg);
  left: 7px;
}

.nested-select-box .nested-select-wrapper {
  width: 100%;
  top: 40px;
  position: relative;
  border: 1px solid #2196f3;
  background: #ffffff;
  z-index: 2005;
  opacity: 1;
}

.nested-select {
  font-family: Arial, Helvetica, sans-serif;
  display: inline-block;
  overflow-y: scroll;
  max-height: 40vh;
  width: calc(100% - 10px);
  padding: 5px;
  -ms-overflow-style: none;
  scrollbar-width: none;
}

.nested-select::-webkit-scrollbar {
  display: none;
}

.nested-select a,
.nested-select span {
  padding: 0 5px;
  border-radius: 3px;
  cursor: pointer;
  text-align: start;
}

.nested-select a:hover {
  background-color: #62b2f3;
  color: #ffffff;
}

.nested-select span:hover {
  background-color: #c4c4c4;
  color: #ffffff;
}

.nested-select input[type="radio"] {
  display: none;
}

.nested-select input[type="radio"]+span {
  display: block;
}

.nested-select input[type="radio"]:checked+span {
  background-color: #2196f3;
  color: #ffffff;
}

.nested-select div {
  margin-left: 15px;
}

.nested-select label>span:before,
.nested-select a:before {
  content: "\2022";
  margin-right: 5px;
}

.nested-select a {
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
  <div class="nested-select-box w-100">
    <div class="nested-select-button">
      <p class="nested-select-title">
        Account
      </p>
      <span class="nested-select-title-icon"></span>
    </div>
    <div class="nested-select-wrapper" style="display: none;">
      <div class="nested-select" executer="on_change_select">

        <label>
        <input title="Accounting and legal services" value="1565142000000891539" type="radio" name="nested-select-hidden-radio">
        <span>Accounting and legal services</span>
      </label>



        <label>
        <input title="Advertising agencies" value="1565142000000891341" type="radio" name="nested-select-hidden-radio">
        <span>Advertising agencies</span>
      </label>



        <a class="nested-cell">Advertising And Marketing</a>
        <div>



          <label>
          <input title="Advertising agencies" value="1565142000000891341" type="radio" name="nested-select-hidden-radio">
          <span>Advertising agencies</span>
        </label>



          <a class="nested-cell">Adwords - traffic</a>
          <div>



            <label>
            <input title="Adwords - traffic: Charters and general search" value="1565142000003929177" type="radio" name="nested-select-hidden-radio">
            <span>Adwords - traffic: Charters and general search</span>
          </label>



            <label>
            <input title="Adwords - traffic: Distance course" value="1565142000007821291" type="radio" name="nested-select-hidden-radio">
            <span>Adwords - traffic: Distance course</span>
          </label>



            <label>
            <input title="Adwords - traffic: Events" value="1565142000003929189" type="radio" name="nested-select-hidden-radio">
            <span>Adwords - traffic: Events</span>
          </label>



            <label>
            <input title="Adwords - traffic: Practices" value="1565142000003929165" type="radio" name="nested-select-hidden-radio">
            <span>Adwords - traffic: Practices</span>
          </label>



            <label>
            <input title="Adwords - traffic: Sailing tours" value="1565142000003929183" type="radio" name="nested-select-hidden-radio">
            <span>Adwords - traffic: Sailing tours</span>
          </label>



            <label>
            <input title="Adwords - traffic: Theoretical courses" value="1565142000003929171" type="radio" name="nested-select-hidden-radio">
            <span>Adwords - traffic: Theoretical courses</span>
          </label>



          </div>



          <label>
          <input title="Branded products" value="1565142000000891533" type="radio" name="nested-select-hidden-radio">
          <span>Branded products</span>
        </label>



          <label>
          <input title="Business cards" value="1565142000005438323" type="radio" name="nested-select-hidden-radio">
          <span>Business cards</span>
        </label>



          <a class="nested-cell">Facebook, Instagram - traffic</a>
          <div>



            <label>
            <input title="Facebook, Instagram - traffic: Charters and general search" value="1565142000003929145" type="radio" name="nested-select-hidden-radio">
            <span>Facebook, Instagram - traffic: Charters and general search</span>
          </label>



            <label>
            <input title="Facebook, Instagram - traffic: Distance course" value="1565142000007821285" type="radio" name="nested-select-hidden-radio">
            <span>Facebook, Instagram - traffic: Distance course</span>
          </label>



            <label>
            <input title="Facebook, Instagram - traffic: Events" value="1565142000003929157" type="radio" name="nested-select-hidden-radio">
            <span>Facebook, Instagram - traffic: Events</span>
          </label>



            <label>
            <input title="Facebook, Instagram - traffic: Practices" value="1565142000003929133" type="radio" name="nested-select-hidden-radio">
            <span>Facebook, Instagram - traffic: Practices</span>
          </label>



            <label>
            <input title="Facebook, Instagram - traffic: Sailing tours" value="1565142000003929151" type="radio" name="nested-select-hidden-radio">
            <span>Facebook, Instagram - traffic: Sailing tours</span>
          </label>



            <label>
            <input title="Facebook, Instagram - traffic: Theoretical courses" value="1565142000003929139" type="radio" name="nested-select-hidden-radio">
            <span>Facebook, Instagram - traffic: Theoretical courses</span>
          </label>



          </div>



          <label>
          <input title="Offline Advertising (posters, banners, partnerships)" value="1565142000000891377" type="radio" name="nested-select-hidden-radio">
          <span>Offline Advertising (posters, banners, partnerships)</span>
        </label>



          <label>
          <input title="Photos, video etc." value="1565142000000891371" type="radio" name="nested-select-hidden-radio">
          <span>Photos, video etc.</span>
        </label>



          <label>
          <input title="Prize fund" value="1565142000001404931" type="radio" name="nested-select-hidden-radio">
          <span>Prize fund</span>
        </label>



          <label>
          <input title="SEO" value="1565142000000891365" type="radio" name="nested-select-hidden-radio">
          <span>SEO</span>
        </label>



          <label>
          <input title="SMM Content creation (texts, copywriting)" value="1565142000000891389" type="radio" name="nested-select-hidden-radio">
          <span>SMM Content creation (texts, copywriting)</span>
        </label>



          <a class="nested-cell">YouTube</a>
          <div>



            <label>
            <input title="YouTube: travel expenses" value="1565142000008100163" type="radio" name="nested-select-hidden-radio">
            <span>YouTube: travel expenses</span>
          </label>



            <label>
            <input title="Youtube: video editing" value="1565142000008100157" type="radio" name="nested-select-hidden-radio">
            <span>Youtube: video editing</span>
          </label>



          </div>



        </div>

      </div>
    </div>
  </div>
</div>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.