自分もサッと書いた手前申し訳ないのですが,現状の回答のつき方だと初学者の方は混乱すると思いますのでもうちょっと書きます.
背景
以前の質問において以下のようなフォームがあり,
<div id="timedisplay">00:00</div>
<form>
<input type="button" id="number1" value="1" onclick="btnOneClick();">
<input type="button" id="number2" value="2" onclick="btnTwoClick();">
<input type="button" id="number3" value="3" onclick="btnThreeClick();"><br>
<input type="button" id="number4" value="4" onclick="btnFourClick();">
<input type="button" id="number5" value="5" onclick="btnFiveClick();">
<input type="button" id="number6" value="6" onclick="btnSixClick();"><br>
<input type="button" id="number7" value="7" onclick="btnSevenClick();">
<input type="button" id="number8" value="8" onclick="btnEightClick();">
<input type="button" id="number9" value="9" onclick="btnNineClick();"><br>
<input type="button" id="number0" value="0" onclick="btnZeroClick();"><br>
</form>
そのうえで質問文のような無限にある関数をどうすべきかという内容です.
function btnOneClick() {
target = document.getElementById('timedisplay');
const base = target.innerText.replace(':', '');
const newDisplay = base.substr(1, 3) + '1';
const a = newDisplay.slice(0, 2);
const b = ':';
const c = newDisplay.slice(2);
let nnDisplay = a + b + c;
console.log(nnDisplay);
document.getElementById('timedisplay').textContent = nnDisplay;
target.innerText = nnDisplay;
};
共通化方法
引数をとる関数を作る
処理のメインを何回も書くのは面倒なので関数化します.
私が最初に書いたやつです.
引数strを取って#timedisplay
に追記します.
処理内容はほとんどオリジナルから変えていないので省略します.
function btnClick(str) {
const target = document.getElementById('timedisplay');
const base = target.innerText.replace(':','');
const newDisplay = base.substr(1,3)+ str; // 型チェックとかいるなら自前で
const a = newDisplay.slice(0,2);
const b = ':';
const c = newDisplay.slice(2);
let nnDisplay = a + b + c;
console.log(nnDisplay);
document.getElementById('timedisplay').textContent = nnDisplay;
target.innerText = nnDisplay;
};
そのうえでonclick
属性側からはこんな感じで引数を渡してやります.
<form>
<input type="button" id="number1" value="1" onclick="btnClick(1);">
<input type="button" id="number2" value="2" onclick="btnClick(2);">
<input type="button" id="number3" value="3" onclick="btnClick(3);"><br>
<input type="button" id="number4" value="4" onclick="btnClick(4);">
<input type="button" id="number5" value="5" onclick="btnClick(5);">
<input type="button" id="number6" value="6" onclick="btnClick(6);"><br>
<input type="button" id="number7" value="7" onclick="btnClick(7);">
<input type="button" id="number8" value="8" onclick="btnClick(8);">
<input type="button" id="number9" value="9" onclick="btnClick(9);"><br>
<input type="button" id="number0" value="0" onclick="btnClick(0);"><br>
</form>
なお引数がなんなのかという内容は,わざわざここに書くよりその辺の解説を見たほうが良いです.
イベントハンドラでonclickすら省略
こうなると毎回onclick
を書くのも面倒なので,イベントハンドラをまとめて登録してやります.
@think49 さんが書いてるやつです.
document.querySelectorAll('input[type=button]').forEach(button=> {
button.addEventListener('click', event => btnClick(event.target.value));
});
やっていることとしては
-
document.querySelectorAll('input[type=button]')
でbuttonを全部取り出す(input[type=button]
は他のボタンも捕捉してしまいますので,適宜調整してください)
-
.forEach(button => { ... }
で,取り出したbuttonのすべてに適用する処理を書く
- buttonを
click
したときのイベントハンドラevent => btnClick(event.target.value)
をaddEvenetListener
登録する
ここではざっくりとした解説にとどめますが,イベントハンドラはeventという引数を受け取るお約束があり,event.target
にクリックした要素の情報が入っています.
そのうえでevent.target.value
でbuttonのvalue属性値を読みだしてbtnClick
を呼びだすという流れです.
querySelectorAllは下手なセレクタだと余計なbuttonも捕捉してしまったり,addEventListenerのthisバインドなんかもややこしい仕様があったりするので,慣れてから使うと良いでしょう.
@tonberry1050
このくらいならここで引数指定してもいいですが、eventは作法みたいなものです。
onclick属性には実行する文を直接入力できます.eventは勝手に渡されません.