`
rainsilence
  • 浏览: 160572 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(原)Html5之Svg对象的构造方法

阅读更多

S V G(可放缩的矢量图形)是W3C(World Wide Web ConSor—tium国际互联网标准组织)在2000年8月制定的一种新的二维矢量图形格式,也是规范中的网络矢量图形标准。

 

W3C是作为一个国际X的工业联盟而创建的, 目的是领导整个互联网协作的发展和创新, 以实现科技的进步和共同发展。由于W3C联盟关于SVG的开发工作组的成员都是一些知名厂商, 如Adobe、苹果、Aut0De sk、Bit Fla sh、Corel、惠普、IBM、ILOG、INSO、Macromedia、微软、Netscape、OASIS、Open Text、Quark、RAL(C C LRC)、S un、V i S i 0、施乐等,所以SVG不是一个私有格式,而是一个开放的标准。也就是说,它并不属于任何个体的专利,而是一个通过协作、共同开发的工业标准。正是因为这点,才使得SVG能够得到更迅速的开发和应用。

 

 

 

但是传统的svg只能通过<object>标签引入

 

<object type="image/svg+xml" data="****/data.svg" width="20px" height="20px"></object>

 

 

也就是说,要在画面上动态创建svg图像在这一标准上是很困难的。

 

翻阅了很多资料后,发现国外的framework中,针对data属性,做了些改进

将data:image/svg+xml,+svg标签内容后,也可以显示出svg图像。

这使得动态创建svg图像成为了可能

 

于是,我试着创建了以下类

 

(function() {
	
	var userAgent = navigator.userAgent;
	var isWebKit = /webkit/i.test(userAgent);
	
	SvgHelper = function(containerId, width, height) {
		
		this.container = document.getElementById(containerId);
		this.width = parseInt(width) + 'px';
		this.height = parseInt(height) + 'px';
		
		this.svg = '<?xml version="1.0" encoding="utf-8"?>'+
		   '<svg version="1.1" xmlns="http://www.w3.org/2000/svg" '+
		   'xmlns:xlink="http://www.w3.org/1999/xlink" width="' + 
		   this.width + '" height="' + this.height + '">';
	};
	
	SvgHelper.prototype = {
		
		/**
		 * 构造SVG
		 */
		getSvg: function() {
			
			if (this.svgObject) {
				return this.svgObject;
			}
			
			this.svgObject = createElement('object', { 
				width: this.width,
				height: this.height,
				type: 'image/svg+xml'
			}, {
				position : "ABSOLUTE",
				left: 0,
				top: 0
			}, this.container);
		},
		
		/**
		 * 测试函数
		 */
		drawCircle: function() {
			this.getSvg();
			this.svg += "<rect x=\"0\" y=\"0\" rx=\"5\" ry=\"5\" width=\"50\" height=\"50\" fill=\"green\" stroke=\"red\"/>";
		},
		
		/**
		 * 重绘
		 */
		repaint: function() {
			var svgObject = this.getSvg();
			svgObject.data = 'data:image/svg+xml,'+ this.svg +'</svg>';
			
			if (isWebKit) this.container.appendChild(svgObject);
		}
		
	};
	
	function createElement(tagName, tagProp, tagStyle, container) {

		var tagElement = document.createElement(tagName);

		if (tagProp) {
			for (var prop in tagProp) {
				tagElement[prop] = tagProp[prop];
			}
		}

		if (tagStyle) {
			for (var prop in tagStyle) {
				tagElement.style[prop] = tagStyle;
			}
		}
		
		if (container) {
			container.appendChild(tagElement);
		}
		
		return tagElement;
	}
	
})();

 

 

在window.onload中

var help = new SvgHelp("container", 200, 200);

help.drawCircle();

help.repaint();

 

在firefox中可以正确显示出图形。而在chrome中却不行。但是如果将container.appendChild改成document.body.appendChild,又能正确的显示。。。

 

查阅了若干资料后,终于作罢。因为发现了html5中,对于svg标准又有了新的定义。

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<script type="text/javascript" src="js/svghelper.js"></script>
<script type="text/javascript">
window.onload = function() {
	
	var container = document.getElementById('container');
    var svgns = 'http://www.w3.org/2000/svg';
    var svg = document.createElementNS(svgns, 'svg');
    svg.setAttribute('width', '300px');
    svg.setAttribute('height', '300px');
    
    // our linearGradient
    var defs = document.createElementNS(svgns, 'defs');
    var gradient = document.createElementNS(svgns, 'linearGradient');
    gradient.setAttribute('id', 'myGradient');
    gradient.setAttribute('x1', '0%');
    gradient.setAttribute('y1', '100%');
    gradient.setAttribute('x2', '100%');
    gradient.setAttribute('y2', '0%');
    var stop = document.createElementNS(svgns, 'stop');
    stop.setAttribute('offset', '5%');
    stop.setAttribute('stop-color', 'red');
    gradient.appendChild(stop);
    stop = document.createElementNS(svgns, 'stop');
    stop.setAttribute('offset', '95%');
    stop.setAttribute('stop-color', 'blue');
    stop.setAttribute('stop-opacity', '0.5');
    gradient.appendChild(stop);
    defs.appendChild(gradient);
    svg.appendChild(defs);
    
    // our example circle
    var circle = document.createElementNS(svgns, 'circle');
    circle.setAttribute('cx', '50%');
    circle.setAttribute('cy', '50%');
    circle.setAttribute('r', 100);
    circle.setAttribute('fill', 'url(#myGradient)');
    circle.setAttribute('stroke-color', 'red');
    circle.addEventListener('mousedown', function() {
      alert('hello');
    }, false);
    svg.appendChild(circle);
    container.appendChild(svg);
	
};

</script>

<body>
	<div id="container">
		
	</div>
</body>
  
</html>

 

用带ns的createElement方法,可以轻松的创建出svg对象,而无需object标签。

以上代码在Firefox和chrome上测试通过。

分享到:
评论
2 楼 rainsilence 2010-08-03  
你首先应该有个概念
Extjs是什么?
Ext.onReady是什么
Ext.MessageBox是什么

关于第二个问题,svg中的事件源应该是不一样的
关于第三个问题,Ext.MessageBox是Div啊。svg中没有DIV标签。

这样一来,解决方法也就只有一条路了。Extjs的代码必须全部写在HTML上



<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">

	function doClick() {
		document.svgFrame.getSVGDocument().test();
	}
</script>
</head>
<body>
	<input type="button" onclick="doClick();"></input>
	<embed type="image/svg+xml"  pluginspage=http://www.adobe.com/svg/viewer/install/ align="top"  name="svgFrame" id="svgFrame" src="svg/first.svg" height="400px" width="300px"></embed>
</html>


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 
<svg xmlns="http://www.w3.org/2000/svg" 
	xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
	width="300" height="400" onload="init(evt)">
	<script type="text/javascript">
	<![CDATA[
		function init(event) {
			var svgDoc = event.target.ownerDocument;
			var svgRoot = svgDoc.rootElement;
			svgDoc.test = test;
		}
		
		function test() {
			alert("test");
		}
	]]>
	</script>
	<line x1="20" y1="20" x2="70" y2="20" style="stroke:black"/>
	<line x1="20" y1="20" x2="70" y2="70" stroke="black"/>
</svg>


以上代码在FF上测试通过。但是在Chrome上测试失败。如果要全部支持,现阶段建议采用无实体svg的构造法
1 楼 tutu66 2010-08-02  
看了一下您的代码,大致意思是在没有svg实体文件作为载体的情况下动态创建类似dom节点的方式加入到html节点中

但如果需求是必须以svg实体文件为载体来运行脚本,像这样:
aa.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>SVG DEMO</title>
    <meta http-equiv="content-type" content="text/html; charset=gbk">
        <script type="text/javascript" src="../../adapter/ext/ext-base.js"></script>
        <script type="text/javascript" src="../../ext-all.js"></script>
 <body>
  		<embed id="svgBox" src="bb.svg" width="100%" height="100%">
  </body>
</html>



bb.svg
<svg xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	version="1.1"
	baseProfile="full">
	<!--初始化脚本-->
	<script>
		<![CDATA[
        Ext.onReady(function() {      
             
            //数据连接      
            var conn =new Ext.data.Connection({      
                autoAbort: false,      
                disableCaching: false,      
                extraParams: { name: "姓名", password: "密码" },      
                method: "GET",      
                timout: 300,      
                url: 'Ext_Info1.aspx'     
     
            });      
     
     
            //发送请求      
            conn.request({      
            success: function(response) { Ext.MessageBox.alert("info", response.responseText) },      
            failure: function() { Ext.MessageBox.alert("连接失败"); }      
     
            });      
     
        });   
		]]>
	</script>
	<defs>
	</defs>
		<rect id="__root" x="-10%" y="-10%" width="110%" height="110%" fill="none" pointer-events="all"> /
</svg>



此方法完全加载不起来,ext在svg中失效,如果把ext的逻辑代码移动到aa.html中去处理,又不能控制bb.svg中的东西,其实就是解决aa可以访问bb的document的问题,请指教 

相关推荐

    个重要的HTML面试题及答案.docx

    本文将详细讲解HTML5面试题及答案,涵盖了HTML5的基本概念、HTML5中的新特性、Canvas和SVG图形的区别、CSS选择器、Web Workers、本地存储等多个方面。 一、HTML5的基本概念 * HTML5是什么?HTML5是最新的HTML标准...

    html5.rar_html坦克大战

    在`tank.js`中,我们可能会看到定义坦克对象的构造函数,包括位置、速度、方向等属性,以及与之相关的运动逻辑和碰撞检测算法。 最后,`wall.js`文件可能包含了关于游戏障碍物(如墙壁)的处理逻辑。这些障碍物是...

    svgToPaperJs:将简单的svg路径转换为PaperJs.org路径对象

    2. **映射SVG命令**:SVG路径命令与Paper.js的Path构造函数或方法相对应。例如,`M`对应`moveTo()`,`L`对应`lineTo()`,`C`对应`curveTo()`等。需要将这些命令映射到相应的Paper.js函数。 3. **创建Path对象**:...

    html2image 0.9.jar 和 html2image2.0.1.jar jar包

    2. 创建HTML2Image对象:通过调用相关的构造函数创建一个HTML2Image实例,设置必要的参数,如HTML内容、输出图像的宽度和高度等。 3. 转换HTML:使用`generateImage()`或`generateImageToFile()`方法将HTML转换为...

    mxGraph:在HTML页面中制作流程图的JS插件

    - **实例化图形**:通过`mxGraph`构造函数创建一个图形实例,设置绘图区域,并配置所需的属性。 - **添加图形元素**:利用API添加节点(`mxCell`)、边(`mxConnection`)以及其他图形元素。 - **渲染和交互**:...

    JavaScript & HTML5 Training Resource

    2. **面向对象编程(OOP)**:JavaScript支持基于原型的OOP,包括构造函数、原型链、对象实例化、继承、封装和多态等概念。 3. **DOM操作**:如何使用JavaScript操作文档对象模型(DOM),包括选择元素、添加删除...

    超酷!!HTML5 Canvas 水流样式 Loading 动画.doc

    总的来说,创建HTML5 Canvas水流样式Loading动画涉及多个技术层面,包括Canvas的基本操作、SVG滤镜的应用、JavaScript的动画控制以及数学(如角度转换和圆的绘制)。通过熟练掌握这些技能,开发者可以创建出各种创新...

    javascript、jquery、html5、css3中文参考手册.rar

    5. **面向对象编程**:通过构造函数和原型链实现对象的创建和继承。 **jQuery**:jQuery是一个轻量级的JavaScript库,简化了DOM操作、事件处理、动画制作和Ajax交互。jQuery的关键知识点包括: 1. **选择器**:...

    HTML笔记.docx

    构造函数用于创建特定类型的对象,而原型对象则让对象共享属性和方法。DOM(Document Object Model)是HTML和XML文档的编程接口,通过它可以操作页面元素,添加、删除或修改元素的属性和内容。事件是JavaScript处理...

    Web前端+后端+架构 21部从零玩转Web全栈超级架构师 2000集50G容量爆表-学完就够用!

    3. **对象与原型链:**深入理解对象模型、构造函数、原型链机制。 4. **异步编程:**学习回调函数、Promise、async/await等异步编程技术。 5. **模块化开发:**介绍ES6模块的导入导出语法及其在实际开发中的应用。 6...

    DHTML5-客户端JavaScript.ppt

    JavaScript是一种广泛应用于客户端Web开发的脚本语言,它在DHTML5中扮演着核心角色。...在DHTML5中,JavaScript与HTML5的新特性结合,如Canvas、SVG、WebSocket等,使得Web应用的功能和表现力得到了极大的提升。

    原生js预览ofd文件

    `OfdParser.parse()`方法会解析OFD文件的二进制数据,并返回一个表示OFD结构的对象。这个对象可能包含文档的元数据、页面信息、文字、图像等内容。`renderOFD()`函数则需要根据这个解析结果,生成HTML或SVG元素来...

    javascript 帮助文档和HTML帮助文档(内含多个帮助文档)

    4. **对象与原型**:对象创建(字面量、构造函数、Object.create)、原型链、属性访问、方法调用。 5. **数组与集合**:数组操作(push、pop、shift、unshift、splice、map、filter、reduce等)、Set、Map。 6. **...

    prototype demo

    3. **Enumerable.html、Element.html、String.html**:这些HTML文件可能包含了Prototype库中对数组、DOM元素和字符串对象的扩展方法的文档。例如,Enumerable模块提供了诸如`each`, `map`, `select`, `reject`等迭代...

    前端开源库-create-html

    - `create-html` 提供了一个API,允许开发者通过传递对象或字符串参数来生成HTML元素。例如,你可以直接创建一个`&lt;div&gt;`元素,设置其类名和内联样式。 - 库支持创建嵌套的HTML结构,通过递归地调用函数,可以生成...

    简单实用,原生js,表盘指针,动态,实时,数字时钟,特效代码

    表盘和指针的绘制通常涉及到HTML5的Canvas API或者SVG(Scalable Vector Graphics)元素。Canvas提供了一套绘图命令,允许开发者直接在画布上绘制图形,包括圆形(表盘)和线形(指针)。而SVG则是一种矢量图形格式...

    2021-2022计算机二级等级考试试题及答案No.19951.docx

    继承是面向对象编程中的一个重要特性,它允许子类从父类继承非私有属性和方法,但不包括构造方法和静态方法。子类可以重写父类的方法以实现不同的行为,也可以添加新的属性和方法,以满足特定需求。这种机制提高了...

    前端项目-d3-path.zip

    在`script.js`中,开发者可能使用了D3的`d3.path()`函数来创建一个路径构造器,该构造器可以将SVG路径数据转换为一系列的几何操作。这在需要自定义SVG图形或者对现有SVG路径进行分析时非常有用。通过序列化,数据...

    前端工程师考察题目

    5. **绘图能力**:HTML5新增了`&lt;canvas&gt;`和`&lt;svg&gt;`标签。 #### 从输入网址到显示网页的过程分析 1. **DNS解析**:将域名转换为IP地址。 2. **建立连接**:通过TCP协议建立客户端与服务器之间的连接。 3. **发送...

Global site tag (gtag.js) - Google Analytics