Скриптовая анимация SVG больше не работает в некоторых браузерах - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь понять, почему приведенный ниже код больше не работает в 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>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...