J'ai trouvé cet exemple dans un tutoriel SVG, qui explique comment utiliser un gestionnaire d'événements onclick pour un élément svg. Cela ressemble au code ci-dessous:
<svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='600' width='820'>
<script type="text/ecmascript"><![CDATA[
function changerect(evt)
{
var svgobj=evt.target;
svgstyle = svgobj.getStyle();
svgstyle.setProperty ('opacity', 0.3);
svgobj.setAttribute ('x', 300);
}
]]>
</script>
<rect onclick='changerect(evt)' style='fill:blue;opacity:1' x='10' y='30' width='100'
height='100' />
</svg>
Cependant, cela ne semble pas fonctionner. Rien ne se passe lorsque je clique sur l'élément.
Peut-être qu'il est important de mentionner le fait que j'affiche le svg depuis l'intérieur d'un script php, en utilisant echo . De plus, le contenu généré par le script php est importé dans la page avec AJAX et:
XMLHttpRequest()
Cela pourrait-il avoir quelque chose à voir avec cela? Merci beaucoup pour toute aide.
Il semble que tout le javascript doit être inclus à l'intérieur du svg pour qu'il s'exécute. Je suis incapable de faire référence à une fonction externe, ou des bibliothèques. Cela signifiait que votre code était cassé à svgstyle = svgobj.getStyle();
Cela fera ce que vous essayez.
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='600' width='820'>
<script type="text/ecmascript"><![CDATA[
function changerect(evt) {
var svgobj=evt.target;
svgobj.style.opacity= 0.3;
svgobj.setAttribute ('x', 300);
}
]]>
</script>
<rect onclick='changerect(evt)' style='fill:blue;opacity:1' x='10' y='30' width='100'height='100' />
</svg>
var XMAX = 500;
var YMAX = 500;
var _xx=10;
var _reg=100;
var _l=10;
// Create PATH element
for(var x=1;x<20;x++)
{
var pathEl = document.createElementNS("http://www.w3.org/2000/svg", "path");
pathEl.setAttribute('d','M'+_l+' 100 Q 100 300 '+_l+' 500' );
pathEl.style.stroke = 'rgb('+(_reg)+',0,0)';
pathEl.style.strokeWidth = '5';
pathEl.style.fill = 'none';
$(pathEl).mousemove(function(evt){$(this).css({"strokeWidth":"3","stroke":"#ff7200"}).hide(100).show(500).css({"stroke":"#51c000"})});
$('#mySvg').append(pathEl);
_l+=50;
}
Assurez-vous d’ajouter className/id
à <use>
; ou d'utiliser le chemin/élément SVG également si vous détectez en dehors de la portée du script SVG:
<svg rel='-1' class='**ux-year-prev**' width="15px" height="15px" style="border:0px solid"><use class='**ux-year-prev**' xlink:href="#svg-arrow-left"></use></svg>
Si vous n'avez pas besoin de cliquer sur des parties spécifiques du svg, cela pourrait être une solution possible:
Placez une div au-dessus et ajoutez des événements à cette div. z-index n'est pas nécessaire si l'élément svg est avant la balise div dans la structure html.
HTML
<div class='parent'>
<div class='parent-events'></div>
<div class='my-svg'><svg></svg></div>
</div>
CSS
.parent {
position: relative;
}
.my-svg {
position: relative;
z-index: 0;
}
.parent-events {
position: absolute;
width: 100%;
height: 100%;
z-index: 1
}
Javascript
const eventArea = document.querySelector('.parent-events');
eventArea.addEventListeners('click', () => {
console.log('clicked');
});
Je suggérerais cette méthode de onclick
gestionnaire d’événements pour un élément svg:
var svgobj = parent_svg.find('svg')[0].children;
for (i = 0; i < svgobj.length; i++) {
element = svgobj[i];
element.style = "cursor: pointer;";
$(element).click(function(evt){console.log($(this))});
}
Vérifiez d'abord si votre svgobj
est passée à console.log
lorsqu’il reçoit un gestionnaire d’événements onclick
À partir de ce moment, vous pouvez passer à n'importe quelle fonction pour gérer l'élément.
Vous pouvez voir comment cela fonctionne sur un échantillon ici:
https://jsfiddle.net/chetabahana/f7ejxhnk/20/
Note sur l'utilisation de cet exemple:
- Modifier l’état du diagramme SVG en option Printed,
- Cliquez sur l’un des éléments puis sur la sortie dans votre console.