Javascript-форум (https://javascript.ru/forum/)
-   (X)HTML/CSS (https://javascript.ru/forum/xhtml-html-css/)
-   -   Обработка события щелчка мыши на строке таблицы (https://javascript.ru/forum/xhtml-html-css/77552-obrabotka-sobytiya-shhelchka-myshi-na-stroke-tablicy.html)

Vladiiimir 18.05.2019 21:57

Обработка события щелчка мыши на строке таблицы
 
Здравствуйте!

Подскажите пожалуйста как мне обработать событие щелчок мыши на строке таблицы, если у мне заранее не известно сколько строк в данной таблице будет?

У меня есть JSP-файл, в котором в <table> подтягиваются данные из базы данных, количество записей заранее не известно. Нужно чтобы при щелчке мыши на строку бралось значение ячейки (geographkoords) из этой ячейки и передавалось в функцию (UpdateGoogleMap).

<html>
<head>
    <title>Главная страница</title>
    <style>
        /* Always set the map height explicitly to define the size of the div
       * element that contains the map. */
        #map {
            height: 50%;
        }
        /* Optional: Makes the sample page fill the window. */
        html, body {
            height: 100%;
        }
    </style>
    <script>
        var map, marker;
        function initMap() {
            map = new google.maps.Map(document.getElementById('map'), {
                center: new google.maps.LatLng(51.754207,55.106578),
                zoom: 8
            });
        }

        function UpdateGoogleMap(latitude, longitude) {
            latitude = (latitude && +latitude)||51.754207;
            longitude = (longitude && +longitude)||55.106578;
            map.setCenter({
                lat: latitude,
                lng: longitude
            });
            marker && marker.setMap(null);
            marker=new google.maps.marker({
                position: {
                    lat: latitude,
                    lng: longitude
                },
                map: map,
                title: 'Это здесь'
            });
        };
    </script>
    <!-- -->
    <script src="https://maps.googleapis.com/maps/api/js?key=ххх&callback=initMap"
            async defer></script>
</head>

<body>
 <div>
    <table>
        <thead>
        <tr>
            <th>idPost</th>
            <th>namePost</th>
            <th>distanceBeetwenSensors</th>
            <th>geographkoords</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${listPosts}" var="post">
            <tr>
                <td>${post.idPost}</td>
                <td>${post.namePost}</td>
                <td>${post.distanceBeetwenSensors}</td>
                <td>${post.geographkoords}</td>
            </tr>
        </c:forEach>
        </tbody>
    </table>

 </div>
 <div id="map"></div>

</body>
</html>

рони 18.05.2019 22:26

addEventListener("click", ({target}) => {
	var tr = target.closest("tbody > tr");
	if(!tr) return;
    var position = tr.querySelector("td:last-child").textContent;
    alert(position)
});

Vladiiimir 18.05.2019 23:42

рони,
Спасибо!
А куда этот слушатель нужно вешать?

рони 19.05.2019 00:10

Цитата:

Сообщение от Vladiiimir
А куда этот слушатель нужно вешать?

никуда, он уже где нужно. ваша задача сделать строку 5, так как только, вы знаите, что в ней находится.

Vladiiimir 19.05.2019 09:53

Цитата:

Сообщение от рони (Сообщение 507957)
никуда, он уже где нужно. ваша задача сделать строку 5, так как только, вы знаите, что в ней находится.

А зачем делать 5-ю строку?

рони 19.05.2019 10:05

Цитата:

Сообщение от Vladiiimir
А зачем делать 5-ю строку?

Цитата:

Сообщение от Vladiiimir
Нужно чтобы при щелчке мыши на строку бралось значение ячейки (geographkoords) из этой ячейки сделано и передавалось в функцию (UpdateGoogleMap). нужно доделать, но нет данных от вас

:-?

Vladiiimir 19.05.2019 10:12

Цитата:

Сообщение от рони (Сообщение 507973)
:-?

Какие данные нужны?

Vladiiimir 19.05.2019 10:18

Цитата:

Сообщение от рони (Сообщение 507957)
никуда, он уже где нужно. ваша задача сделать строку 5, так как только, вы знаите, что в ней находится.

А, вы имели в виду изменить пятую строку в написанной вами функции?

Там мы должны вызвать функцию UpdateGoogleMap и передать в неё данные из ячейки?

рони 19.05.2019 10:24

Цитата:

Сообщение от Vladiiimir
Там мы должны вызвать функцию UpdateGoogleMap и передать в неё данные из ячейки?

да, осталось только получить формат данных от вас.

рони 19.05.2019 10:38

Цитата:

Сообщение от Vladiiimir
<td>${post.geographkoords}</td>

как это выглядит?

Vladiiimir 19.05.2019 10:39

Цитата:

Сообщение от рони (Сообщение 507976)
да, осталось только получить формат данных от вас.

Только до меня всё равно не доходит, где этот обработчик должен быть прописан?
Формат данных такой как указал здесь в примере:
<html>
<head>
    <title>Главная страница</title>
    <style>
        #map {
            height: 50%;
        }
        html, body {
            height: 100%;
        }
    </style>
    <script>
        var map, marker;
        function initMap() {
            map = new google.maps.Map(document.getElementById('map'), {
                center: new google.maps.LatLng(51.754207,55.106578),
                zoom: 8
            });
        }

        function UpdateGoogleMap(latitude, longitude) {
            latitude = (latitude && +latitude)||51.754207;
            longitude = (longitude && +longitude)||55.106578;
            map.setCenter({
                lat: latitude,
                lng: longitude
            });
            marker && marker.setMap(null);
            marker=new google.maps.marker({
                position: {
                    lat: latitude,
                    lng: longitude
                },
                map: map,
                title: 'Это здесь'
            });
        };
    </script>
    <!-- -->
    <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCWH__g2XMzhes7PIk-8v2MbBSZTgMnBSg&callback=initMap"
            async defer></script>
</head>

<body>
<div>
    <table>
        <thead>
        <tr>
            <th>idPost</th>
            <th>namePost</th>
            <th>distanceBeetwenSensors</th>
            <th>geographkoords</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${listPosts}" var="post">
            <tr>
                <td>1</td>
                <td>г.Самара</td>
                <td>2</td>
                <td>55.09 52.07</td>
            </tr>
        </c:forEach>
        </tbody>
    </table>

</div>
<div id="map"></div>

</body>
</html>

рони 19.05.2019 10:43

Vladiiimir,
ждите...

рони 19.05.2019 10:57

Vladiiimir,
проверьте
<script>
        var map, marker;
        function initMap() {
            map = new google.maps.Map(document.getElementById('map'), {
                center: new google.maps.LatLng(51.754207,55.106578),
                zoom: 8
            });
        }

        function UpdateGoogleMap(latitude, longitude) {
            latitude = (latitude && +latitude)||51.754207;
            longitude = (longitude && +longitude)||55.106578;
            map.setCenter({
                lat: latitude,
                lng: longitude
            });
            marker && marker.setMap(null);
            marker=new google.maps.Marker({
                position: {
                    lat: latitude,
                    lng: longitude
                },
                map: map,
                title: 'Это здесь'
            });
        };

    addEventListener("click", ({target}) => {
    var tr = target.closest("tbody > tr");
    if(!tr) return;
    var position = tr.querySelector("td:last-child").textContent;
    position = position.split(/\s+/).map(Number);
    UpdateGoogleMap(...position)
    });

    </script>

рони 19.05.2019 11:38

Цитата:

Сообщение от Vladiiimir
marker=new google.maps.marker({

new google.maps.Marker

Vladiiimir 19.05.2019 14:32

Цитата:

Сообщение от рони (Сообщение 507982)
Vladiiimir,
проверьте

Слушатель срабатывает, но судя по отладчику googlehrome в функцию UpdateGoogleMap передаётся пустое значение (переменная position)https://drive.google.com/open?id=1BH...9x9Fp_m_HWaLOD

Можете прокомментировать, что значит переменная target?
Что мы делаем в строках:
var position = tr.querySelector("td:last-child").textContent;
        position = position.split(/\s+/).map(Number);

рони 19.05.2019 14:40

Vladiiimir,
вы поменяли расположение ячейки с данными!!!
сделайте ячейке класс например <td class="geo">55.09 52.07</td>
и тогда
var position = tr.querySelector("td.geo").textContent;

рони 19.05.2019 14:44

Vladiiimir,
или так
var position = tr.querySelector("td:nth-child(4)").textContent;

Vladiiimir 19.05.2019 15:05

Цитата:

Сообщение от рони (Сообщение 507990)
Vladiiimir,
вы поменяли расположение ячейки с данными!!!
сделайте ячейке класс например <td class="geo">55.09 52.07</td>
и тогда
var position = tr.querySelector("td.geo").textContent;

Работает! Громадная благодарность!

А можно вот как мы сделали привязку к ячейке <td class="geo">55.09 52.07</td>, аналогично сделать привязку слушателя к таблице?

рони 19.05.2019 15:09

Цитата:

Сообщение от Vladiiimir
А можно вот как мы сделали привязку к ячейке <td class="geo">55.09 52.07</td>, аналогично сделать привязку слушателя к таблице?

не понимаю вопроса, можно подробнее?

Vladiiimir 19.05.2019 15:12

Цитата:

Сообщение от рони (Сообщение 507994)
не понимаю вопроса, можно подробнее?

Если у меня на странице добавится ещё одна таблица, то этот слушатель ведь будет реагировать и на щелчки по 2-ой таблицы?

рони 19.05.2019 15:41

Vladiiimir,
document.querySelector('table.класс_нужной_таблицы').
    addEventListener("click", ({target})

Vladiiimir 19.05.2019 16:13

Цитата:

Сообщение от рони (Сообщение 507997)
Vladiiimir,
document.querySelector('table.класс_нужной_таблицы').
    addEventListener("click", ({target})

Ещё раз спасибо большое! Очень помогли.

Странная политика на сайте - нельзя поставить 2-ой "+" человеку пока не поставишь кому-нибудь другому )


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