Little Strange Software

スマホアプリの開発を行う LittleStrangeSoftware のブログです。

【JavaScript】しましま枠線メーカーのコード、と、その簡略化【使い捨て配列】

 どうも!LSSです!!

 

この記事は、JavaScript初学者向けの記事となります。

 

先日の記事、

は、CSSを用いた枠線(囲み枠)のコードを生成するツールでした。

 

そのツール自体のコードはJavaScriptで書いていましたが、今回はそのコードの公開です。

ついでに、その中で冗長的(無駄)と思われた部分があったのが気になっていたのですが、簡略化に成功したので覚え書き。

 

なお、スクリプト自体は

で解説した方法と同じ作り方で作成しています。

 

 

しましま枠線メーカー コード

<p>サンプル</p>
<div id="gamen"></div>
<p> </p>
<p><input id="col1" type="color" value="#000000" /> <input id="col2" type="color" value="#75ff7a" /></p>
<p>角度:<input id="rg1" style="width: calc(100% - 50px);" max="180" min="0" type="range" value="135" /></p>
<p>太さ:<input id="rg2" style="width: calc(100% - 50px);" max="50" min="1" type="range" value="10" /></p>
<p>シマ:<input id="rg3" style="width: calc(100% - 50px);" max="10" min="1" type="range" value="2" /></p>
<p> </p>
<p>コード</p>
<div id="cdtxt" style="background-color: #eeeeee; padding: 0.6em; border-radius: 5px;"></div>
<p>
<script>
col1.addEventListener('input',chgpp,false);
col2.addEventListener('input',chgpp,false);
rg1.addEventListener('input',chgpp,false);
rg2.addEventListener('input',chgpp,false);
rg3.addEventListener('input',chgpp,false);
chgpp();
function chgpp(e){
txt='<div style="border: '+rg2.value+'px solid; border-image: repeating-linear-gradient('+rg1.value+'deg,'+col1.value+','+col2.value+','+col1.value+' '+rg3.value+'%) '+rg2.value+'; padding: 5px;">こんな感じのシマシマ模様の枠になります。<br/>お気に入りの色・角度を見つけてください^^</div>';
gamen.innerHTML=txt;
cdtxt.innerHTML=txt.replace(/</g,'&lt;').replace(/>/g,'&gt;');
}
</script>
</p>

 

 

冗長と思った部分

コード

col1.addEventListener('input',chgpp,false);
col2.addEventListener('input',chgpp,false);
rg1.addEventListener('input',chgpp,false);
rg2.addEventListener('input',chgpp,false);
rg3.addEventListener('input',chgpp,false);

この箇所ですね。

この5行、5つの入力パーツに対してそれぞれ「変更が加えられたら、chgpp関数を実行する」というイベントリスナーを仕掛けている部分ですが、見て分かる通り
「文頭数文字が違うだけであとは全く同じものを並べている」
んですね^^;

 

こういうのこそ、配列でなんとかしたいところです。

…別解として、入力パーツをHTMLの方でDIVタグなどでひとまとめにして…という手も考えられますが、ここでは配列にこだわってみます。

さらに、イベントリスナーを一度仕掛けるだけの話なので、なんなら配列を変数に代入する事なく使う事はできないか?とも。

 

 

1行で出来ました^^

[col1,col2,rg1,rg2,rg3].forEach(ele=>ele.addEventListener('input',chgpp,false));

 

↑ 件の5行をこんな形に置き換えても、ちゃんと動作します^^
(eleは任意の変数名、chgppは任意の関数名、「col1,col2,rg1,rg2,rg3」はHTML要素につけた任意のIDです。)

[配列の列挙].処理;

という形で、配列の即時利用が出来るんですね。

 

この方法でも、IDをそのまま書く事で、HTMLの要素を配列として捕らえる事ができるようです。

 

HTML要素に対してJavaScriptから操作する場合、自分は

ID名.処理;

のような書き方を好み、それでも動作していますが、世の多くの解説サイトでは

document.getElementByID('ID名').処理;

という書き方で説明されています。

 

そちらの書き方に合わせた方法で書くと、以下のようになります。

['col1','col2','rg1','rg2','rg3'].forEach(ele=>document.getElementById(ele).addEventListener('input',chgpp,false));

 

 

あとがき

繰り返し処理ととっても相性のいい配列ですが、変数に代入しなくても、

[配列の列挙].処理;

で扱えるんですね^^

 

今回は、

[配列の列挙].forEach(変数=>変数を使った繰り返し行われる処理);

という形で書く事で、1行で複数回繰り返す処理を記述する事ができました^^

 

 

 

ってなとこで、今回はこのへんで!

次回もまた、よろしくお願いします^^