LoginSignup
6
4

More than 5 years have passed since last update.

複数imgタグの".svg"を".png"に書き換えるJavaScript

Last updated at Posted at 2016-01-15

Opera Mini ではsvgファイルの日本語が文字化けした

サイト制作でベクター画像を多用しています。
最近のブラウザの多くで対応されているようなので、趣味のサイトであれば問題ないだろうと。

ただ、svgで作ったイラスト内に日本語を入れたところ、Opera Miniで文字化け。
その対処法として、Opera Miniで読み込まれた場合にはsvgファイルではなく、pngファイルを読み込むようなJavaScriptを書いてみました。

なるべくコード量は減らしたいので、各imgタグ内の".svg"の部分だけを".png"に書き換えるコードにしたいと思います。

".svg"を".png"に書き換えるための流れとコード

以下の流れにそって作成しました。

  • 書き換えたいimgタグにクラスsvgを付加
  • svgクラスを持つ要素をすべて取得
  • 各要素ごとに".svg"を".png"に書き換え
  • userAgentを設定して、Opera Mini(Presto)で開いた場合に書き換え
Presto.html

<!--関係ないコードは省略 -->

<img class="svg" src="images/sample1.svg">
<img class="svg" src="images/sample2.svg">

<!--関係ないコードは省略 -->

<script type="text/javascript">
    if (navigator.userAgent.indexOf("Presto") != -1) {
        var svg = document.getElementsByClassName("svg");
        for(var i=svg.length;i--;){
            svg[i].src = svg[i].src.replace(".svg",".png");
        };
    }
</script>

これで無事、Opera Miniではpngファイルが読み込まれるようになりました。

追記

if文の条件式をより簡略化できます。

window.operaminiだけで判定できてしまうのですね。
Opera miniのサイトにも掲載されている内容です。ぜひ御覧ください。
https://dev.opera.com/articles/opera-mini-and-javascript/#detectingmini

@chitoku さん、アドバイスありがとうございました。
コード内容は以下のとおりです。

presto2.html
<!--関係ないコードは省略 -->

<img class="svg" src="images/sample1.svg">
<img class="svg" src="images/sample2.svg">

<!--関係ないコードは省略 -->

<script type="text/javascript">
    if (window.operamini) {
        var svg = document.getElementsByClassName("svg");
        for(var i=svg.length;i--;){
            svg[i].src = svg[i].src.replace(".svg",".png");
        };
    }
</script>
6
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4