2009-03-17 14 views
59

Piszę trochę javascript i muszę wybrać między SVG lub VML (lub obu, lub coś innego, to dziwny świat). Chociaż wiem, że na razie tylko IE obsługuje VML, wolałbym raczej wykrywać funkcjonalność niż platformę.Jak wykryć obsługę VML lub SVG w przeglądarce

Wygląda na to, że SVG ma kilka właściwości, na które można przejść: window.SVGAngle na przykład.

Czy to najlepszy sposób na sprawdzenie obsługi SVG?

Czy istnieje odpowiednik VML?

Unfortuntaly - w firefox mogę całkiem szczęśliwie zrobić wszystkie renderowania w VML bez błędu - po prostu nic nie dzieje się na ekranie. Trudno jest wykryć tę sytuację ze skryptu.

+1

ciekawy artykuł na ten argument: http://voormedia.com/blog/2012/10/displaying-and-detecting-support-for-svg-images – Pisu

Odpowiedz

39

Do wykrywania VML, oto co google maps does (wyszukiwanie "function Xd"):

function supportsVml() { 
    if (typeof supportsVml.supported == "undefined") { 
     var a = document.body.appendChild(document.createElement('div')); 
     a.innerHTML = '<v:shape id="vml_flag1" adj="1" />'; 
     var b = a.firstChild; 
     b.style.behavior = "url(#default#VML)"; 
     supportsVml.supported = b ? typeof b.adj == "object": true; 
     a.parentNode.removeChild(a); 
    } 
    return supportsVml.supported 
} 

Rozumiem co masz na myśli o FF: umożliwia dowolne elementy mają być utworzone, w tym elementów VML (<v:shape>). Wygląda na to, że jest to test dla adjacency attribute, który może określić, czy utworzony element jest naprawdę interpretowany jako obiekt vml.

Do wykrywania SVG, to działa dobrze:

function supportsSvg() { 
    return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Shape", "1.0") 
} 
+1

Ok, to jest dobre . Wykrywanie VML działa dobrze, jednak wykrywanie SVG kończy się niepowodzeniem w firefoxie. W rzeczywistości firefox zaprzecza wszystkim możliwościom SVG na http://www.howtocreate.co.uk/tutorials/jsexamples/hasFeature.html. –

+1

Jako kompromis do Firefox łączę moje stare okno.SVGAngle sprawdzam z bardzo dobrym sprawdzeniem funkcji, jeśli się to uda, to jest obsługiwane. Jeśli możesz naprawić, poprawić lub usunąć funkcję supportsSvg, mogę zaakceptować twoją odpowiedź. –

+0

Hmm, działa dla mojego FF (2), w tym ten link. –

56

Sugeruję jeden uszczypnąć do crescentfresh na odpowiedź - używać

document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") 

zamiast

document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Shape", "1.0") 

wykryć SVG. WebKit jest obecnie bardzo wrażliwy na funkcje raportowania i zwraca wartość false dla feature#Shape pomimo stosunkowo solidnej obsługi SVG. Opcja feature#BasicStructure jest sugerowana w komentarzach do https://bugs.webkit.org/show_bug.cgi?id=17400 i daje mi odpowiedzi, których oczekiwałem w Firefox/Opera/Safari/Chrome (true) i IE (false).

Należy pamiętać, że podejście implementation.hasFeature zignoruje obsługę za pomocą wtyczek, więc jeśli chcesz sprawdzić np. wtyczkę Adobe SVG Viewer dla IE musisz zrobić to osobno. Wyobrażam sobie, że to samo dotyczy wtyczki RENESIS, ale nie sprawdziłem.

+0

Dobre połączenie. Prawie chodziłam po tej kopalni. – Phil

+0

To wydaje się niepoprawnie zgłosić true na firefox v3.6.17. – Julian

+0

Nie działa na chrome. – masterxilo

4

Można pominąć tę opcję i skorzystać z biblioteki JS, która pozwoli na tworzenie grafiki wektorowej w różnych przeglądarkach, jeśli taka jest intencja. Biblioteka zajmie się tym, wysyłając do SVG, jeśli jest obsługiwana lub zastępuje płótno, VML, flash, silverlight, itp., Jeśli nie, w zależności od tego, co jest dostępne.

Przykłady bibliotek, które zrobi to są w przypadkowej kolejności:

+1

Dema raphaeljs są niesamowite. +1 za to, że mnie do tego przekonałeś. – Koobz

+2

Raphael jest rzeczywiście niesamowity, kocham go i polecam go wszystkim. Ale było to zbyt wolne dla jednej konkretnej rzeczy, którą chciałem zrobić. Nie czułem też, że sposób, w jaki raphael wykrył svg, był bardzo miły (nie pamiętam, co to było teraz) i zastanawiał się, czy istnieje lepszy, bardziej oficjalny sposób, aby to zrobić, stąd pytanie. –

47

Kontrola SVG nie działa na mnie w Chrome, więc wyglądało na to, co robi biblioteka modernizatora w ich kontroli (https://github.com/Modernizr/Modernizr/blob/master/modernizr.js).

podstawie ich kodu, to co pracował dla mnie:

function supportsSVG() { 
    return !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', "svg").createSVGRect; 
    } 
3
var svgSupport = (window.SVGSVGElement) ? true : false; 

Works, jeśli założymy, że przeglądarek innych niż SVG są IE5.5 lub lepiej i może obsługiwać VML. Testowany na IE6, Firefox 8, Chrome 14.0.

Raphael jest bardzo fajny, ale nie obsługuje koncepcji grup, które mogą ograniczać się w zależności od tego, co robisz. Dmitry prawdopodobnie mnie jednak za to powie.

+2

Może zasugeruję 'var svgSupport = !! (window.SVGSVGElement);' –

+0

Możesz! Naprawdę nie znam Jacka o JavaScript. –

1

Z drugiej strony ... Gdy chcesz wiedzieć, zanim służyć strony: Zeskrobać tej strony: http://caniuse.com/#cats=SVG&statuses=rec&nodetails=1 Dla przychodzących agenta przeglądarki/użytkownika. Nota prawna: Jeszcze nie wdrożyłem tego. Mam nadzieję, że caniuse.com opublikuje api do pracy.

Markt

+0

Tak, wolałbym pracować z API również. W moim przypadku korzystałem z plików statycznych, więc nie była to opcja, ale dobry pomysł. –

3

Możesz sprawdzić http://www.modernizr.com/docs/#features-misc ponieważ zawiera wsparcie dla rzeczywistej zdolności wykrywania SVG w przeciwieństwie do aplikacji klienckiej wąchania, które mogą być łatwo uszkodzone.

+0

Tak, modernizator jest dobrą odpowiedzią na ten problem w dzisiejszych czasach. –

2

Kontrola SVG nie działała w Chrome, ponieważ określa wersję 1.0. To powinno działać lepiej:

document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Shape", "1.1") 
Powiązane problemy