Webサイト制作-8日目(JavaScript)

JavaScript

JavaScriptはオブジェクト指向言語の側面も持っている。オブジェクトを見ていこう。
[オブジェクトの定義]
jsでは波括弧でオブジェクトを定義する。以下は空のオブジェクト

let obj={};

以下はpenオブジェクト。プロパティ名:値でプロパティを定義していく。

let pen={
  color:"red",
  length:3
}

昨今のjsはクラス構文も使えるようになった。classを作成してみよう。
コンストラクタでプロパティを定義する。

class Pen{
    constructor(length){
        this.length=length;
    }
    write(){
        this.length-=0.5;
        return '書きました';
    }
}
let pen=new Pen(3);//長さ3でインスタンス作成

クラスの作成方法、インスタンスの生成方法がわかったところで、実際にソースを記述してみよう。
jsLesson6.htmlとして以下を記述する。

●jsLesson6.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>jsレッスン</title>
</head>
<body>
  <button onclick="btWrite()">書く</button>
  <button onclick="btCheck()">長さ見る</button>
  <div id="result"></div>
<script>
const result=document.getElementById("result");
class Pen{
    constructor(length){
        this.length=length;
    }
    write(){
        this.length-=0.5;
        return '書きました';
    }
}
let pen=new Pen(3);

const btWrite=()=>{
    let msg=pen.write();
    result.textContent=msg;
};

const btCheck=()=>{
    result.textContent=`長さは${pen.length}です。`;
};
</script>
</body>
</html>

ブラウザで実行してみよう。書くボタンで「書きました」長さ見るボタンで「長さは◯です。」と表示されれば成功だ。

Q1.Penクラスを作成し、3つのインスタンスを作ることによって以下のアプリを作成せよ。
1.スタート画面 4つのボタンが表示されている。

2.書くを押して見る。ペンをまだ持っていないので叱られる。

3.赤を持つをクリック

4.書くをクリック(押すたびに長さが減っていく)

[解答例]

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    
    <title>Document</title>
</head>
<body>
   <button class="select">赤を持つ</button> 
   <button class="select">緑を持つ</button> 
   <button class="select">青を持つ</button> 
   <button onclick="writePen()">書く</button> 
   <p id="info"></p>
   <script>
       class ColorPen{
           constructor(color,length){
               this.color=color;
               this.length=length;
           }
           write(){
               let msg='';
               if(this.length<=0){
                    msg='もうかけません!';
                    
               }else{
                    this.length-=0.5;
                    msg=this.color+'で書いた。残りの長さ'+this.length;
               }
               return msg;
           }
       }
       const bts=document.querySelectorAll('.select');
       let pens=[new ColorPen('赤',10),new ColorPen('緑',10),new ColorPen('青',10)];
       let pen=null;
       const info=document.getElementById('info');
       for(let i=0;i<bts.length;i++){
           bts[i].addEventListener('click',()=>{
                pen=pens[i];
                info.textContent=pen.color+'を持った。';
           });
       }
       const writePen=()=>{
           let msg='';
           if(pen==null){
            msg='ペンを持ってください!';
           }else{
            msg=pen.write();
           }
           info.textContent=msg;
       }; 
   </script>
</body>
</html>

[CSSの操作]
jsから動的にcssを操作できる。以下のソースを入力
●jsLesson7.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>jsレッスン</title>
</head>
<body>
<div id="box"></div>
<script>
let ele=document.getElementById("box");
ele.style.width="300px";
ele.style.height="200px";
ele.style.backgroundColor="blue";
ele.style.padding="10px";
ele.style.color="white";
ele.textContent="sample";
</script>
</body>
</html>

実行してみて以下のようになれば成功だ。

[ソースコード解説]
11~15行目:element(要素)が持つstyleオブジェクトのプロパティに値をセットしている。基本的にはcssの書き方に準じるが、background-colorなどのハイフン混じりのプロパティはbackgroundColorとキャメルケースで記述しなければならない。

Q2.先ほど作ったペンアプリを改良し、鉛筆の長さを長方形で表せるようにせよ。詳しくは実行例参照のこと
1.ペンを持つとペンの色を背景色とした長方形がペンの長さで描画される。

2.書くと長方形も短くなる。

[解答例]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
 <button class="select">赤を持つ</button> 
 <button class="select">緑を持つ</button> 
 <button class="select">青を持つ</button> 
 <button onclick="writePen()">書く</button>
 <p id="info"></p>
 <div id="graph"></div>
 <script>
   class ColorPen{
     constructor(color,code,length){
       this.color=color;
       this.code=code;
       this.length=length;
     }
     write(){
       let msg='';
       if(this.length<=0){
         msg='もう書けません!';
       }else{
         this.length-=0.5;
         msg=this.color+"で書いた。残りの長さ"+this.length;
       }
       return msg;
     }
   }
   
   const bts=document.querySelectorAll('.select');
   //const bts=document.getElementsByClassName('select');
   let pens=[
     new ColorPen('赤','red',10),
     new ColorPen('緑','green',10),
     new ColorPen('青','blue',10),
    ];
   let pen=null;
   const graph=document.getElementById("graph");
   const info=document.getElementById('info');
   for(let i=0;i<bts.length;i++){
     bts[i].addEventListener('click',()=>{
       pen=pens[i];
       info.textContent=pen.color+'を持った。';
       setStyle();
     });
   }
   const writePen=()=>{
     let msg='';
     if(pen==null){
       msg='ペンを持ってください!';
     }else{
       msg=pen.write();
       setStyle();
     }
     info.textContent=msg;
   };
   const setStyle=()=>{
       graph.textContent=pen.length+"cm";
       graph.style.width=pen.length+"cm";
       graph.style.backgroundColor=pen.code;
       graph.style.color='yellow';
   };
 </script>
</body>
</html>

コメント

タイトルとURLをコピーしました