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-width: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-width: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>
时间: 2024-10-20 16:49:49

SVG的内部事件添加的相关文章

为sharepoint的内部页面添加后台代码

我们知道,存储在数据库里的SharePoint页面是不能直接添加后台代码的,这给我们带来了很多的不方便,比如想要在页面上实现一些东西,都必 须使用Webpart或者自定义控件的方式,哪怕仅仅是很简单的几行后台代码.而WSS 3.0 是基于ASP.NET 2.0的,在ASP.NET站点里使用的任何技术在WSS站点里同样可以使用.因此我们同样可以给WSS站点的页面添加后台代码. 存储在数据库中的sharepoint页面分为两部门,母板页和内容页,我们可以为这两种页面分别添加后台代码.实现方式不一样,

[转]用CSS给SVG &lt;use&gt;的内容添加样式

来源:http://www.w3cplus.com/svg/styling-svg-use-content-css.html?utm_source=tuicool&utm_medium=referral --------------------------------------------------------------------------------------------------------------------- 一篇深入探究如何给SVG<use>元素的内容添加样

Delphi XE的RTTI增强,动态Hook某些内部事件

Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦.甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下: Delphi2010RTTI的增强 Delphi的Anymouse方法探秘 万一的Rtti系列 我这里的主要目的是挂钩某些内部私有事件,然后增加上一些自己的处理过程,这里我以TMenuItem的私有内部事件FOnChange作为例程. 这个私有事件在菜单内部绑定,我们平常状态下,在外部无法更改!但是XE之后这个问题不在

Ugui按钮事件添加方法

按钮事件添加方法3个例子 Eg1: using UnityEngine; using System.Collections; using UnityEngine.Events;//引用事件命名空间 using UnityEngine.UI;//引用UI命名空间 public class Test : MonoBehaviour { // Use this for initialization void Start () { //定义Action,并赋予delegate方法 UnityAction

Oracle数据块损坏篇之10231内部事件

实验:某个分区数据块损坏,不完全恢复此分区表数据背景:数据库没有有效备份,某个分区中有数据块损坏.要求:最大限度恢复此分区数据.环境:RHEL 6.4 + Oracle 11.2.0.4 1. 初始化实验环境 2. 模拟分区中有数据块损坏情景 3. 尝试使用Oracle内部事件10231进行不完全恢复 Reference 1. 初始化实验环境 初始化创建模拟实验环境用到的表空间.业务用户.表,并导入测试数据.本次实验用到表空间DBS_D_JINGYU, 业务用户JINGYU, 分区表T_PART

Extjs中给同一个GridPanel中的事件添加参数的方法

Extjs中给同一个GridPanel中的事件添加参数的方法: this.isUse = new Ext.Action({            text:'启用',            scope:this,            handler:this.isUseWin.createDelegate (this,[1])        });        this.isNotUse = new Ext.Action({            text:'停用',            

模拟C#的事件添加和删除

从<C# Via CLR>中的演化的一个小demo,探索事件的添加和删除原理,简单明了: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading; 6 using System.Threading.Tasks; 7 8 namespace ExpForEvent001 9 { 10 public sealed cl

iOS日历中给一个事件添加多个提醒

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) iOS自带的日历应用中,我们最多只能给一个事件设置2个提醒,但是通过代码,我们可以给事件设置任意多个提醒. 给事件设置提醒的代码可以看我写的这篇文章: iOS9中如何在日历App中创建一个任意时间之前开始的提醒(三) 设置多个提醒的方法与此类似,我们只要创建多个提醒,再添加它们到事件中就可以了: EKAlarm *alarm = [EKAlarm alarmW

Unity3D 新版NGUI事件添加

在新版的NGUI中,事件机制发生了变化,添加的事件的方式也与之前有所差别了. 我们来看看普通的控件事件: 1.不带参数的事件,例如UIButton,如下图所示: 在UIButton中,我们只需要拖动包含事件处理的脚本到OnClick上面,然后勾选处理事件的函数即可. 2.带参数的事件 在很多事件中,我们需要了解到某些参数的变化,来做一系列的操作的,例如UISlider,UIToggle等,如下图所示: 大家可以看到,在UIToggle和UISlider上的事件更改为On Value Change