簡易的なフォームでDOM操作してみよう[プレビュー機能]
こんにちはkazutoです今回は、フォームに入力をした内容のプレビュー機能を実装していきます。
事前準備
まずは、事前準備を行います。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="keyup.css">
<script src="keyup.js"defer></script>
</head>
<body>
<h1>keyupEvent</h1>
<main>
<form id ="keyupEventFrom">
<textarea name="" id="" cols="30" rows="10"></textarea>
</form>
</main>
<button id ="previewButton"></button>
<textarea class="preview"></textarea>
<div class="textCount"></div>
<div class="keyCode"></div>
<div class="code"></div>
<div class="key"></div>
</body>
</html>
body{
background-color: #222222;
color: white;
font-family: cursive;
}
main{
width: 800px;
height: 500px;
margin: auto;
text-align: center;
}
h1{
text-align: center;
font-size: 50px;
}
#keyupEventFrom{
margin-top: 70px;
}
textarea{
border-radius: 30px;
background-color: #111111;
border: 10px solid black;
color: white;
font-size: 20px;
padding:2px 10px;
font-family: cursive;
}
.preview{
border-radius: 30px;
border: 10px solid black;
font-size: 20px;
padding:2px 10px;
font-family: cursive;
width: 316px;
height: 310px;
background-color: white;
opacity: 0;
color: black;
word-wrap: break-word;
}
button{
height:80px;
width:80px;
border-radius: 100px;
background-color: #111111;
border: 10px solid black;
color: white;
position: absolute;
top: 600px;
left: 620px;
}
.active{
opacity: 1;
position: absolute;
top: 191px;
left: 475px;
}
.white{
background-color: white;
}
.textCount{
position: fixed;
top: 100px;
left: 100px;
text-align: center;
font-size: 50px;
}
.keyCode{
position: fixed;
top: 100px;
right: 100px;
text-align: center;
font-size: 50px;
}
.code{
position: fixed;
top: 400px;
left: 100px;
text-align: center;
font-size: 50px;
}
.key{
position: fixed;
top: 400px;
right:130px;
text-align: center;
font-size: 50px;
}
プレビュー機能を実装するにあたり今回は、keyupイベント
を使用していきます。keyupイベントとはキーが離されたときに発生するイベントです
。
プレビュー画面の表示(clickイベント)
まずはプレビュー画面を表示させていきましょう。
- ノードの取得
- イベント登録
- イベント発火後の処理の実装しよう
ノードの取得
まずは、ノードを取得をしていきます。
const button = document.querySelector("button")
定数(ノード)を定義できた所で、意図したノードを取得できたのか確認をしていきましょう。
console.log(button)
無事ノードを取得できているのが確認をできた所で、次のステップに進みましょう。
イベント登録
ノードが取得ができたので、次にイベントを登録していきましょう。
button.addEventListener("click",()=>{})
イベントが登録できたので、デバックをしてみましょう。
button.addEventListener("click",()=>{console.log("test")})
testという文字列が出力されているので、無事イベントが登録できました。なので次のステップに進みましょう。
イベント発火後の処理の実装しよう
それではイベント発火後の処理を実装していきましょう。
イベントが発火したら
- previewBoxにactiveというクラスと追加&削除する
- button(this)にwhiteというクラスと追加&削除する
button.addEventListener("click",function(){
previewBox.classList.toggle("active")
this.classList.toggle("white")
})
要するにtoggleメソッドを用いて、対象のノードにクラスを追加&削除を行えばOKです。今回は、とてもシンプル且つ簡単なソースコードなので解説は省かせてもらいます。
以上で、「プレビュー画面の表示(clickイベント)」の実装を終了します。
プレビュー機能(keyupイベント)
最後にプレビュー機能を実装していきしょう。実装にあたり,keyupイベントを用いていきます。
- ノードの取得
- イベント登録
- イベント発火後の処理の実装しよう
ノードの取得
まずはノードを取得していきましょう。
const textArea = document.querySelector("textarea")
const button = document.querySelector("button")
const previewBox = document.querySelector(".preview")
const textCount = document.querySelector(".textCount")
const keyCodeText = document.querySelector(".keyCode")
const codeText =document.querySelector(".code")
const keyText = document.querySelector(".key")
previewBox.readOnly = true
定数が定義できた所で、意図したノードを取得できているかデバックをしてみましょう。
function forlogs( elements){
elements.forEach(element=>console.log(element))
}
forlogs([textCount,button,previewBox,textCount,keyCodeText,codeText,keyText])
無事ノードが取得できていますね。確認できた所で、プレビュー用のtextaeraタグ、定数previewBoxのreadOnly属性
を設定おきましょう。
previewBox.readOnly = true
readOnly属性とは、input要素を読み取りする専用にする属性
です。readOnlyという名の通り、readOnly属性が存在する場合のinput要素は、読み取り専用
になります。なので、いくら文字を入力しようとしても弾かれてしまいます。
結論、定数previewBoxは読み取り専用
にし、定数textAreaのvalue値を渡して
、定数previewBoxをプレビュー機能にします。
readOnly属性について理解した所で、次のステップに進みましょう。
イベント登録
ノードを取得できたので、イベントを登録をしていきましょう。登録するイベントはkeyupイベント
です。
textArea.addEventListener("keyup",event=>{})
イベントが登録できた所で、本当にイベントが登録ができたのか確認をするためにconsole.logを用いて、デバックを行いましょう。
textArea.addEventListener("keyup",function(event){
console.log(event.key);
})
keyupイベントでは、少し変わったデバック手法
を用いています。コールバック関数の引数eventnのkeyというインターフェイスにアクセスをして、僕(イベント発火者)がタイピングしたキーを取得しています。要するに打ったキーを取得しています。
イベント発火後の処理の実装しよう
最後にイベント発火後の処理を実装してみましょう。
function bulidHTML(element,value){
element.innerHTML = value
}
textArea.addEventListener("keyup",function(event){
bulidHTML(textCount, `word count<br><span id ="num">${this.value.length}</span>`)
bulidHTML(keyCodeText,`key code<br><span class = "keyT">${e.keyCode}</span>`)
bulidHTML(codeText,`code<br><span id ="code">${e.code}</span>`)
bulidHTML(keyText,`key<br><span class ="keyT"<span>${e.key}</span>`)
previewBox.value = this.value
})
処理内容を言語化をすると、
イベントが発火した場合、bulidHTMLメソッドを用いて、各要素をHTML形式のまま挿入をし、定数previewBoxのvalue値に定数textAreaのvalueを代入
をする。
という内容になります。
function bulidHTML(element,value){
element.innerHTML = value
}
bulidHTML(textCount, `word count<br><span id ="num">${this.value.length}</span>`)
bulidHTML(keyCodeText,`key code<br><span class = "keyT">${e.keyCode}</span>`)
bulidHTML(codeText,`code<br><span id ="code">${e.code}</span>`)
bulidHTML(keyText,`key<br><span class ="keyT"<span>${e.key}</span>`)
今回は、textContent,メソッドを使わず、innerHTMLメソッドを用いてます。innerHTMLメソッドは、要素内の HTML または XML のマークアップを取得したり設定したり
します。したがって、innerHTML に値を代入する際にテンプレートリテラルを用いてHTML形式に記述すれば、HTML要素と認識されHTMLのまま値を挿入する事が可能になります
。
言葉だけでは伝わらない部分もあると思うので実際にElemntツリーを確認をしてみましょう。
画像をご覧いただければ、無事、HTML要素のまま挿入できているのがわかると思います
。
${}の中身は
- this.value.length
→文字数 - e.keyCode
→キー番号 - e.code
→キーの値 - e.key
→キーの値
となります。
previewBox.value = this.value
こちらは、定数previewBoxのvalueに定数textAreaの値を代入をしています。このvalueの受け渡し
があることにより、定数textAreaとpreviewBoxのvalueを紐付け
、プレビュー機能が成り立っています。
以上で、「簡易的なフォームでDOM操作してみよう[プレビュー機能]」の実装を終えます。完成したソースコードは下記に貼り付けておきます。
const textArea = document.querySelector("textarea")
const button = document.querySelector("button")
const previewBox = document.querySelector(".preview")
const textCount = document.querySelector(".textCount")
const keyCodeText = document.querySelector(".keyCode")
const codeText =document.querySelector(".code")
const keyText = document.querySelector(".key")
previewBox.readOnly = true
function forlogs( elements){
elements.forEach(element=>console.log(element))
}
function bulidHTML(element,value){
element.innerHTML =value
}
function keyupEvent(e){
bulidHTML(textCount, `word count<br><span id ="num">${this.value.length}</span>`)
bulidHTML(keyCodeText,`key code<br><span class = "keyT">${e.keyCode}</span>`)
bulidHTML(codeText,`code<br><span id ="code">${e.code}</span>`)
bulidHTML(keyText,`key<br><span class ="keyT"<span>${e.key}</span>`)
previewBox.value = this.value
}
function clickEvent(){
previewBox.classList.toggle("active")
this.classList.toggle("white")
}
function addEvent(eventTarget,eventName,callBack){
eventTarget.addEventListener(eventName,callBack)
}
function events(eventName){
addEvent(textArea,eventName,keyupEvent)
addEvent(button,eventName,clickEvent)
};
const eventNames =["keyup","click"]
eventNames.forEach(eventName=>events(eventName))
まとめ:簡易的なフォームでDOM操作してみよう[プレビュー機能]
今回は、プレビュー機能を実装していきました。使用したイベントは、keyupイベント
になります。「簡易的な送信フォームをDOM操作してみよう」とは少し違った形でフォームをDOM操作をしました。
次のステップとして
- カウントダウンタイマー
- keyupイベント
上記の2つの知識を用いて「タイピングゲーム」を作っても良いかもしれないですね。
以上,kazutoでした。
関連記事