`
rainsilence
  • 浏览: 159280 次
  • 性别: 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标准...

    JavaScript权威指南(第6版)(中文版)

    本书第6版涵盖了HTML5和ECMAScript 5,很多章节完全重写,增加了当今Web开发的最佳实践的内容,新增的章节包括jQuery、服务器端JavaScript、图形编程以及 JavaScript式的面向对象。本书不仅适合初学者系统学习,也...

    JavaScript权威指南(第6版)

    本书第6版涵盖了HTML5和ECMAScript 5,很多章节完全重写,增加了当今Web开发的最佳实践的内容,新增的章节包括jQuery、服务器端JavaScript、图形编程以及 JavaScript式的面向对象。本书不仅适合初学者系统学习,也...

    JavaScript权威指南(第六版) 清晰-完整

    7.9 ECMAScript 5中的数组方法 7.10 数组类型 7.11 类数组对象 7.12 作为数组的字符串 第8章 函数 8.1 函数定义 8.2 函数调用 8.3 函数的实参和形参 8.4 作为值的函数 8.5 作为命名空间的函数 8.6 闭包 8.7 函数属性...

    JavaScript权威指南(第6版) 中文版

    本书第6版涵盖了 html5 和 ecmascript 5,很多章节完全重写,增加了当今 web 开发的最佳实践的内容,新增的章节包括 jQuery、服务器端 JavaScript、图形编程以及JavaScript式的面向对象。本书不仅适合初学者系统学习...

    JavaScript权威指南(第6版)

    本书第6版涵盖了 html5 和 ecmascript 5,很多章节完全重写,增加了当今 web 开发的最佳实践的内容,新增的章节包括 jQuery、服务器端 JavaScript、图形编程以及JavaScript式的面向对象。本书不仅适合初学者系统学习...

    JavaScript权威指南(第6版)中文文字版

    本书第6版涵盖了 html5 和 ecmascript 5,很多章节完全重写,增加了当今 web 开发的最佳实践的内容,新增的章节包括 jQuery、服务器端 JavaScript、图形编程以及JavaScript式的面向对象。本书不仅适合初学者系统学习...

    Ext Js权威指南(.zip.001

    6.3.3 使用createdom方法生成dom对象 / 261 6.3.4 使用createtemplate方法创建模板 / 263 6.3.5 helper对象的使用方法 / 263 6.4 元素的操作 / 273 6.5 获取元素集合:ext.compositeelementlite与ext....

    java开源包5

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    java开源包4

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包7

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    JAVA上百实例源码以及开源项目

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    JAVA上百实例源码以及开源项目源代码

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    java开源包1

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包11

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包2

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

Global site tag (gtag.js) - Google Analytics