Я работаю над созданием интерактивной карты и в небольшом дорожном блоке. То, что мне нужно, основано на том, какой элемент щелкнул в SVG img, окно подсказки должно появиться с информацией об этом конкретном отмеченном месте.Привязать событие щелчка к встроенному элементу SVG с внешним JS
Прямо сейчас, хотя я даже не могу получить какой-либо из маркеров, чтобы ответить на событие click. Ниже приведен код, с которым я работаю. Как только событие click на самом деле отвечает, я отключусь и запустится. Я просто зациклился на том, почему этот клик не отвечает (и в результате получается очень расстроенным).
Я прочитал этот пост SO в надежде понять, почему ответы на клик не происходят: Include SVG files with HTML, and still be able to apply styles to them?, а также несколько других без разрешения, применимых к этому сценарию. SVG настроен правильно, событие hover, установленное CSS, происходит, это просто событие клика, которое не происходит. Любая помощь будет оценена!
HTML:
<!DOCTYPE HTML>
<html>
<head>
<title>TITLE</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
<link rel="stylesheet" href="{$url}/css/style.css">
<link rel="shortcut icon" href="{$url}/favicon.ico" type="image/x-icon">
<link rel="icon" href="{$url}/favicon.ico" type="image/x-icon">
</head>
<body>
<img src="{$url}/images/3d-map.svg" id="3d-map" class="svg">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
<script src="{$url}/js/scripts.js"></script>
</body>
</html>
JQuery:
$(document).ready(function(){
/*
* Replace all SVG images with inline SVG
*/
$('img.svg').each(function(){
var $img = $(this);
var imgID = $img.attr('id');
var imgClass = $img.attr('class');
var imgURL = $img.attr('src');
$.get(imgURL, function(data) {
// Get the SVG tag, ignore the rest
var $svg = $(data).find('svg');
// Add replaced image's ID to the new SVG
if(typeof imgID !== 'undefined') {
$svg = $svg.attr('id', imgID);
}
// Add replaced image's classes to the new SVG
if(typeof imgClass !== 'undefined') {
$svg = $svg.attr('class', imgClass+' replaced-svg');
}
// Remove any invalid XML tags as per http://validator.w3.org
$svg = $svg.removeAttr('xmlns:a');
// Replace image with new SVG
$img.replaceWith($svg);
}, 'xml');
});
});
$(window).load(function(){
$(".exchange-marker").bind('click', function(e){
console.log('clicked');
console.log($(this).attr('id'));
});
});
УС:
.exchange-marker:hover{
stroke: #fabf23;
stroke-width: 3;
transition: all 0.3s;
}
SVG (усечены для краткости):
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1400" height="1200" viewBox="0 0 1400 1200">
<g id="markers" fill="#2876BC">
<ellipse id="exchange-1" class="exchange-marker" cx="963.8" cy="853.7" rx="14.9" ry="4.8"/>
<ellipse id="exchange-2" class="exchange-marker" cx="929.3" cy="833.1" rx="14.9" ry="4.8"/>
</g>
</svg>
Привет Том, как правило, если прямой очевидный подход не работает, иногда приходится вручную добавить «контролируемый» слой сложности к нему так, вы знаете, что он должен работать , Я имею в виду добавить маску слоя во всю область SVG. Затем используйте математику, чтобы определить, где указатель относится к маске на «вершине» и «svg» внизу. Если математика вернёт true, запустите необходимое событие. Как я уже сказал, путь более раздутый и сложный, но конечный результат гарантирован. Если вы предоставите нам песочницу для игры, я могу показать вам, что я имею в виду более подробно. –
Спасибо, Александр, я считаю, что понимаю, о чем вы говорите. Вид похож на то, как мы использовали карты изображений в HTML 4.01 дней, правильно? Я думаю, что это хороший толчок в правильном направлении. Если в ближайшие пять минут у меня не получится двигаться, я подниму jsfiddle. Еще раз спасибо! – TomJ
Да, я верю, что это то, что было использовано тогда. Поскольку мы говорим о разных технологиях для решения этой задачи, рассмотрели ли вы большую полезность '