Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 07.11.2017
Сообщений: 121
1

Получение [i] массива при клике и его родительский элемент в массиве

02.12.2018, 18:48. Показов 4331. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть такой код:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
for (i = 0; i <data.length; i++){
        let names = data[i].name;
 
        let img = document.createElement('img');
        let imgsrc = data[i].avatar;
        img.className = "contacts_list_avatar";
 
        $('.contacts_list_avatar').css('width', '10px').css('height', '10px');
 
        var list = document.getElementById('list');
        var contacts = document.createElement('div');
        var contactsDiv = document.getElementsByClassName('list_item');
        contacts.id = data[i].name;
        contacts.className = "list_item";
        contacts.innerHTML = "<img src=" + imgsrc + ">" + '<p>' + names + '</p>';
        list.appendChild(contacts);
 
        $('.list_item').css('border-bottom', '1px solid #75BFFF')
                        .css('height', '10%')
                        .css('color', '#75BFFF');                
 
        contactsDiv[i].onclick = function detailed(event){  //Если кликаем на див, нужно получить data[i].name элемента, который                                  //мы вставляем в contacts.innerHTML = "<img src=" + imgsrc + ">" + '<p>' + names + '</p>';
            var target = event.target;
            $('#contact_screen').css('display', 'none');
            $('#detailed').css('display', 'block');
            
            if (target.tagName === "DIV"){   //Тут пытаемся получить data[i].name 
                let targetName = target.textContent;    
                // console.log(target.key);
                // let names = data[i].name;
            };
            
        }                
    };
У нас есть проскроливаемый список контактов. При клике на определенный див должен открываться новый экран в зависимости от того, на див с каким data[i].name мы кликнули. Получить строку с этим именем не проблема, но нужен именно элемент массива, по которому можно будет добраться до родителя или до соседа. И как можно добраться до этого самого родителя или соседа? И как получить номер [i] из data[i].name (в теории через него можно будет передвигаться по массиву)?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2018, 18:48
Ответы с готовыми решениями:

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

При клике на элемент одного массива изменить элемент другого массива с таким же индексом
Привет друзья. Возник вопрос. Есть такая разметка: &lt;section&gt; &lt;div class=&quot;mass-1&quot;&gt;&lt;/div&gt;...

Скрыть элемент при клике за его пределами
Доброго времени суток Делаю панель пользователя class=&quot;hide&quot; - display:none; Все работает - по...

В чем ошибка? Скрыть элемент при клике за его пределами
&lt;html&gt; &lt;head&gt; &lt;style type =&quot;text/css&quot;&gt; #btn { position: absolute; } ...

8
Эксперт JS
6492 / 3903 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
02.12.2018, 19:43 2
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <style>
        .list_item {
            border-bottom: 1px solid #75BFFF;
            height: 10%;
            color: #75BFFF;
        }
 
        .contacts_list_avatar {
            width: 50px;
            height: 50px;
        }
    </style>
</head>
<body>
    <div id="list"></div>
    <script>
        let data = [
            { name: "Kira Nitely1", avatar: "http://cyberstatic.net/images/cyberforum_logo.png" },
            { name: "Kira Nitely2", avatar: "http://cyberstatic.net/images/cyberforum_logo.png" },
        ];
        let list = document.getElementById('list'),
            s = "";
 
        for (let item of data) {
            s += `<div class="list_item"><img class="contacts_list_avatar" src="${item.avatar}" /><p>${item.name}</p></div>`;
        }
        list.innerHTML = s;
        list.onclick = detailed;
 
        function detailed(event) {  //Если кликаем на див, нужно получить data[i].name элемента, который                                  
            //мы вставляем в contacts.innerHTML = "<img src=" + imgsrc + ">" + '<p>' + names + '</p>';
 
            for (let el = event.target; el != this; el = el.parentElement) {
                if (el.className === "list_item") {
                    alert(data.findIndex(e => e.name === el.children[1].textContent));
                    break;
                }
            }
        }
    </script>
</body>
</html>
1
kalabuni
02.12.2018, 21:41
  #3

Не по теме:

Цитата Сообщение от Limongrass Посмотреть сообщение
При клике на определенный див должен открываться новый экран
очень жаль, что не стоит задача появления на столе нового монитора при клике на определённый див -- я бы с удовольствием посмотрел на такое решение, бросил бы работать, сидел бы себе и кликал :)

0
0 / 0 / 0
Регистрация: 07.11.2017
Сообщений: 121
03.12.2018, 08:49  [ТС] 4
kalabuni, новый экран в том смысле, что открывается карточка этого контакта, с сайтом, адресом и т.д.)

amr-now,
Javascript
1
2
3
4
let data = [
            { name: "Kira Nitely1", avatar: "http://cyberstatic.net/images/cyberforum_logo.png" },
            { name: "Kira Nitely2", avatar: "http://cyberstatic.net/images/cyberforum_logo.png" },
        ];
Так можно сделать, если контактов немного, но у меня их почти сотня. И массив этот с контактами очень большой, там не только имя и аватар, там адрес, сайт и еще много чего. И массив в массиве в массиве в массиве, вот!
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
03.12.2018, 09:27 5
Лучший ответ Сообщение было отмечено Limongrass как решение

Решение

Во-первых:
Это
Javascript
1
$('.contacts_list_avatar').css('width', '10px').css('height', '10px');
и это
Javascript
1
2
3
$('.list_item').css('border-bottom', '1px solid #75BFFF')
                        .css('height', '10%')
                        .css('color', '#75BFFF');
вынести за пределы цикла, зачем это выполнять при каждой итерации?

Во-вторых:

вместо

Javascript
1
2
var contactsDiv = document.getElementsByClassName('list_item');
contactsDiv[i].onclick = function detailed(event){ ... }
напишите
Javascript
1
contacts.onclick = function detailed(event){ ... }
Цитата Сообщение от Limongrass Посмотреть сообщение
Получить строку с этим именем не проблема, но нужен именно элемент массива, по которому можно будет добраться до родителя или до соседа.
Javascript
1
contacts.dataset.index = i
Затем при клике обращаетесь к data[event.target.dataset.index]

Цитата Сообщение от Limongrass Посмотреть сообщение
И как можно добраться до этого самого родителя или соседа?
Сосед видимо ваш индекс плюс минус 1. А что понимается под родителем - непонятно, в вашем коде обход плоской таблицы
1
0 / 0 / 0
Регистрация: 07.11.2017
Сообщений: 121
03.12.2018, 10:23  [ТС] 6
Так, смогла получить массив, в котором непосредственно находятся данные контакта, но contacts.dataset.index = i не работает как ожидалось - выдает каждый раз одну и ту же цифру, на какой контакт ни нажала бы.
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
03.12.2018, 12:25 7
Limongrass,

Добавьте ключевое слово let, тогда область видения итератора будет в пределах итерации

Javascript
1
for (let i = 0; i < data.length; i++){
1
Эксперт JS
6492 / 3903 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
03.12.2018, 16:20 8
renat_dmitriev, contacts - это <div>
Откуда у HTML-элемента свойство dataset ?

Добавлено через 1 минуту
Понятно, костыльно привязываем индекс из исходного массива.
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
03.12.2018, 16:36 9
Цитата Сообщение от amr-now Посмотреть сообщение
Откуда у HTML-элемента свойство dataset ?
Из спецификации наверное
https://developer.mozilla.org/... nt/dataset

Цитата Сообщение от amr-now Посмотреть сообщение
костыльно привязываем индекс из исходного массива.
А как по вашему не костыльно?
0
03.12.2018, 16:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.12.2018, 16:36
Помогаю со студенческими работами здесь

ListBox — добавить элемент и выбрать его при двойном клике
Хочу реализовать такую фишку: при двойном клике по листбоксу, если selectedItemIndex равен -1,...

Выделение дочерних чекбоксов при клике на родительский (и наоборот) в многоуровневом списке
Как сделать выделение чекбоксов при клике на &quot;родительский&quot;? Список многоуровневный, оформлен с...

Как определить какой элемент JavaScript запускается на странице при клике и запустить его?
Код страницы состоит сверху из кучи javascript такого типа &lt;script type=&quot;text/javascript&quot;...

Spawn объекта и добавление его в родительский элемент
задача: есть прифаб subjects, его необходимо заспавнить на месте объекта spawn и сразу добавить в...

Найти первый родительский элемент 'form' и выбрать его аттрибут
Когда нажимается кнопка submit, надо остановить отправку данных и перенаправить на другую страницу....

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru