【问题标题】:jQuery appending to AJAX loaded SVG problemjQuery附加到AJAX加载的SVG问题
【发布时间】:2011-07-23 18:04:08
【问题描述】:

我通过 AJAX 成功从外部文件加载了一些 svg:

$("#svg").load(svgUrl + " svg", function() {  
    // do stuff  
});  

我的 HTML 看起来像这样:

<div id="svg" ...>
    <svg ...>
        ...
    </svg>
</div>

我可以很好地看到图形。现在我想在加载的 svg 中添加一些额外的 svg 元素。我将脚本更改为:

$("#svg").load(svgUrl + " svg", function() {  
    $("svg").append("<g id='compass'></g>");  
    // do stuff  
});  

由于某些原因,添加的元素在 firebug 中显示为隐藏,无论我在其中放入什么 xml,我都无法在我的网页上看到它。

更新:
感谢echo-flow 我能够附加到我的SVG。现在,如果我尝试从另一个 xml 文件加载我的指南针 svg,它不会出现在我的 DOM 中。目前我的代码如下所示:

$("#svg").load(obj.svgUrl + " svg", function() {
    var svgns = "http://www.w3.org/2000/svg";
    var g = document.createElementNS(svgns,"g");
    g.setAttributeNS(null,'id','compass');
    $("svg").append(g);
    $("#compass").load("files/svg/compass.xml");
});

如果我在 firebug 中查看控制台,我会看到 AJAX 请求罗盘标记的结果是成功的,但是是空的。

【问题讨论】:

    标签: jquery dom load svg append


    【解决方案1】:

    jQuery 并不是真正为识别 XML 命名空间而构建的,因此字符串 "&lt;g id='compass'&gt;&lt;/g&gt;" 很可能会被解析为生成的 DOM 节点位于默认命名空间中,而不是 SVG 命名空间。您可以通过使用常规 DOM 创建节点来解决此问题。如下所示:

    svgns = "http://www.w3.org/2000/svg"
    $("#svg").load(svgUrl + " svg", function() {  
        var g = document.createElementNS(svgns,"g");
        g.setAttributeNS(null,'id','compass');
        $("svg").append(g);
        //do stuff
    });  
    

    如果您需要创建更复杂的结构,那么我建议您查看jquery-svg 库,它具有用于生成 SVG DOM 的更简洁的 API。

    更新

    我误解了您正在尝试加载 SVG 文档并将其附加到您的主机 HTML 文档中 - 相反,我认为您正在尝试使用脚本生成 SVG。为了解决您的问题,我建议您执行以下操作(未经测试,但应该可以):

    //get the SVG document using XMLHTTPRequest
    $.get(svgUrl + " svg",
    function(svgDoc){
      //import contents of the svg document into this document
      var importedSVGRootElement = document.importNode(svgDoc.documentElement,true);
      //append the imported SVG root element to the appropriate HTML element
      $("#svg").append(importedSVGRootElement);
    },
    "xml");
    

    【讨论】:

    • 因此,如果我有一个带有 SVG 标记的外部文件,我想将它附加到我已经加载的 SVG 中,那么最简单的方法是什么?使用库...?
    • 非常感谢您帮助我!我使用了您的第一个示例并成功地将 附加到我加载的 svg 标记中。现在我想在生成的空指南针元素中添加另一个外部文件中的一些 xml,但它似乎不起作用。我会更新我的问题,尽量说清楚。
    • 为了将另一个 SVG 文档中的内容附加到您的主机 HTML 文档中,您需要使用我在更新答案中列出的技术,而不是原始答案中的技术。使用 load() 然后在加载回调中使用 DOM 生成标记是没有意义的。
    • 再次感谢!在对两个 svg 文件使用您更新的方法后,我的 svg 显示出来了!
    • 酷,这让我朝着正确的方向前进。我的问题有点相关。如果您使用 d3 和 Backbone 或类似的东西,这个答案会有所帮助:stackoverflow.com/questions/9651167/…
    【解决方案2】:

    如果您开始使用jquery canvas,可能会更容易。它是一种模块化语言,用于在 XML 中描述二维矢量和混合矢量/光栅图形

    【讨论】:

    • 感谢您的建议!对于这个特定的项目,我想在 HTML5 中使用内联 SVG,而不需要额外的 SVG 库。
    【解决方案3】:

    我让它像这样工作。

                        $.ajax({
                                url: url,
                                data: {data:tosendAlong},
                                type: "POST",
                                dataType: "text",
                                success: function (svg) {
                                        $("#map").html('<?xml version="1.0"?>' + svg)
                                                .attr({
                                                        'height': '100%',
                                                        'width': '100%'
                                                });
                                }
                        })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 2012-06-09
      • 1970-01-01
      • 2014-03-10
      相关资源
      最近更新 更多