Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Определить куда вставлять содержимое по клику (https://javascript.ru/forum/events/49922-opredelit-kuda-vstavlyat-soderzhimoe-po-kliku.html)

feoalter7 03.09.2014 15:27

Определить куда вставлять содержимое по клику
 
Доброго времени суток господа!
Введение.
Имеем несколько(2 например) полей для ввода. Вот таких
<input class="search_show_list" type="text" tabindex="1" autocomplete="off">

Эти поля генерируются скриптом в цикле.
Под каждым таким input'ом, есть список ul, вот такой
<ul class="list_modules">
   <li class="search_item" data-value="1">Вася</li>
   <li class="search_item" data-value="2">Петя</li>
</ul>

Эти списки вместе с input'ом создаются скриптом

Задача.
При клике на любой из li списка, содержимое этого li помещалось бы в его (который выше) input.

Варианты.
Сразу хочу сказать что вариант типа подниматься по родителям, не подходит. Хотелось бы универсальности, а то вдруг возникнет необходимость в еще одном узле, сами понимаете цепочка из родителей работать перестанет.
Так же рассматривал вариант расставлять идентификаторы и инкреминировать циферку, но это получается привязка полная к DOM. Cчитаю решение не очень (может ошибаюсь).

Еще вариант. нашел вот что http://harvesthq.github.io/chosen/. посмотрел что у них все классы одинаковые, нет привязки к DOM, но при этом при клике по списку, содержимое попадает куда надо. Смотрел их файл, там все сделано прототипами.

Может кто подскажет как правильней и универсальней решить данную задачу?

Aetae 03.09.2014 16:36

Всё это должно связываться на момент генерации в js объекте.

ksa 03.09.2014 16:37

Как вариант... "Без родителей"... :)

<!DOCTYPE html>
<html>
<head>
<script src='http://code.jquery.com/jquery-latest.js'></script>
<!--
<link rel='stylesheet type=text/css href=tmp.css' />
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
$(function (){
	$('.search_item').click(function (){
		var val=$(this).data('value');
		$(this.parentNode).prevAll('.search_show_list').eq(0).val(val);
	});
});
</script>
</head>
<body>
<input class="search_show_list" type="text" tabindex="1" autocomplete="off">
<p>test 1</p>
<ul class="list_modules">
   <li class="search_item" data-value="1">Вася</li>
   <li class="search_item" data-value="2">Петя</li>
</ul>
<input class="search_show_list" type="text" tabindex="2" autocomplete="off">
<p>test 2</p>
<ul class="list_modules">
   <li class="search_item" data-value="1">Вася</li>
   <li class="search_item" data-value="2">Петя</li>
</ul>

</body>
</html>

feoalter7 03.09.2014 16:42

Цитата:

Сообщение от Aetae (Сообщение 328764)
Всё это должно связываться на момент генерации в js объекте.

А вот как между ними установить связь, без DOM?

ksa 03.09.2014 16:44

Цитата:

Сообщение от feoalter7
А вот как между ними установить связь, без DOM?

Как вариант:
- инпутам генерть уникальные ИД
- списку прописывать тот ИД в атрибут

feoalter7 03.09.2014 16:47

Цитата:

Сообщение от ksa (Сообщение 328765)
Как вариант... "Без родителей"... :)

<!DOCTYPE html>
<html>
<head>
<script src='http://code.jquery.com/jquery-latest.js'></script>
<!--
<link rel='stylesheet type=text/css href=tmp.css' />
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
$(function (){
	$('.search_item').click(function (){
		var val=$(this).data('value');
		$(this.parentNode).prevAll('.search_show_list').eq(0).val(val);
	});
});
</script>
</head>
<body>
<input class="search_show_list" type="text" tabindex="1" autocomplete="off">
<p>test 1</p>
<ul class="list_modules">
   <li class="search_item" data-value="1">Вася</li>
   <li class="search_item" data-value="2">Петя</li>
</ul>
<input class="search_show_list" type="text" tabindex="2" autocomplete="off">
<p>test 2</p>
<ul class="list_modules">
   <li class="search_item" data-value="1">Вася</li>
   <li class="search_item" data-value="2">Петя</li>
</ul>

</body>
</html>

В целом да, а как это перенести в чистый JS теперь..

feoalter7 03.09.2014 16:48

Цитата:

Сообщение от ksa
Как вариант:
- инпутам генерть уникальные ИД
- списку прописывать тот ИД в атрибут

Так же рассматривал вариант расставлять идентификаторы и инкреминировать циферку, но это получается привязка полная к DOM.

Я писал про это..так не пойдет.

ksa 03.09.2014 16:54

Цитата:

Сообщение от feoalter7
Так же рассматривал вариант расставлять идентификаторы и инкреминировать циферку, но это получается привязка полная к DOM.

У нас разное понимание термина "привязка к ДОМ"... :)

ksa 03.09.2014 16:55

Цитата:

Сообщение от feoalter7
а как это перенести в чистый JS теперь..

1000р за час и нет проблем! :yes:

feoalter7 03.09.2014 17:01

Цитата:

Сообщение от ksa (Сообщение 328775)
1000р за час и нет проблем! :yes:

Еще часок и будет готово!) Спасибо)

Aetae 03.09.2014 17:11

Ну ёбана... Яж сказал как нормальные люди это делают.
Вот максимально упрощённый пример.

feoalter7 05.09.2014 10:28

Aetae, идею понял. Спасибо!)

feoalter7 05.09.2014 17:13

Aetae, имею еще один вопрос. Описываю суть кода, представленного ниже: есть список по нажатию по элементу списка, этот элемент попадает в другой список (а из первого убирается display: none;), и к нему прибаляется крестик, чтобы можно было удалить этот выбранный элемент, так вот при нажатии на крестик из выбранных он удаляется (removeChild) и должен вернуться назад в список начальный (элементу должен присваиваться display: none;), но не понимает скрипт к какому элементу имеет отношение удаленный элемент..скрипт ниже.

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

var itemList = document.querySelectorAll('.item');
        for(var i = 0, count = itemList.length; i < count; i++) {
            var itemListC = itemList[i];
            itemListC.onclick = function(e) {
                    console.log(itemListC);
                var id = e.currentTarget.dataset.selectNumber;
                    e.currentTarget.style.display = 'none';
                    
                var btnClose = document.createElement('span');
                    btnClose.className = 'chosen_item_close';
                    btnClose.setAttribute('data-value', id);
                    btnClose.innerHTML = 'х';
                    btnClose.onclick = function(e, itemListC){
                        console.log(itemListC);
                        itemListC.style.display = 'block';
                        btnClose.parentNode.parentNode.removeChild(btnClose.parentNode);
                    }
                    newLiElem.appendChild(btnClose);
            }
        }


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