Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Удаление лишних символов при выборе списка и дублирование текста в список LI (https://javascript.ru/forum/jquery/54335-udalenie-lishnikh-simvolov-pri-vybore-spiska-i-dublirovanie-teksta-v-spisok-li.html)

Infinity178 13.03.2015 14:32

Удаление лишних символов при выборе списка и дублирование текста в список LI
 
Доброго дня форумчани!

Ситуация:
Есть некий список select он преобразуется через jQuery в выпадающее меню.

исходник jQuery автор Dimox

Все работает безупречно.. Параметры соблюдаются, подгрузка через JSON, Ajax так же не нарушает сцепки CSS и DOM элементов. Но проблема появилась там где не ждали..

Список:

<select name="category_name">
  <option value="1">Категория 1</option>
  <option value="2">&nbsp;&nbsp;Категория 2</option>
  <option value="3">&nbsp;&nbsp;&nbsp;&nbsp;Категория 3</option>
  <option value="4">Категория 4</option>
</select>


Символ &nbsp; устанавливается для визуального восприятия Родительная->Дочерняя категория. Т.е. чем выше уровень последней категории тем больше пробелов от края.

Т.к. вложенность не особо большая но данный формат оказался удобным, пришлось остановиться на нем.

И так суть проблемы:

Нашел у jQuery .replace() вот такую замечательную штуку..

и не могу понять если делать через
.each(function() {...
то результат проходит на GET элементы, новые которые только созданы DOM списки не воспринимают функцию.. + работает как положено только на 1-м элементе
$('.jq-selectbox').each(function(){ // оболочка списка DIV
	$('.jq-selectbox__select-text').each(function(){ // DIV где нужный текст
		var str = $(this).text();
		str = str.replace(/\s+/g," "); 
		$(this).text(str);
	});
});

если делать через
.change(function(){...
то не особо выходит с новыми DOM элементами..

рони 13.03.2015 14:47

Цитата:

Сообщение от Infinity178
И так суть проблемы

в чём проблема то?

Infinity178 13.03.2015 15:33

))
проблема в том что
если меняем выбранный пункт - отказ
если создаем новый список DOM - отказ

по сути обрабатывает после перезагрузки страницы.

Infinity178 13.03.2015 15:42

Выходит как качели..

если делать через
.change(function(){...
на голый (без оформления) select список - все ровно работает

Если на список UL > LI так же голый - все нормально работает

Но если делать как в моем случае на базе SELECT создаем DOM UL>LI то начитает тупить.

Просто чувствую что. что то упустил.. не могу понять что

рони 13.03.2015 16:27

Infinity178,
увы так и не понял вашей проблемы - может ещё как-то проще обьясните?

laimas 13.03.2015 16:43

Причина в том, что обработчик события устанавливается элементу при загрузке странице. А у вас надо полагать проблема с динамически создаваемыми элементами (UL), а им эти обработчики естественно не установлены. Нужно делегировать обработчик ближайшему родителю, который гарантированно есть на странице.

рони 13.03.2015 16:49

laimas,
а пробелы то чем мешают человеку, не подскажешь? :)

Infinity178 13.03.2015 17:26

при загрузки страницы
http://prntscr.com/6g8iwt

при изменении списка
http://prntscr.com/6g8j2i

при добавлении нового списка
http://prntscr.com/6g8j7f

- - - - - -
я правельно понимаю что нужно .each(.. привязать к HTML
и грубо вывести след. логику:

$('div.case').each(function(){
$(this).find('select).....
или
$(this).find('div').has('&nbsp;')...
});

laimas 13.03.2015 17:44

а пробелы то чем мешают человеку, не подскажешь?

Думаю это опустить можно, это может написано по незнанию )

Я читаю - родители есть, проблем нет, а если создать новый, то проблемы.

Infinity, давайте на пальцах - у вас одновременно с загрузкой страницы загружается список А, и с ним нет проблем. Затем вы запрашиваете север, получаете данные и строите по ним второй список Б, важно(!) полностью, то есть <select><option></option></select> или <ul><li></li></uL>, что в общем не важно, добавляя его на страницу и с этим списком возникают проблемы. Так? Какие проблемы - он не обрабатывается обработчиком по событию onchange?

рони 13.03.2015 17:46

Infinity178,
можно узнать в чём проблема с пробелами ? или это останется тайной


Часовой пояс GMT +3, время: 19:57.