在SVG元素中单击On需要初始两次点击

时间:2015-09-24 03:11:01

标签: javascript svg onclick

我有一个有四个象限的svg imagemap。当单击每个象限时,应该改变覆盖灰度基本图像的矩形的不透明度。再次点击时,不透明度会回到0.效果很好,但每个象限需要两次点击才能完成任务。

我已经看到很多关于使用JQuery的建议,但我的理解是JQuery没有在svg中注册onxlicks,这是xml。

以下是代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
    <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1200 808" >
    <image width="290" height="290" xlink:href="../includes-jar-code/_images/SquareTestGray.png">
    </image>
    <!--<a xlink:href="//jarea.com/yellow">-->
        <rect onclick="top.notify(evt)" id="svgYellow" x="0" y="0" fill="#FFFF00" opacity="0" width="145" height="145" />       
        <text x="72" y="72" fill="red">Y</text>
    <!--</a>-->
    <!--<a xlink:href="//jarea.com/pink">-->
        <rect onclick="top.notify(evt)" id="svgPink" x="0" y="146" fill="#FF00FF" opacity="0" width="145" height="145" />
        <text x="72" y="218" fill="red">P</text>
    <!--</a>-->
    <!--<a xlink:href="//jarea.com/blue">-->
        <rect onclick="top.notify(evt)" id="svgBlue" x="146" y="0" fill="#0000FF" opacity="0" width="145" height="145" />
        <text x="218" y="72" fill="red">B</text>
    <!--</a>-->
    <!--<a xlink:href="//jarea.com/green">-->
        <rect onclick="top.notify(evt)" id="svgGreen" x="146" y="146" fill="#008000" opacity="0" width="145" height="145" />
        <text x="218" y="218" fill="red">G</text>
    <!--</a>-->
</svg>

<script>

function notify(evt){

    if( document.getElementById(evt.target.id).style.opacity == "0" ) {
        document.getElementById(evt.target.id).style.opacity = ".25";
    } else {
        document.getElementById(evt.target.id).style.opacity = "0";
    }
}   

</script>

</body>
</html>

没有足够的声誉来发布背景图片。它是一个290 x 290像素的灰度方块,均匀分为4个象限。

非常感谢您的见解和建议。

1 个答案:

答案 0 :(得分:0)

那是因为您在元素上设置了opacity属性,但是您读取了initialy为空的不透明度样式属性。您可以在元素上设置样式而不是属性:

HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
    map.put("2015/07/15", list);
    map.put("2015/07/17", list1);
    map.put("2015/07/16", list1);

    ArrayList<String> keyset = new ArrayList<String>(map.keySet());
    Collections.sort(keyset);
function notify(evt){

    if( document.getElementById(evt.target.id).style.opacity == "0" ) {
        document.getElementById(evt.target.id).style.opacity = ".25";
    } else {
        document.getElementById(evt.target.id).style.opacity = "0";
    }
}

或者您可以从脚本中设置和读取属性值:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
    <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1200 808" >
    <rect x="0" y="0" width="290" height="290" fill="royalblue" stroke="#53c"></rect>
    <!--<a xlink:href="//jarea.com/yellow">-->
        <rect onclick="notify(evt)" id="svgYellow" x="0" y="0" fill="#FFFF00" style="opacity:0" width="145" height="145" />       
        <text x="72" y="72" fill="red">Y</text>
    <!--</a>-->
    <!--<a xlink:href="//jarea.com/pink">-->
        <rect onclick="notify(evt)" id="svgPink" x="0" y="146" fill="#FF00FF" style="opacity:0"  width="145" height="145" />
        <text x="72" y="218" fill="red">P</text>
    <!--</a>-->
    <!--<a xlink:href="//jarea.com/blue">-->
        <rect onclick="notify(evt)" id="svgBlue" x="146" y="0" fill="#0000FF" style="opacity:0"  width="145" height="145" />
        <text x="218" y="72" fill="red">B</text>
    <!--</a>-->
    <!--<a xlink:href="//jarea.com/green">-->
        <rect onclick="notify(evt)" id="svgGreen" x="146" y="146" fill="#008000" style="opacity:0"  width="145" height="145" />
        <text x="218" y="218" fill="red">G</text>
    <!--</a>-->
</svg>



</body>
</html>
function notify(evt){
    if(evt.target.getAttribute("opacity") == "0" ) {
        evt.target.setAttribute("opacity","0.25");
    } else {
        evt.target.setAttribute("opacity","0");
    }
}