一白山中

自分を磨き、自分なりの幸せを追求しよう

JavaScript関数2

関数は、イベントまた呼び出されると、繰り返し利用できるソースの塊である

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>テスト事例</title>
<script>
function myFunction()
{
    alert("Hello World!");
}
</script>
</head>
 
<body>
<button onclick="myFunction()">クリックしてください</button>
</body>
</html>

 

関数フォーマット

function(キーワード) functionname()
{
    // 実行ソース(関数そのもの)
}

 

関数名には、大文字小文字を区別に認識する

 

引数持つ関数の利用

<!DOCTYPE html>
<html>    
<head> 
<meta charset="utf-8"> 
<title>一白山中(ennya.hatenablog.com)</title> 
</head>
<body>

<p>このボタンをクリックして、引数必要な関数を利用する</p>
<button onclick="myFunction('Harry Potter','Wizard')">ここクリックしてください</button><!--関数利用する際には、引数を順番正しく指定すべきである-->
<script>
function myFunction(name,job){ //関数定義する際にも、引数を順番的に指定する必要がある
    alert("Welcome " + name + ", the " + job);
}
</script>

</body>
</html>

 

戻り値がある関数

return キーワードで実現できる。実施されると、関数の処理が中止される。

 

<!DOCTYPE html>
<html>
<head> 
<meta charset="utf-8"> 
<title>一白山中(ennya.hatenablog.com)</title> 
</head>
<body>

<p>この例で利用される関数は、計算を行い、結果を返す</p>
<p id="demo"></p>
<script>
function myFunction(a,b){
    return a*b;
}
document.getElementById("demo").innerHTML=myFunction(4,3);
</script>

</body>
</html>

 

sayHi();
function sayHi(name,message){
    document.write("return 文実行する前");
    return;
    alert("hello" + name +"," + message);//この行の処理は実行されない
}

ある条件で、関数をただ中断することもできる

function myFunction(a,b)
{
    if (a>b)
    {
        return;
    }
    x=a+b
}

 

関数内部の変数は、関数内部だけで有効で、関数処理完了後に処分される。ですので、違う関数の中には同じ名前の変数でOKである。

一方、関数外にある変数はすべてのjavascript処理に利用されることは可能である。

変数の生成時間は、宣言されたときにある。終了時間は、関数内部の分は関数処理完了後にあり、関数外部の分は、サイトが閉じられたときにある。

宣言されてない変数に値を付与すると、window の一つ属性としてみられる。

var var1 = 1; 
var2 = 2; 

console.log(this.var1); // 1
console.log(window.var1); // 1
console.log(window.var2); // 2

delete var1; // false 削除できない
console.log(var1); //1

delete var2; 
console.log(delete var2); // true
console.log(var2); // 削除したので、未定義のエラーになる

 

シンプル計算機

var result_1;
//+
function add() {alert(1);
  var a = getFirstNumber();
  var b = getTwiceNumber();
  var re =Number( a) +Number( b);
  sendResult(re);
}

//-
function subtract() {
  var a = getFirstNumber();
  var b = getTwiceNumber();
  var re = a - b;
  sendResult(re);
}

//*
function ride() {
  var a = getFirstNumber();
  var b = getTwiceNumber();
  var re = a * b;
  sendResult(re);
}

// /
function devide() {
  var a = getFirstNumber();
  var b = getTwiceNumber();
  var re = a / b;
  sendResult(re);
}

//pタグに値賦与
function sendResult(result_1) {
  var num = document.getElementById("result")
  num.innerHTML = result_1;
}

//最初の数字を獲得
function getFirstNumber() {
  var firstNumber = document.getElementById("first").value;
  return firstNumber;
}

//二番目の数字を獲得する
function getTwiceNumber() {
  var twiceNumber = document.getElementById("twice").value;
  return twiceNumber;
}

<p>シンプル計算機</p>
<table border="1" style="position:center;">
  <tr>
    <td>最初の数字:</td>
    <td><input type="text" id="first"/></td>
  </tr>
  <tr>
    <td>二番目の数字:</td>
    <td><input type="text" id="twice"/></td>
  </tr>
  <tr>
    <td colspan="2" >
      &nbsp;
      <button style="width:inherit" onclick="add()">+</button>
      &nbsp;
      <button style="width:inherit" onclick="subtract()">-</button>
      &nbsp;
      <button style="width:inherit" onclick="ride()">*</button>
      &nbsp;
      <button style="width:inherit" onclick="devide()">/</button>
    </td>
  </tr>
  <tr>
    <td colspan="2" rowspan="2">
      <p id="result"></p>
    </td>
  </tr>
</table>

 

チェックボックスの事例

読書:<input type="checkbox" name="checkbox" value=1><br>
書く:<input type="checkbox" name="checkbox"value=2><br>
スマホ見る:<input type="checkbox" name="checkbox"value=3><br>
ゲームする:<input type="checkbox" name="checkbox"value=4><br>
<button onclick="checkboxed('checkbox')">すべてチェック</button>
<button onclick="uncheckboxed('checkbox')">すべて取り消し</button>

function checkboxed(objName){
    var objNameList=document.getElementsByName(objName);    

    if(null!=objNameList){
        alert("すべてチェック操作");
        for(var i=0;i<objNameList.length;i++){
            objNameList[i].checked="checked";
        }
    }
}

function uncheckboxed(objName){
    var objNameList=document.getElementsByName(objName);    

    if(null!=objNameList){
        alert("すべて取り消し操作");
        for(var i=0;i<objNameList.length;i++){
            objNameList[i].checked="";
        }
    }
}

 

上記機能を一つボタンで実現する

読書:<input type="checkbox" name="checkbox" value=1><br>
書く:<input type="checkbox" name="checkbox"value=2><br>
スマホ見る:<input type="checkbox" name="checkbox"value=3><br>
ゲームする:<input type="checkbox" name="checkbox"value=4><br>
<button onclick="allcheck()">すべてチェックする/取り消し</button>

var checkAll = false;
function allcheck(){
    checkAll = !checkAll;
    let inputs = document.getElementsByName('checkbox')
    for(var i =0;i<inputs.length;i++){inputs[i].checked = checkAll}
}

上記debugした後

var checkAll = false;
function allcheck() {
    let inputs = document.getElementsByName('checkbox');
    var checkInt = 0;
    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].checked) {
            checkInt += 1;
        }
    }
    if (checkInt == inputs.length) {
        checkAll = false;
        for (var i = 0; i < inputs.length; i++) {
            inputs[i].checked = checkAll
        }
    } else {
        checkAll = true;
        for (var i = 0; i < inputs.length; i++) {
            inputs[i].checked = checkAll
        }
    }
}

 

簡潔バージョン

var checkAll = false;
function allcheck(){
    checkAll = !checkAll;
    let inputs = document.getElementsByName('checkbox')
    for(var i=0;i<inputs.length-1;i++){
      if (inputs[i].checked==inputs[i+1].checked){
            if (i==inputs.length-2){
                if(inputs[i].checked==true){
                    checkAll=false;
                }else checkAll=true;
            }
      } 
    }
    for(var i =0;i<inputs.length;i++){inputs[i].checked = checkAll}
}

 

さらに簡潔する

var checkAll = false;
function allcheck(){
    checkAll = !checkAll;
    let inputs = document.getElementsByName('checkbox')
    for(var i =0;i<inputs.length;i++){
        for (var j = 0; j < inputs.length; j++) {//すでにすべてチェックかどうかの確認
            if (inputs[j].checked == true) {
                checkAll = false;
            }else{
                checkAll = true;
                continue;
            }
        }
        
        inputs[i].checked = checkAll;
    }
}

さらにさらに簡潔

function allcheck(){
    var checkFlag = false;    //ディフォルト操作はすべて取り消し
    var inputs = document.getElementsByName('checkbox');
    for(var i = 0; i < inputs.length; i++) {
        if(!inputs[i].checked) {    //もし、チェックしてない状態ですと、すべてチェック実行する
            checkFlag = true;
            break;    //つけると処理時間短縮できるが、結果に影響しない
        }
    }
    for(var i = 0; i < inputs.length; i++) {
        inputs[i].checked = checkFlag;
    }
}

 

最終の簡潔

読書:<input type="checkbox" name="checkbox" value=1><br>
書く:<input type="checkbox" name="checkbox"value=2><br>
スマホみる:<input type="checkbox" name="checkbox"value=3><br>
ゲームする:<input type="checkbox" name="checkbox"value=4><br>
<input type="button" value="すべてチェック" onclick="allcheck(this)">
<script>
var checkAll = false;
function allcheck(element){
    checkAll = !checkAll;
    element.value=checkAll?"すべて取り消し":"すべてチェック";
    let inputs = document.getElementsByName('checkbox') 
    for( var index in inputs){
        inputs[index].checked = checkAll;
    }
}
</script>

上記を踏まえて、逆チェックの追加

読書:<input type="checkbox" name="checkbox" value=1><br>
書く:<input type="checkbox" name="checkbox"value=2><br>
スマホ見る:<input type="checkbox" name="checkbox"value=3><br>
ゲームする:<input type="checkbox" name="checkbox"value=4><br>
<button onclick="opcheckboxed('checkbox', 'checkall')">すべてチェック</button>
<button onclick="opcheckboxed('checkbox', 'uncheckall')">取り消し</button>
<button onclick="opcheckboxed('checkbox', 'reversecheck')">逆チェック</button>

function opcheckboxed(objName, type){
  var objNameList=document.getElementsByName(objName);
  if(null!=objNameList){
    for(var i=0;i<objNameList.length;i++){  
      if(objNameList[i].checked==true)
      {
        if(type != 'checkall') {  // すべてチェックじゃなければ
          objNameList[i].checked=false;
        }
        
      } else {
        if(type != 'uncheckall') {  // 取り消しじゃなければ
          objNameList[i].checked=true;
        }
      }
    }  
  }
}

ES6の新形式、⇒関数

// 通常の関数形式
function Test () {
  //
}

const Test = function () {
  //
}

// ⇒定義形式ですと、 function キーワードを省略できる
const Test = (...params) => {
  //
}

// 一つの引数だけですと、下記の簡潔記載でOK
const Test = param => {
  return param;
}

console.log(Test('hello'));   // hello