`
ayue222
  • 浏览: 48040 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用javascript动态创建SVG对象的问题

阅读更多
如何在html中操作SVG对象的问题,对于嵌入式<embed name="id1" id='svgId' type='image/svg+xml' src="./test.svg" height="200" width="500"></embed>的可以通过document.getElementById('svgId'). getSVGDocument();的方法得到SVG Doc对象,但此方法存在两个问题:一是opera不支持getSVGDocument方法,二是对于动态创建的embed对象并不会马上被呈现,从而无法立刻得到SVGDocument对象,下面的方法会出错
        var body=document.getElementsByTagName('body')[0];
        var svg=document.createElement("embed");
        svg.setAttribute("id",id);
        svg.setAttribute("type",'image/svg+xml');
        svg.setAttribute("width",'100%');
        svg.setAttribute("height",'100%');
        svg.setAttribute("src",'a.svg');//这里必须输入svg源
        body.appendChild(svg);
        var svgdoc=svg.getSVGDocument();//在IE下出错,原因可能是svg虽然被加到了body中,但需要Adobe的SVG插件去绘制,所以不能立刻得到SVGDocument
embed嵌入还存在一个问题,需要存在一个如下的空SVG文件
<svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">
</svg>

现在的解决方法是对与IE还是使用embed的方式(最好的是VML),对于其他浏览器,SVG标签和其他标签一样创建,使用下面的方法创建了一个SVG 对象和一个矩形,并添加到body标签下
        var svg=document.createElementNS('http://www.w3.org/2000/svg','svg');
        svg.setAttribute("height",'100%');
        svg.setAttribute("width",'100%');
        var rect=document.createElementNS('http://www.w3.org/2000/svg','rect');
        rect.setAttribute("id","rect");
        rect.setAttribute("x",0);
        rect.setAttribute("y",0);
        rect.setAttribute("width",200);
        rect.setAttribute("height",200);
        rect.setAttribute("fill",'red');
        svg.appendChild(rect);
        var body=document.getElementsByTagName('body')[0];
        body.appendChild(svg);
对于IE的解决办法现在是放在setTimeout()中执行,最佳方案是VML

//emptySVG.svg
<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">
</svg>
//svg.html
<html>
<head>
<title>test</title>
<script language=javascript >
var twConstants=
{
DIALECT_SVG:'svg',
DIALECT_VML:'vml',
NS_SVG:'http://www.w3.org/2000/svg',
NS_XLINK:'http://www.w3.org/1999/xlink'
}
var isIE=false;
function checkBrowser(){
    return navigator.appName == "Microsoft Internet Explorer";      
}
isIE=checkBrowser();
function getSVGDocument(svg){
    var result=null;
    if(isIE){
        if(svg.tagName.toLowerCase()=="embed"){
            try{
                result=svg.getSVGDocument();
            }catch(e){
                alert(e+" may be svg embed not init");
            }
        }
    }else{
        result=svg.ownerDocument;
    }
    return result;
}
function getSVGRoot(svg,doc){
    if(svg.tagName.toLowerCase()=="embed"){
        if(doc){
            return doc.documentElement;
        }else{
            return getSVGDocument(svg).documentElement;
        }
    }else if(svg.tagName.toLowerCase()=="svg"){
        return svg;
    }return null;
}
//空SVG文件路径
var emptySVGSrc="./twaver/emptySVG.svg";
//在Html中创建一个SVG节点,指定id,父亲节点,对于IE创建<embed />,其他浏览器创建<SVG />
function createSVG(id,parent){
    var svg;
    if(isIE){
        svg=document.createElement("embed");
        svg.setAttribute("id",id);
        svg.setAttribute("type",'image/svg+xml');
        svg.setAttribute("src",emptySVGSrc);
    }else {
        svg=document.createElementNS(twConstants.NS_SVG,'svg');
    }
    svg.setAttribute("width",'100%');
    svg.setAttribute("height",'100%');
    parent.appendChild(svg);
    if(isIE){
        doLater(
            function(svg){
                var svgdoc=getSVGDocument(svg);
                var svgRoot=getSVGRoot(svg,svgdoc);
                svgRoot.setAttribute("height",'100%');
                svgRoot.setAttribute("width",'100%');
            },100,svg);
    }
    return svg;
}
//得到SVGDocument
function getSVGDocument(svg){
    var result=null;
    if(isIE){
        if(svg.tagName.toLowerCase()=="embed"){
            try{
                result=svg.getSVGDocument();
            }catch(e){
                alert(e+" may be svg embed not init");
            }
        }
    }else{
        result=svg.ownerDocument;
    }
    return result;
}
//得到SVG根结点
function getSVGRoot(svg,doc){
    if(svg.tagName.toLowerCase()=="embed"){
        if(doc){
            return doc.documentElement;
        }else{
            return getSVGDocument(svg).documentElement;
        }
    }else if(svg.tagName.toLowerCase()=="svg"){
        return svg;
    }return null;
}
//扩展setTimeout方法,实现延时执行
function doLater(callback,timeout,param)
{
    var args = Array.prototype.slice.call(arguments,2);
    var _cb = function()
    {
        callback.apply(null,args);
    }
    setTimeout(_cb,timeout);
}
//______测试代码_______
var svg;
var addRect=function(svg){
    var svgdoc=getSVGDocument(svg);
    var svgRoot=getSVGRoot(svg);
    var rect=svgdoc.createElementNS(twConstants.NS_SVG,'rect');
    rect.setAttribute("id","rect2");
    rect.setAttribute("x",10);
    rect.setAttribute("y",10);
    rect.setAttribute("width",200);
    rect.setAttribute("height",200);
    rect.setAttribute("fill",'red');
    svgRoot.appendChild(rect);
}
function call(){
    var body=document.getElementsByTagName('body')[0];
    svg=createSVG('svgid',body);
    /**
    //如果创建SVG对象后马上添加SVGElement,对于IE需要延时执行
    if(isIE){
        doLater(function(svg){
            addRect(svg);
        },100,svg);
    }else{
        addRect(svg);
    }
    **/
}
function showmsg()
{
    //这里不需要延时执行,因为这里是在按钮点击事件中,SVG已经初始化
    addRect(svg);
}
</script>
</head>
<body onload='call()'>
<input type='button' onclick='{showmsg();}' value='ok' />
</body>
</html>
SVG支持用<path> 标签用来定义图形的路径
分享到:
评论

相关推荐

    JavaScript完全自学宝典 源代码

    15.4.svg 使用JavaScript操作SVG。 Calculate.java 计算浮点数运算结果的Applet。 Calculate.class Calculate.java的字节码文件。 Calculate1.java 计算浮点数运算结果并调用页面中JavaScript函数的...

    SVGComic:基于动态 SVG 的 Webcomic 生成 JavaScript 引擎

    SVGComic 是一个基于动态 SVG 的 Webcomic 生成 JavaScript 引擎。 用法 您将 svg-comic.js 脚本包含到您的 SVG 中,将 onload="main(evt)" 添加到您的 SVG 标签,然后为您的代码创建一个新的 SCRIPT 块。 有关建议...

    SVGMagic.V1.004.zip

    另外,SVG文件还可嵌入JavaScript(严格地说,应该是ECMAScript)脚本来控制SVG对象 * SVG图形格式可以方便的创建文字索引,从而实现基于内容的图像搜索 * SVG图形格式支持多种滤镜和特殊效果,在不改变图像内容的...

    Ext Js权威指南(.zip.001

    1.2.4 在javascript中使用json / 4 1.2.5 在.net中使用json / 8 1.2.6 在java中使用json / 12 1.2.7 更多有关json的信息 / 15 1.3 ext js 4概述 / 15 1.4 ext js的开发工具的获取、安装与配置介绍 / 18 1.4.1...

    JavaScript高级教程

    第 1 章 JavaScript 是什么...............................................1 3 1.1 历史简述..............................................1 1.2 JavaScript 实现................................................

    asp.net知识库

    动态创建数据库 SQL Server数据库安全规划全攻略 .net通用数据库访问组件SQL Artisan应用简介1 在Framework1.0下同时连接SqlServer和Oracle的一些体会 XML XPath XPath最通俗的教程(ZZ) XPath中相对路径和绝对路径...

    Highcharts-Stock-8.1.2.zip

    在现代的浏览器中使用 SVG 技术进行图形绘制,在低版本 IE 则使用 VML 进行图形绘制。 free非商业使用免费 在个人网站、学校网站及非盈利机构中使用 Highstock 完全不需要经过我们的许可,直接可以任意使用! 商业...

    Highcharts-Gantt-8.1.2.zip

    在现代的浏览器中使用 SVG 技术进行图形绘制,在低版本 IE 则使用 VML 进行图形绘制。 free非商业使用免费 在个人网站、学校网站及非盈利机构中使用 Highstock 完全不需要经过我们的许可,直接可以任意使用! 商业...

    Highcharts-8.1.2.zip

    Highcharts 是一个用纯 JavaScript 编写的一个图表库, 能够很简单便捷的在 Web 网站或是 Web 应用程序添加有交互性的图表,并且免费提供给个人学习、个人网站和非商业用途使用。 Highcharts 支持的图表类型有直线...

    精通qt4编程(源代码)

    \19.3 使用JavaScript操作Qt对象 463 \19.4 基于Prototype的继承 467 \19.5 小结 467 \第20章 国际化 468 \20.1 Unicode与字符编码 468 \20.1.1 Unicode 468 \20.1.2 汉字编码 469 \20.1.3 编码转换 469 \20.2 Qt ...

    精通Qt4编程(第二版)源代码

    \19.3 使用JavaScript操作Qt对象 463 \19.4 基于Prototype的继承 467 \19.5 小结 467 \第20章 国际化 468 \20.1 Unicode与字符编码 468 \20.1.1 Unicode 468 \20.1.2 汉字编码 469 \20.1.3 编码转换 469 \...

    D3.js可视化库 v6.1.1

    或者,使用相同的数据创建具有平滑过渡和交互作用的交互式SVG条形图。D3不是试图提供所有可能功能的整体框架。相反,D3解决了问题的症结:基于数据的文档有效处理。这避免了专有表示,并提供了非凡的灵活性,从而...

    dimo-graphviz:DIMO的图形可视化UI

    DIMO知识图可视化 DIMO数据库跟踪数字世界和物理世界之间的连接。 我们的Graph可视化功能使您可以比以往更快地使用此信息来设计和... 空间特征在后台加载SVG,以将对象链接到地理位置,或在图形上强制执行结构。 创建

    java开源包8

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

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

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

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

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

    java开源包1

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包11

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包2

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

Global site tag (gtag.js) - Google Analytics