Показать сообщение отдельно
  #1 (permalink)  
Старый 17.01.2022, 19:50
Новичок на форуме
Отправить личное сообщение для Ivanizukhty Посмотреть профиль Найти все сообщения от Ivanizukhty
 
Регистрация: 17.01.2022
Сообщений: 2

Отображение нескольких областей на интерактивной карте (SVG, HTML, CSS, JS)
Приветствую. Сразу сообщу, что я - дилетант в области JS.
Есть интерактивная карта SVG на HTML-странице. Так же присутствует таблица. При наведении на определенную строку, она подсвечивается определенным цветом, этим же цветом подсвечивается и область на карте, которая соответствует строке в таблице. Скрипт работает только по принципу: одна строка - одна область.

Задача. Необходимо сделать так, что бы при наведении на строку могли подсвечиваться несколько областей на карте.

Скрипт:
<script type="text/javascript">
    // Определим свои функции добавления/удаления класса, так как те, что в jQuery не работают для SVG
    jQuery.fn.myAddClass = function (classTitle) {
      return this.each(function() {
        var oldClass = jQuery(this).attr("class");
        oldClass = oldClass ? oldClass : '';
        jQuery(this).attr("class", (oldClass+" "+classTitle).trim());
      });
    }
    jQuery.fn.myRemoveClass = function (classTitle) {
      return this.each(function() {
          var oldClass = jQuery(this).attr("class");
          var startpos = oldClass.indexOf(classTitle);
          var endpos = startpos + classTitle.length;
          var newClass = oldClass.substring(0, startpos).trim() + " " + oldClass.substring(endpos).trim();
          if (!newClass.trim())
            jQuery(this).removeAttr("class");
          else
            jQuery(this).attr("class", newClass.trim());
      });
    }

    // Логика взаимодействия карты и таблицы
    $(window).load(function () {
      // Получаем доступ к SVG DOM
      var svgobject = document.getElementById('imap');
      if ('contentDocument' in svgobject) {
        var svgdom = jQuery(svgobject.contentDocument);

        // Устанавливаем соответствующим фигурам на карте, соответствующие классы (по таблице)
        $("#data tr").each (function (index) {
          var id = $(this).attr("id").substring(1);
          var classes = $(this).attr("class");
          $("#map #r"+id, svgdom).myAddClass(classes);
        });

        // Подсвечиваем регион на карте при наведении мыши на соотв. строку таблицы.
        $("#data tr").hover(
          function () {
            var id = $(this).attr("id").substring(1);
            $("#map #r"+id, svgdom).myAddClass("highlight");
          },
          function () {
            var id = $(this).attr("id").substring(1);
            $("#map #r"+id, svgdom).myRemoveClass("highlight");
          }
        );

        // Подсвечиваем строку в таблице при наведении мыши на соотв. регион на карте
        $("#map polygon", svgdom).add($("#map circle", svgdom)).add($("#map path", svgdom)).hover(
          function () {
            var id = $(this).attr("id").substring(1);
            $("#data #d"+id).addClass("highlight");
          },
          function () {
            var id = $(this).attr("id").substring(1);
            $("#data #d"+id).removeClass("highlight");
          }
        );
      }
    });
  </script>


Таблица:
<table id="data">
  <tr id="d1" bgcolor="#000000">
    <td>1</td>
  </tr>
  <tr id="#">
    <td></td>
  </tr>
  <tr id="d2" class="orange">
    <td>2</td>
  </tr>
  <tr id="#" class="red">
    <td></td>
  </tr>
  <tr id="d3" class="purple">
    <td>3</td>
  </tr>
  <tr id="d4" class="green">
    <td>4</td>
  </tr>
  <tr id="d5" class="orange">
    <td>1+2</td>
  </tr>
  <tr id="d6" class="red">
    <td>2+4</td>
  </tr>
  <tr id="d7" class="orange">
    <td>1+2+3+4</td>
  </tr>
</table>



Карта svg:
<path id="r1" d="m 184.31777,877.17469 -7.88283,-6.20564 v -35.89204 l 27.00289,-1.17404 36.56292,3.18668 0.67088,7.37967 -3.18668,9.05687 4.69616,21.46814 -47.46471,3.52211z"></path>
<path id="r2" d="m 245.18111,874.99433 8.10732,28.23148 -16.36623,11.14801 -27.98861,24.43074 -21.34725,-9.96205 -5.6926,-5.21822 -2.60911,-10.19924 -3.32068,-4.50664 5.6926,-11.85959 1.66034,-10.19924 3.79506,-4.03225 0.20582,-5.65264 10.39863,1.34175 z"></path>
<path id="r3" d="m 182.31777,877.17469 -0.20582,5.65264 -3.79506,4.03225 -1.66034,10.19924 -5.6926,11.85959 -6.08904,-0.54784 -9.89547,9.05687 -6.87652,-0.33544 -14.25618,3.3544 -3.3544,-19.79094 11.06951,-15.2625 15.43023,1.67719 14.4239,-8.05055 z"></path>
<path id="r4" d="m 185.31777,877.17469 -10.90179,1.84491 -14.4239,8.05055 -15.43023,-1.67719 -7.21195,-6.37336 -22.8099,-8.38599 10.06319,-6.54107 11.74039,-1.50948 3.18668,-4.02528 0.67088,-4.52843 24.99025,-25.66113 12.24355,6.70879 v 35.89204 z"></path>


Все завязано на уникальный id. Понимаю, что надо привязаться к классам, но не понимаю как это сделать.

Заранее благодарен за помощь!
Изображения:
Тип файла: jpg Untitled-4.jpg (111.2 Кб, 5 просмотров)
Ответить с цитированием