【问题标题】:Include svg code depending on variable根据变量包含 svg 代码
【发布时间】:2014-08-27 04:03:20
【问题描述】:

我想在 html 中注入 svg 代码以用于动画目的。使用 img、embed、object 或 iframe 标签链接 svg 对我不起作用,因为动画考虑了精确的页面定位。如果我直接输入代码,它就可以工作,但是要加载的代码取决于一个名为“name”的 url 变量。根据该变量,我显示了一个港口旋转的小地图,动画是让一艘小船沿着路线移动。

我看到的唯一选择是使用 javascript 使用 innerHTML 注入 svg 代码,但我必须选择正确的 javascript 文件,具体取决于“名称”url 变量。我将为每个服务提供一个单独的 js。

为了调用图像,我使用以下脚本:

document.write("<img class ='svc-image' src='images/" + getUrlVars()["name"].replace(/\s+/g, '_').toLowerCase() + ".jpg' style='position:absolute;left:370px;top:185px;'>");

那么svg代码是这样的:

<svg style="position:absolute;left:385px;top:175px;z-index:2;height:900px;">
<defs>
<path id="curve" d="M204,98c0,0-8-42-40-48s-57.3,68-57.3,77.3s4,18,4,26.7
s-8.7,58-11.3,69.3c-2.7,11.3-28,120-28.7,124.7c-0.7,4.7-6,24-5.3,36.7c0.7,12.7,1.3,22,10.7,21.3s21.3-8.7,28.7-13.3" 
stroke="black" fill="none" stroke-width="5" />
</defs>
<image xlink:href="images/vsl.png" x="0" y="0" height="42" width="60">
<animateMotion dur="10s"
rotate="auto" fill="freeze" repeatCount="indefinite" >
<mpath xlink:href="#curve"/>
</animateMotion>
</image>
</svg>

我正在尝试使用以下 js 加载它:

var anim = document.getElementById("anim");
document.addEventListener('DOMContentLoaded', function(){
anim.innerHTML = "<svg style='position:absolute;left:385px;top:175px;z-index:2;height:900px;'><defs><path id='curve' d='M204,98c0,0-8-42-40-48s-57.3,68-57.3,77.3s4,18,4,26.7,s-8.7,58-11.3,69.3c-2.7,11.3-28,120-28.7,124.7c-0.7,4.7-6,24-5.3,36.7c0.7,12.7,1.3,22,10.7,21.3s21.3-8.7,28.7-13.3' stroke='black' fill='none' stroke-width='5' /></defs><image xlink:href='images/vsl.png' x='0' y='0' height='42' width='60'><animateMotion dur='10s' rotate='auto' fill='freeze' repeatCount='indefinite' ><mpath xlink:href='#curve'/></animateMotion></image></svg>"; 
});

我希望将 js 文件(在上面的示例中称为 ame.js,(美国的服务))注入到 html 中,但不使用(脚本 src),因为我希望 url 根据url 变量。

类似:

<script src="js/" + getUrlVars()["name"].replace(/\s+/g, '_').toLowerCase() + ".js" type="text/javascript">

我知道它不起作用,但这就是我需要的。将js文件的url设为变量。

几个问题:

  1. 这可能吗?

  2. 是否有另一种注入 svg 的方法,而不必为每个服务创建一个单独的 js 文件,可以在 anim.innerHTML 中放置一个文件名,然后使用 getUrlVars 更改该 url?

感谢您的帮助

【问题讨论】:

  • 至于根据文件名加载和运行js,look here,但是你可以只导入SVG而不是js来加载SVG......像element.innerHTML = /* Get SVG from file based on file name */。我不完全确定你要做什么
  • 好吧,只要我弄清楚要在 element.innerHTML 中放入什么作为文件名,并且能够根据 url 变量更改其名称,就可以了。例如,我有几个服务名称,例如:ame、bcx 和 cal。并且会有 ame.svg、bcx.svg 和 cal.svg 文件,以及相同的文件名但 .jpg 用于图像。我想出了如何加载图像,即迷你地图。现在的问题是如何加载包含动画部分的svg。
  • 您可能需要使用 AJAX 来导入 SVG,因为它尚未加载到页面中。如果您使用 jQuery,Something likes this 会起作用,尽管这不是必需的

标签: javascript html svg


【解决方案1】:

您可以制作一个 ajax 从其他文件中检索 SVG:

WORKING DEMO

var url = getUrlVars()["name"].replace(/\s+/g, '_').toLowerCase();
var anim = document.getElementById("anim");
document.addEventListener('DOMContentLoaded', function(){
  var client = new XMLHttpRequest();
  client.onreadystatechange = function(){
    anim.innerHTML = this.response; 
  };
  client.open("GET", url);
  client.send();
});

【讨论】:

  • 控制台说:anim.innerHTML = this.response;中的动画为空
  • 更新:没关系,这与脚本相对于 div 的位置有关。谢谢拉法。它就像一个魅力。
猜你喜欢
  • 2017-11-22
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 2017-08-29
  • 2017-01-21
  • 1970-01-01
相关资源
最近更新 更多