單一SVG檔案,瀏覽器卻使用XML格式型態顯示

後端在處理SVG輸出時候遇到一個詭異的問題,明明是合法的SVG格式丟到前端瀏覽器,但是瀏覽器卻以XML的文字型態顯示在畫面上(瀏覽器自動以內建的XML檢視器顯示),也確認過Http Header的Content-Type(MIME)確定有輸出「image/svg+xml」,無論如何就是無法以繪圖的方式用影像來呈現。

假設有一個網址為http://localhost/sample.svg,其內容如下:

<svg>
  <path stroke="#069" fill="transparent" stroke-width="3" d="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80" />
</svg>

結果會如下圖所示,呈現一條藍色的正弦波(亦可證明這個SVG在HTML是可正常顯示的):

若以單一資源檔案的方式打到前端瀏覽器,SVG卻被Chrome瀏覽器以內建的XML閱覽器解釋,已經確認Content-Type:image/svg+xml。

在一串WTF的疑問中最後找到原來是要在svg標籤處加上xmlns attribute才可以,這個發現也認識到原來HTML5對於SVG是具有排斥性的(SVG誕生於XHTML時代,他...是一段XML啊!),加上去就可以在瀏覽器中單獨解釋(渲染)畫面了。

<svg xmlns="http://www.w3.org/2000/svg">
  <path stroke="#069" fill="transparent" stroke-width="3" d="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80" />
</svg>

覺得HTML5之於SVG是很相容的人,可以試著把上面這串SVG內容宣告成Javascript的一個字串,然後用jQuery或是純Javascript的方式直接append到某個DIV標籤之類的,理論上應該很簡單吧,自己試看看就「知苦」,為了這個簡單的動作保證可以搞到你懷疑人生。

簡單的說,建議SVG這種東西在Javascript動態引入時期,最後還是放在img標籤的src屬性裡面為上策。

SVG ContentType MIME Browser SingleResource View Display XML XmlViewer XmlFormatter