Хобрук: Ваш путь к мастерству в программировании

Захват событий мыши на элементе SVG в объекте, а также на его родительском контейнере div

Я столкнулся со странной проблемой с загруженным файлом SVG в HTML. Я привязываю события щелчка к определенным элементам в файле SVG, и это работает нормально. Но мне также нужно прикрепить события мыши и касания к родительскому div. Кажется, что объект SVG фиксирует события мыши, и поэтому они не передаются родительскому div. Итак, я пытаюсь установить для события указателя на SVG значение none. В этом случае родительский элемент div получает события мыши, но теперь дочерний элемент SVG больше не получает события мыши. Я пытаюсь установить дочерний элемент svg на события указателя: все, но все равно не получает события мыши. Что я здесь делаю неправильно?

Вот как я встраиваю файл SVG:

 <div
  id="map"
  ng-pinchable
  scale-factor="2"
  max-zoom="2"
 >
   <object data="./media/map.svg" type="image/svg+xml"
     id="mapsvg" width="100%" height="100%"></object>
</div>

Вот как я добавляю события в элемент SVG через JS:

//add event listeners to stations
                var el = $scope.svgDoc.getElementById("station-test");
      el.style.pointerEvents = "all";
                el.addEventListener("mouseup",
                        function(){
                            $scope.stationClicked("some id");
                        }
                    );
      }, false);

И здесь я добавляю события в родительский div "map", который содержит объект SVG:

 el.addEventListener("click", function(){ console.log("Hello World!"); });
 el.addEventListener("mousedown", function(){ console.log("mousedown"); });

Заранее спасибо!


  • getElementById(station-test) Я не вижу элемент с идентификатором «station-test». Просьба уточнить. 19.01.2021

Ответы:


1

Хорошо, пока я не мог понять, почему элементы SVG не получают события щелчка, поэтому я просто сделал функцию JS, которая выполняет итерацию по всем дочерним элементам и сравнивает положение мыши с ограничивающим прямоугольником объекта SVG, по существу воссоздавая поведение щелчка, как я ожидал, что это сработает.

$scope.onClickMap = function(event){
  console.log("on click map");
  var markers = $scope.svgDoc.querySelectorAll('*[id^="station"]');
  for(i=0;i<markers.length;i++){
    console.log("found markers: ",markers[i]);
    var rect = markers[i].getBoundingClientRect();
    if(event.offsetX > rect.left)
      if(event.offsetX < rect.right)
        if(event.offsetY > rect.top)
          if(event.offsetY < rect.bottom)
            $scope.stationClicked("some id");
  }

Так что теперь это работает для меня, но мне было бы любопытно услышать, почему события кликов не запускаются/пузырятся, как ожидалось, если у кого-нибудь есть идея лучшего способа сделать это. Спасибо.

07.10.2016
  • Вы пытались вставить код svg в html напрямую в элемент ‹svg›? Это часто решает много проблем, подобных этому. 10.10.2016
  • @AliSomay Я думал об этом, но я бы предпочел не делать этого, так как я хочу иметь возможность продолжать редактирование файла SVG без необходимости копировать и вставлять код каждый раз, когда я вношу изменения. Хотя я понимаю, что мог бы также создать задачу grunt/gulp для такого рода вещей, возникает вопрос, каков наиболее эффективный способ решения проблемы? В моем случае я уже заработал с помощью метода, описанного выше. Однако спасибо за ваше предложение. 10.10.2016
  • Новые материалы

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..