【问题标题】:Scripted SVG animation no-longer working in some browsers脚本化的 SVG 动画不再在某些浏览器中工作
【发布时间】:2020-02-27 03:34:26
【问题描述】:

我正在尝试找出为什么下面的代码不再适用于 Firefox 或 Chrome。

这些文件最后一次修改是在十年前。

静态 svg 显示,但脚本不运行。令我相当惊讶的是,它在 Edge 中确实可以正常工作,具有交互元素的更复杂的图表也是如此。

我可能需要在 Firefox 中检查一些晦涩的设置,但我不知道在哪里查找。我不知道我最后一次尝试这些文件是什么时候,但我相当肯定它们在几年前仍然有效。

代码可能充满了愚蠢,因为我只编写了很少的 javascript,我现在可能应该使用 requestanimationframe,但这不是重点 - 它已经工作,并且仍然在 Edge 中工作。

(已编辑问题以删除指向无关 SMIL 版本动画的链接。)

这是html文件:

<html>
  <head>

    <title>
      SVG slider-crank animated by script
    </title>

  </head>

  <body onload="main()">

    <script type="text/javascript">
      <!--
        var    svgdoc = null;
        var     crank = null;
        var crosshead = null;
        var    conrod = null;
        var        pi = Math.PI;

        function main()
          {
          var timer = null;
          var angle = 0;
          var diagram = document.getElementById('svg');
          if (diagram && diagram.contentDocument)
            {
            svgdoc = diagram.contentDocument;
            }
          else
            {
            try
              {
              svgdoc = diagram.getSVGDocument();
              }
            catch(exception)
              {
              alert("Unable to get SVG document");
              }
            }
          crank     = svgdoc.getElementById('ShowCrank');
          crosshead = svgdoc.getElementById('ShowCrosshead');
          conrod    = svgdoc.getElementById('ShowConRod');
          timer = setInterval(function(){(angle = rotation(angle))}, 25);
          }

        function rotation(angle)
          {
          var step = 3;
           var theta = angle * pi / 180;
           var alpha = Math.asin(Math.sin(theta) / 5);
          var offset = 100 * (Math.cos(theta) -1)  - 500 * (Math.cos(alpha) - 1);
              crank.setAttributeNS(null, 'transform', ("rotate(" + angle + ", 800, 300)"));
          crosshead.setAttributeNS(null, 'transform', ("translate(" + offset + ", 0)"));
             conrod.setAttributeNS(null, 'transform', ("translate(" + offset + ", 0) rotate(" + (alpha * 180 / pi) + ", 400, 300)"));
          angle = angle < 360 - step ? angle + step : 0;
          return angle;
          }

      -->
    </script>

    <object id="svg" type="image/svg+xml" data="Slider_Crank.svg" width="1200" height="800">
      <param name="src" value="Slider_Crank.svg">
    </object>

  </body>

</html>


这是 svg 文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
  <svg version="1.1"
    baseProfile="full"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:ev="http://www.w3.org/2001/xml-events"
    width="1200"
    height="800">

  <title>  Slider-Crank </title>

  <defs>
    <rect
                id="Slidebar"
      stroke-width="1"
            stroke="black"
              fill="silver"
      fill-opacity="1"
                 x="0"
                 y="-12"
             width="300"
            height="24"
    />
    <g id="Crosshead" stroke-width="1" stroke="black" fill-opacity="1">
      <rect
           fill="gold"
              x="-50"
              y="-25"
          width="100"
         height="50"
      />
      <circle cx="0" cy="0" r="15" fill="white"/>
    </g>
    <g id="Crank" stroke-width="1" stroke="black" fill-opacity="1">
      <path fill="silver"
             d="M 99.959 40.000
                A  40  40 0 0 0 99.959, -40.000
                A 450 450 0 0 1  9.950, -49.000
                A  50  50 0 1 0  9.950,  49.000
                A 450 450 0 0 1 99.959,  40.000
                z"/>
      <circle cx="100" cy="0" r="25" fill="white"/>
      <circle cx="0"    cy="0" r="30" fill="lightgrey"/>
    </g>
    <g id="ConRod" stroke-width="1" stroke="black" fill-opacity="0.7">
      <path fill="silver"
             d="M  12.387  21.715
                A 30 30 0 0 1  27.551  17.776
                L 453.475  22.035
                A 30 30 0 0 1 473.243  29.733
                A 40 40 0 0 1 473.243 -29.733
                A 30 30 0 0 1 453.475 -22.035
                L  27.551 -17.776
                A 30 30 0 0 1 12.387  -21.715
                A 25 25 0 0 1 12.387   21.715
                z"/>
      <circle cx="0"   cy="0" r="25" fill="silver"/>
      <circle cx="0"   cy="0" r="15" fill="white"/>
      <circle cx="500" cy="0" r="40" fill="silver"/>
      <circle cx="500" cy="0" r="25" fill="white"/>
    </g>

  </defs>

  <use id="ShowTopSlidebar"    xlink:href="#Slidebar"  x="150" y="263"/>
  <use id="ShowBottomSlidebar" xlink:href="#Slidebar"  x="150" y="337"/>
  <use id="ShowCrosshead"      xlink:href="#Crosshead" x="400" y="300"/>
  <use id="ShowCrank"          xlink:href="#Crank"     x="800" y="300"/>
  <use id="ShowConRod"         xlink:href="#ConRod"    x="400" y="300"/>

</svg>

【问题讨论】:

  • 您认为问题可能出在svgdoc = diagram.getSVGDocument();,因为它看起来像getSVGDocument(),这里已弃用:stackoverflow.com/questions/16626938/…
  • 浏览器安全模型已更改。本地文件不能再加载/访问其他本地文件。
  • 哪些确切版本的 Firefox 和 chrome 失败了?它适用于我在 ff71.0b4 和 chrome76.0 中的两种浏览器
  • Firefox 必须解决这个问题:mozilla.org/en-US/security/advisories/mfsa2019-21/…
  • 谢谢大家。按照我找到的各种链接:config setting 'security.fileuri.strict_origin_policy' 修复了 Firefox。我不知道就这样离开它有多明智。

标签: javascript animation firefox svg


【解决方案1】:

感谢 Robert Longson:Firefox about:config setting 'security.fileuri.strict_origin_policy'

【讨论】:

  • 请勿使用此套装上网。
猜你喜欢
  • 2012-09-21
  • 2015-01-25
  • 1970-01-01
  • 2013-12-17
  • 2015-11-20
  • 2016-06-01
  • 2016-03-02
  • 1970-01-01
  • 2017-01-31
相关资源
最近更新 更多