ruskar
@ruskar
Conflict Intelligence Team

Drop-зона внутри другой drop-зоны. jQuery UI Droppable?

Есть иерархический список категорий товара:

0_5fdb2_17fea2cc_orig



Вполне логично, что в разметку страницы он вставлен через ненумерованный список <UL>-<LI>. Самый важный момент заключается в том, что каждый элемент списка является «перетаскиваемым» (drag), а также может принимать на себя перетаскиваемые элементы (droppable) — таким способом осуществляется переупорядочивание элементов. Для задействования этих возможностей используются плагины jQuery UI Draggable, jQuery UI Droppable, ну и собственно сама библиотека jQuery.





Как оформлены в разметке «подсписки» — подгруппы?



Изначально я оформлял разметку не в соответствии со стандартнами W3C, а именно: подкатегории лежали вне родительского элемента <LI>. Т.е. указанный на скриншоте список был оформлен таким образом*:

<ul><br>
	<li>электроника</li><br>
	<ul><br>
		<li>телевизоры</li><br>
		<ul><br>
			<li>toshiba</li><br>
		</ul><br>
	</ul><br>
	<li>DVD-плееры</li><br>
	<li>MP3-плееры</li><br>
</ul><br>




* — здесь и далее я опустил такие элементы как теги ссылок, чекбоксов, атрибуты классов, поскольку они не имеют отношения к сути рассматриваемой проблемы



И всё казалось бы прекрасно работало (я имею ввиду drag & drop), но тут набежали всякие редиски и начали укорять меня в том, что так делать нельзя, это не по стандартам.

Окей, переделал разметку списка на такую:

<ul><br>
	<li>электроника<br>
	<ul><br>
		<li>телевизоры<br>
		<ul><br>
			<li>toshiba</li><br>
		</ul></li><br>
	</ul></li><br>
	<li>DVD-плееры</li><br>
	<li>MP3-плееры</li><br>
</ul><br>




Как видите, теперь список кажой подкатегории лежит внутри родительского элемента списка <LI>.

Вот тут-то всё и поломалось. Теперь бросание какого-либо элемента на одну из подкатегорий (любого уровня) не срабатывало, потому что drop-зона дочернего элемента полностью входила в drop-зону самого главного родительского элемента, поэтому событие «drop» срабатывало именно на нём.

Иными словами, если попробовать бросить любую категорию на подкатегорию «toshiba», то событие «drop» сработает на категории «электроника», а не «toshiba».



Есть какой-нибудь выход из этой проблемы или придётся вернуться к вёрстке не по стандартам? Про готовые плагины вроде jsTree можете не напоминать — я и так о них знаю.
  • Вопрос задан
  • 3519 просмотров
Пригласить эксперта
Ответы на вопрос 2
taliban
@taliban
php программист
www.w3.org/TR/html401/struct/lists.html#edef-LI Скажите своим «редискам» что они плохие человеки, ul или ol не нужно засовывать в li, li — текстовая нода. Доказательство тому — хотябы то, что закрывающий тэг не обязателен, она не учавствует в структуре, лишь обрамляет текст.
Ответ написан
Wott
@Wott
А в чем проблема сделать все li droppable и регулировать передачу по иерархии через return false;?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы