• SVG的内部事件添加


    SVG的内部事件添加:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%
        String path = request.getContextPath();
        String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
                + path + "/";
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <base href="<%=basePath%>">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Title</title>
    </head>
    <body>
        <div>
            <svg width="440px" height="240px" xmlns="http://www.w3.org/2000/svg">
        <rect id="rectangle" x=10 y=20 width=30 height=40 style="stroke:gray;fill:#ff9;stroke-3" />
        <text id="output" x=10 y=80 style="font-size:9pt"></text>
        <!-- 
            SVG脚本控制
            获取元素:
            document.getElementById(idStr);
            document.getElementsByTagName(tagName);
            元素设置属性:
            element.getAttribute(attr);
            element.setAttribute(name,attr);
            element.removeAttribute(name);
            元素设置style:
            element.style.getPropertyValue(proName);
            element.style.setPropertyValue(proName,value,priority[null/important]);
            element.style.removeProperty(proName);
            一次性设置style属性:
            element.style.cssText,
            文本内容:
            element.textContent;
         -->
        <script type="application/ecmascript">
            //<![CDATA[
                var txt = document.getElementById('output');
                var r = document.getElementById('rectangle');
                var msg = r.getAttribute('x')+', '+r.getAttribute('y')+' '+
                        r.style.getPropertyValue('stroke')+' '+
                        r.style.getPropertyValue('fill');
                r.setAttribute('height','30');
                txt.textContent = msg;
            //]]>
        </script>
    </svg>
        </div>
        <div>
            <svg width="440px" height="240px" xmlns="http://www.w3.org/2000/svg">
        <circle id='circle' cx=50 cy=50 r=20 style="fill:#ff9;stroke:black;stroke-1" />
        <script type="application/ecmascript">
            //<![CDATA[
                function grow(evt){
                    var obj = evt.target;
                    obj.setAttribute('r','30');
                }
                function shrink(evt){
                    this.setAttribute('r','20');
                }
                function reStroke(evt){
                    var w = evt.target.style.getPropertyValue('stroke-width');
                    w = 4-parseFloat(w);
                    evt.target.style.setProperty('stroke-width',w,null);
                }
                var c = document.getElementById('circle');
                c.addEventListener('mouseover',grow);
                c.addEventListener('mouseout',shrink);
                c.addEventListener('click',reStroke);
            //]]>
        </script>
    </svg>
        </div>
        <div>
        <svg width="400px" height="250px" id='svg03' xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://wwww.w3.org/1999/xlink" onload="init(evt)">
        <defs>
        <style type="text/css">
        <![CDATA[
        svg {
            stroke:black;
            fill:white;
        }
        g.selected rect {
            fill: #ffc;
        }
        text {
            stroke: none;
            fill: black;
            text-anchor: middle;
        }
        line.slider {
            stroke: gray;
            stroke-width: 2;
        }
        ]]>
        </style>
        <!-- 这样的事件在chrome中竟然无法使用断点来调试; -->
        <script type="application/ecmascript">
            <![CDATA[
                // 选中的序号
                var scaleChoice = 1;
                // 选中放大的比例
                var scaleFactor = [1.25,1.5,1.75];
                // 颜色滑块选择的序号,-1表示没有选择;
                var slideChoice = -1;
                var rgb = [100,100,100];
                // 初始化事件
                function init(evt){
                    var obj;
                    for(var i=0;i<3;i++){
                        obj = document.getElementById('scale'+i);
                        obj.addEventListener('click',clickButton,false);
                        obj = document.getElementById('sliderGroup'+i);
                        obj.addEventListener('mousedown',startColorDrag,false);
                        obj.addEventListener('mousemove',doColorDrag,false);
                        obj.addEventListener('mouseup',endColorDrag,false);
                    }
                    transformShirt();
                    // 添加鼠标放开事件监控,这样在整个svg范围内鼠标放开都可以停止拖动;
                    document.getElementById('eventCatcher').addEventListener('mouseup',endColorDrag,false);
                }
                // 开始颜色拖动
                function startColorDrag(evt){
                    var sliderId = evt.target.parentNode.getAttribute('id');
                    endColorDrag(evt);
                    slideChoice = parseInt(sliderId[sliderId.length-1]);
                }
                // 结束颜色拖动
                function endColorDrag(evt){
                    slideChoice = -1;
                }
                // 进行颜色拖动
                function doColorDrag(evt){
                    var sliderId = evt.target.parentNode.getAttribute('id');
                    chosen = parseInt(sliderId[sliderId.length -1 ]);
                    if(slideChoice >=0 && slideChoice == chosen){
                        var obj = evt.target;
                        // 此处坐标的选择会有问题;当窗口不是最大化的时候,不能进行拖动了;
                        // 需要减去的是svg对象离浏览器顶端的距离;需要进行计算;
                        var s03 = document.getElementById('svg03');
                        console.log(s03.offsetTop);//这个始终是494
                        console.log(evt.clientY);// 这个开始是390多;
                        var pos = evt.clientY - 397;
                        console.log(pos);
                        if(pos <0){
                            pos = 0;
                        }
                        if(pos > 100){
                            pos = 100;
                        }
                        obj = document.getElementById('slide'+slideChoice);
                        obj.setAttribute('y1',pos);
                        obj.setAttribute('y2',pos);
                        rgb[slideChoice] = 100 -pos;
                        var colorStr = 'rgb('+rgb[0]+'%,'+rgb[1]+'%,'+rgb[2]+'%)';
                        console.log(colorStr);
                        obj = document.getElementById('shirt');
                        obj.style.setProperty('fill',colorStr,null);
                    }
                }
                // 衣服型号按钮点击事件
                function clickButton(evt){
                    var choice = evt.target.parentNode;
                    var name = choice.getAttribute('id');
                    var old = document.getElementById('scale'+scaleChoice);
                    old.removeAttribute('class');
                    choice.setAttribute('class','selected');
                    scaleChoice = parseInt(name[name.length-1]);
                    transformShirt();
                }
                // 衣服变换事件
                function transformShirt(){
                    var factor = scaleFactor[scaleChoice];
                    var obj = document.getElementById('shirt');
                    obj.setAttribute('transform','translate(150,150) scale('+factor+')');
                    obj.setAttribute('stroke-width',1/factor);
                }
            ]]>
        </script>
        <path id="shirt-outline" d="M-6-30-32-19-25.5-13-22-14-22,30,23,30,23-14,26.5-13,33-19,7-30A6.5,6,0,0,1-6-30" />
        </defs>
        <rect id="eventCatcher" x=0 y=0 width=400 height=300 style="fill:none" pointer-events="visible"/>
        <g id="sliderGroup0" transform="translate(230,10)">
            <rect x=-10 y=-5 width=40 height=110 />
            <rect x=5 y=0 width=10 height=100 style='fill:red' />
            <line id="slide0" class="slider" x1=0 y1=0 x2=20 y2=0 />
        </g>
        <g id="sliderGroup1" transform="translate(280,10)">
            <rect x=-10 y=-5 width=40 height=110 />
            <rect x=5 y=0 width=10 height=100 style='fill:green' />
            <line id="slide1" class="slider" x1=0 y1=0 x2=20 y2=0 />
        </g>
        <g id="sliderGroup2" transform="translate(330,10)">
            <rect x=-10 y=-5 width=40 height=110 />
            <rect x=5 y=0 width=10 height=100 style='fill:blue' />
            <line id="slide2" class="slider" x1=0 y1=0 x2=20 y2=0 />
        </g>
        <g id="shirt">
            <use xlink:href="#shirt-outline" x=0 y=0 />
        </g>
        <g id="scale0">
            <rect x=100 y=10 width=30 height=30 />
            <text x=115 y=30>S</text>
        </g>
        <g id="scale1" class='selected'>
            <rect x=140 y=10 width=30 height=30 />
            <text x=155 y=30>M</text>
        </g>
        <g id="scale2">
            <rect x=180 y=10 width=30 height=30 />
            <text x=195 y=30>L</text>
        </g>
        </svg>
        </div>
    </body>
    </html>
  • 相关阅读:
    JS判断单选框是否选中
    Js判断是否有属性
    判断是否有焦点
    Js 替代
    Js解析json
    回车事件
    js解析XML
    Linux常用基础(三)
    Linux常用基础(二)
    Linux常用基础(一)
  • 原文地址:https://www.cnblogs.com/stono/p/5105332.html
Copyright © 2020-2023  润新知