![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 0 Dołączył: 25.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
Mam plik kolo.svg, proba.js oraz proba.html. W pliku kolo.svg jest koło id="koloSVG", którego kliknięcie powinno uruchomić funkcję zawartą w pliku proba.js.
Oczywiście podane tutaj pliki są uproszczone, by łatwiej znaleźć problem. Próbuję to zrobić na różne sposoby, ale nic nie wychodzi. Oba pliki mają znajdować się lokalnie na dysku użytkownika. plik kolo.svg
plik proba.html plik proba.js
Jeśli w pliku kolo.svg odkomentuję odpowiednie linijki, to będzie następujące działanie: ( a ) : Wszystko ok, ale ja chcę wywołać funkcję spoza pliku svg, czyli klik2. ( b ) - ( c ) : Uncaught SecurityError: Blocked a frame with origin "null" from accessing a frame with origin "null". Protocols, domains, and ports must match. (3 razy, bo 3 obrazki) Linijka powodująca błąd to kolejno ( b ) i ( c ). Jeśli w pliku proba.js odkomentuję odpowiednie linijki, to będzie następujące działanie: ( d - czyli chcę załadować obrazek poprzez XMLHttpRequest) : XMLHttpRequest cannot load file:///G:/.../kolo.svg. Cross origin requests are only supported for HTTP. oraz: Uncaught NetworkError: A network error occurred. ( e ) - ( g ) : Uncaught SecurityError: Failed to execute 'getSVGDocument' on 'HTMLEmbedElement': Blocked a frame with origin "null" from accessing a frame with origin "null". Protocols, domains, and ports must match. Linijka powodująca błąd to (*) ( h ) - ( i ) : Uncaught SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "null" from accessing a frame with origin "null". Protocols, domains, and ports must match. Linijka powodująca błąd to (**) ( j ) : Uncaught TypeError: Object #<HTMLEmbedElement> has no method 'contentDocument'. Linijka powodująca błąd to (**) Odpalałem to na Google Chrome 33.0.1750.154 m Nie mam pojęcia, jak to w takim razie zrobić. Szukałem tych błędów w google i zdaje się, że problem jest z tym, że plik svg jest umiejscowiony lokalnie (gdybym mógł dać link w postaci http://..., to by niby poszło), ale nie wiem, czy dobrze zrozumiałem i dlaczego to miałby być problem. Gdzieś znalazłem różne dywagacje na temat ,,same origin policy", ale przecież te dwa pliki są w jednym źródle. Nie chodzi mi też o to, by w pliku svg zasysać plik proba.js, bo kliknięcie musi operować na danych, które są zewnętrzne wobec pliku svg. Ten post edytował Berkovits 22.03.2014, 19:00:33 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Obiekt XMLHttpRequest nie operuje na protokole file://
Dla testów możesz uruchamiać Chrome z przełącznikiem: --allow-file-access On ChromeOS, file:// access is disabled except for certain whitelisted directories. This switch re-enables file:// for testing. Idąc dalej, kolo.svg ładuje się po protokole http:// poprawnie, ale nie wiem dlaczego zdarzenia dołączasz do trzech pozostałych elementów, a nie próbujesz do SVG wczytanego do diva. -------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 0 Dołączył: 25.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
Do trueblue: Dzięki za odpowiedź.
Wpisałem tyle prób, bo szukam dobrego rozwiązania. Żadna z tych prób nie zadziałała. Nie chodzi mi o przełączanie ustawień do testów, ponieważ w założeniu ten program ma działać na plikach zapisanych lokalnie (nie w internecie). Ponieważ nie ładuje mi się do diva, próbuję dalej z object, iframe, embed. Nic nie działa. Dziwi mnie to, że nie można zrobić tak, jak z javascript. Jeśli mam js w osobnym pliku, to dołączam go bez problemu. Niestety, nie można zrobić czegoś takiego: <svg src="kolo.svg"></svg>. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Powyżej jest przeróbka kodu, działa, ale po protokole http:// Nie musisz publikować w internecie, postaw sobie na komputerze serwer http (http://pl.wikipedia.org/wiki/XAMPP) -------------------- |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 0 Dołączył: 25.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
Do trueblue: Wcześniej nie mogłem odpisać.
Dzięki za pomoc. Będę się musiał pogodzić, że nie da się tego zrobić offline bez serwera. Muszę przyznać, że jestem tym rozczarowany. Piszę grę dla córki z rozpoznawaniem państw, flagi, itd. Chciałem, by składała się z kilku plików, które można uruchomić na swoim komputerze. Chciałem móc przekazać innym znajomym rodzicom, by i oni mogli sobie uruchamiać bez stawiania serwera. Ale trudno, choć jestem tym bardzo zdziwiony. Oczywiście mogę wrzucić svg do pliku html, ale to po pierwsze masakra (bo to duży plik), a ponadto nie ma możliwości wyboru mapy. A tak w ogóle, to na starej instalacji Opery zadziałała opcja (e), czyli załadowanie do <embed> i odwołanie się do zawartości poprzez getSVGDocument(). Chrome wyświetla security error. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Wraz z plikami gry dołącz skrót do wywołania Chrome z przełącznikiem, o którym pisałem.
-------------------- |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 Pomógł: 0 Dołączył: 24.04.2014 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Zastanawiałem się nad Twoim problemem wczoraj przed snem i doszedłem do wniosku że jeśli nie potrzebujesz bardzo koniecznie używać svg to można to zrobić troszeczkę inaczej. Z pomocą może tutaj przyjść dawna "zabawka" Microsoft, która aktualnie jest wspierana wraz z Internet Explorer. Mowa o rozszerzeniu hta (mshta.exe) <!DOCTYPE html> <html> <head> <title>Czater</title> <meta http-equiv="X-UA-Compatible" content="IE=8"/> // 8 to minimum jak ktoś używa ie9 to można wpisać 9 // <meta charset="utf-8" /> <HTA:APPLICATION id="id aplikacji" applicationName="Nazwa dla aplikacji (indywidualna) " border="thin" borderStyle="normal" caption="yes" icon="favicon.ico" // mozna ustawić ionkę dla 'programu' // maximizeButton="yes" minimizeButton="yes" showInTaskbar="yes" windowState="normal" innerBorder="no" navigable="no" scroll="no" scrollFlat="yes" singleInstance="no" sysMenu="yes" contextMenu="no" selection="yes" version="wersja aplikacji" /> <script> duuuuuuuuuuużo javascript'u </script> <body> elementy html z których będzie zbudowana aplikacja </body> </html> To taki prosty schemat, można też użyć elementów svg ale wtedy wymagany jest IE9 minimum zainstalowany w systemie. W takiej aplikacji śmiało można zastosować bibliotekę JQuery a nawet bootstrap'y jak html kickstarter np. Odnośnie zapisywania postępów gry np można użyć zwyczajnych cookies ![]() Odnośnie Twoich kółeczek ![]() <map name="a"> <area shape="circle" coords="200,250,25" onclick="wywołanie skryptu z parametrem" /> <area shape="rect" coords="25,25,75,75" onclick="wywołanie skryptu z parametrem" /> </map> <img usemap="#a" src="image.png"> Mapa globu z rejonami do klikania ![]() Myślę że to może być nie głupie rozwiązanie ![]() Pozdrawiam |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.07.2025 - 07:22 |