2012-08-10 13 views
8

Utworzyłem małą stronę tak jak ten tutaj:funkcja połączeń JavaScript wewnątrz SVG z okolicznych HTML

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Test</title> 
    <script type="text/javascript"> 
    function test() { 
     executeAnimation(); 
    } 
    </script> 
    </head> 
    <body> 
    <h1>Tester</h1> 
    <embed src="test.svg" type="image/svg+xml" /> 
    <hr /> 
    <input type='button' value='Test' onclick='test()' /> 
    </body> 
</html> 

test.svg wygląda następująco:

<?xml version="1.0" ?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" 
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 
<svg id="testSvgId" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="950" height="900"> 
    <title>Title</title> 
    <desc>Desc</desc> 
    <defs> 
      <script type="text/javascript"> 
      <![CDATA[ 
      function executeAnimation() { 
       document.getElementById('anim').beginElement(); 
      } 
      ]]> 
      </script> 
    </defs> 
    <ellipse cx="500" cy="1090" rx="600" ry="0" fill="rgb(94,114,54)"> 
      <animate id="anim" attributeType="XML" attributeName="ry" begin="indefinite" dur="2s" from="0" to="350" fill="freeze" /> 
    </ellipse> 
</svg> 

Jak widać, ja chcesz wywołać z JavaScript na stronie HTML funkcję executeAnimation(), która jest zdefiniowana wewnątrz obrazu SVG. To w rzeczywistości nie działa.

Próbowałem też tak:

<svg onload='onloadFunction()'...> 
... 
function onloadFunction() { 
    alert('i am loading'); 
    window.executeAnimation = executeAnimation(); 
} 

ten został zaproponowany w innym forum, ale to również nie działa (window.executeAnimation została zdefiniowana z zewnątrz).

Jaki byłby prawdziwy prawidłowy sposób to zrobić?

Odpowiedz

3

Nie widząc źródło swojego .svg, że to niemożliwe, aby odpowiedzieć konkretnie ...

to sprawdzić: https://codepen.io/lambdacreatives/pen/uygzk

HTML

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="77px" height="77px" viewBox="0 0 77 77" enable-background="new 0 0 77 77" xml:space="preserve"> 
    <g> 
    <path id="d" fill="#ffffff" d="M49.045,61.112c2.549-1.198,4.867-2.798,6.857-4.743L36.83,13.587c-2.862,0.186-5.602,0.826-8.124,1.899 
    l6.448,14.465l-15.12,25.387c1.866,2.038,4.044,3.785,6.489,5.118L39.236,39.11L49.045,61.112z"/> 

    <path id="circle" fill="#ffffff" d="M38.457,67.2c-15.852,0-28.701-12.848-28.701-28.701c0-15.851,12.85-28.697,28.701-28.697 
    c5.773,0,11.137,1.72,15.639,4.653l4.605-7.702c-6.049-3.873-13.114-5.998-20.359-5.998C17.531,0.754,0.6,17.687,0.6,38.499 
    c0,20.813,16.932,37.746,37.742,37.746c8.438,0,16.48-2.773,23.061-7.865l-3.809-8.533C52.514,64.405,45.818,67.2,38.457,67.2z"> 
     <animateTransform 
       xlink:href="#circle" 
       attributeName="transform" 
       attributeType="XML" 
       id="ani-circle" 
       type="rotate" 
       from="0 38.501500725746155 38.4994986653327945" 
       to="360 38.501500725746155 38.4994986653327945" 
       dur="0.3s" 
       begin="click" 
       repeatCount="1" 
       fill="freeze" /> 

    </path> 
    </g> 
</svg> 
<br><br> 
<button id="trigger">Trigger Animation</button> 

CSS

body { 
    background-color: black; 
    text-align: center; 
} 

svg { 
    height: 100%; 
    width: 200px; 
    path { 
    fill: white; 
    } 
} 

JS

$("#trigger").click(function() { 
    document.getElementById("ani-circle").beginElement(); 
}); 

Jeśli nie mogą się dogadać z tym, dodawać źródło swojej .svg i będę pukać się konkretną odpowiedź dla Ciebie.

+1

Pierwszy komentarz po pięciu latach, i właśnie zauważyłem, że zapomniałem o jednym miejscu przed kodem SVG, dlatego pokazano tylko "Opis tytułu". NIKT NIE ZNAJDUJE SIĘ W NINIEJSZYM ROKU! :-) SVG działało kilka dni później w 2012 roku, więc myślę, że jest to teraz rozwiązane: P –

+1

Genialny! Nie widziałem nawet daty! Ha ha. – dennispreston