2012-02-02 20 views
6

Mi secuencia de comandos dibuja líneas en la pantalla con un ancho de trazo de 3. El tamaño de las líneas es ideal (visualmente) pero no son muy fáciles de hacer clic.JavaScript y SVG: ¿cómo se aumenta el área seleccionable para un evento onClick?

Como ejemplo aproximado:

<html> 
<head> 
<script> 
function selectStrand(evt) { 
    current_id = evt.target.getAttributeNS(null, "id"); 

    document.getElementById('main').innerHTML = current_id; 
} 
</script> 
</head> 

<body> 
Selected line: <span id="main"></span> 

<?xml version="1.0"?> 
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100%" height="100%" preserveAspectRatio="xMinYMin meet" viewBox="0 0 1000 1000"> 
    <g id="buffer" transform="translate(10,0)"> 
     <line id="blue-blue" x1="50" y1="50" x2="500" y2="50" style="stroke:blue; stroke-width: 4;" stroke-linecap="round" onclick="selectStrand(evt)"/> 
     <line id="blue-orange" x1="50" y1="70" x2="500" y2="70" style="stroke:orange; stroke-width: 4;" stroke-linecap="round" onclick="selectStrand(evt)"/> 
     <line id="blue-green" x1="50" y1="90" x2="500" y2="90" style="stroke:green; stroke-width: 4;" stroke-linecap="round" onclick="selectStrand(evt)"/> 
     <line id="blue-brown" x1="50" y1="110" x2="500" y2="110" style="stroke:brown; stroke-width: 4;" stroke-linecap="round" onclick="selectStrand(evt)"/> 
     <line id="blue-grey" x1="50" y1="130" x2="500" y2="130" style="stroke:grey; stroke-width: 4;" stroke-linecap="round" onclick="selectStrand(evt)"/> 
     <line id="blue-khaki" x1="50" y1="150" x2="500" y2="150" style="stroke:khaki; stroke-width: 4;" stroke-linecap="round" onclick="selectStrand(evt)"/> 
     <line id="blue-red" x1="50" y1="170" x2="500" y2="170" style="stroke:red; stroke-width: 4;" stroke-linecap="round" onclick="selectStrand(evt)"/> 
     <line id="blue-black" x1="50" y1="190" x2="500" y2="190" style="stroke:black; stroke-width: 4;" stroke-linecap="round" onclick="selectStrand(evt)"/> 
     <line id="blue-yellow" x1="50" y1="210" x2="500" y2="210" style="stroke:yellow; stroke-width: 4;" stroke-linecap="round" onclick="selectStrand(evt)"/> 
     <line id="blue-purple" x1="50" y1="230" x2="500" y2="230" style="stroke:purple; stroke-width: 4;" stroke-linecap="round" onclick="selectStrand(evt)"/> 
     <line id="blue-pink" x1="50" y1="250" x2="500" y2="250" style="stroke:pink; stroke-width: 4;" stroke-linecap="round" onclick="selectStrand(evt)"/> 
     <line id="blue-cyan" x1="50" y1="270" x2="500" y2="270" style="stroke:cyan; stroke-width: 4;" stroke-linecap="round" onclick="selectStrand(evt)"/> 
    </g> 
    </g> 
</svg> 

</body> 
</html> 

¿Hay una manera sencilla de aumentar el área alrededor de cada una de las líneas para que sean más fáciles de hacer clic?

Respuesta

8

Para cada línea, intente dibujar una línea transparente en la parte superior de la misma con un ancho de trazo mayor, y establezca el onclick sobre eso.

+0

Ok genial, gracias. Eso funciona y parece que es la mejor manera. – renosis

+4

Es posible que desee agregar el detector de eventos de clic a la raíz o al grupo con id = buffer en su ejemplo, y observe el objetivo del evento para averiguar en qué línea se hizo clic. De esta forma, solo necesita un detector de eventos, en lugar de uno en cada elemento. Ah, y la parte '' no es necesaria cuando se incluye svg inline en html, se ignorará. –

+0

¡Ah, genial, gracias Erik! – renosis

0

Una variación de la respuesta anterior. Para un grupo de efectos de selección interesante, cada línea delgada y combo de línea transparente en un grupo con la línea delgada en la parte superior. Establezca el onclick en el grupo y luego anime la transparencia de la línea gruesa en su onclick.

+0

Ya, estaba considerando hacer algo llamativo con onClick una vez que descubrí la mecánica general ... parece una buena idea. ¡Gracias por el consejo! – renosis

Cuestiones relacionadas