- IT Tips
- Ruby / Rails以外の開発一般
READ MORE
var vm = new Vue({
el: "#app",
data: {
h: 163,
s: 84,
l: 77,
},
computed: {
c: function() {
return `hsl(${this.h}, ${this.s}%, ${this.l}%)`
},
},
});
以下はHTML部分の要点のみを抜粋したものです。
<input class="form-control" v-model="c" :style="{backgroundColor: c}" />
<input type="range" min="0" max="360" v-model.number="h" />
<input type="range" min="0" max="100" v-model.number="s" />
<input type="range" min="0" max="100" v-model.number="l" />
length
の結果が正しくならないことがあるサンプルコード07のHTMLに以下のコードがありますが、文字によってlength
の結果が期待どおりにならないことがあります。
<div class='panel-footer'>あと {{140 - b.length}} 文字
</div>
'a'.length // => 1
'あ'.length // => 1
'正'.length // => 1
'𠮷'.length // => 2
上の例では「𠮷」(0x20BB7
)で2が返ります。
これはVue.jsの問題ではなく、JavaScriptの問題です。alphanumericや簡単な漢字・ひらがな・カタカナ(コードポイントがUTF-16の16ビットに収まる場合)のうちはよいのですが、U+10000を超えるとlength
が1つのコードポイントを2とカウントします。
さしあたっての回避法として、BPSアプリチームのyoshiさんが見つけてくれた方法をご紹介します。詳しくは別記事にしたいと思います。
[...'𠮷'].length // => 1
このあたりの闇深い部分については以下が大変参考になります。
参考: JavaScript における文字コードと「文字数」の数え方