Ajax実践の巻

やっとの思いで読みきった技術書は「読んだだけじゃ良くわからん!」という結論でまとめましたが↓
http://d.hatena.ne.jp/hononano/20060702/p1
「言ったらやらないと駄目よねぇ・・・。」という事で、やってみました!!!


本当ならAjaxにする必要は無く、JavaScriptで十分なものなんですが、まぁまぁそこはお勉強ということで大目に見ていただいて・・・・・。
んじゃあ早速はじめましょう。


【仕様】

・ブラウザで動作する超簡易電卓
・基本的に一般の電卓と同じ動作を行う。
・小数点入力、メモリー機能(M+・M−・MC・MR・GT)は無し


【配置】

”ルートディレクトリ/Calc/”以下に下記ファイルを配置する
・index.html
・test.js
・test.php


【HTML】

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html;charset=SJIS">
  <meta http-equiv="Content-Script-Type" content="text/javascript">
  <title>ajax test</title>
  <script type="text/javascript" src="./test.js"></script>
 </head>
 <form name="frm">
 <body onload="Clear()">
  <table border="1">
   <tr>
    <td bgcolor="silver" width="100" height="20" colspan="4" align="right">
     <div id="disp"></div>
    </td>
   </tr>
   <tr>
    <td>
     <input type="button" id="btn07" onclick="ClickBTN('7')" value="7">
    </td>
    <td>
     <input type="button" id="btn08" onclick="ClickBTN('8')" value="8">
    </td>
    <td>
     <input type="button" id="btn09" onclick="ClickBTN('9')" value="9">
    </td>
    <td>
     <input type="button" id="btn14" onclick="ClickPTN('DIVIDE')" value="÷">
    </td>
   </tr>
   <tr>
    <td>
     <input type="button" id="btn04" onclick="ClickBTN('4')" value="4">
    </td>
    <td>
     <input type="button" id="btn05" onclick="ClickBTN('5')" value="5">
    </td>
    <td>
     <input type="button" id="btn06" onclick="ClickBTN('6')" value="6">
    </td>
    <td>
     <input type="button" id="btn13" onclick="ClickPTN('MULTIPLY')" value="×">
    </td>
   </tr>
   <tr>
    <td>
     <input type="button" id="btn01" onclick="ClickBTN('1')" value="1">
    </td>
    <td>
     <input type="button" id="btn02" onclick="ClickBTN('2')" value="2">
    </td>
    <td>
     <input type="button" id="btn03" onclick="ClickBTN('3')" value="3">
    </td>
    <td>
     <input type="button" id="btn12" onclick="ClickPTN('SUBTRACT')" value="−">
    </td>
   </tr>
   <tr>
    <td>
     <input type="button" id="btn99" onclick="Clear()" value="C">
    </td>
    <td>
     <input type="button" id="btn00" onclick="ClickBTN('0')" value="0">
    </td>
    <td>
     <input type="button" id="btn98" onclick="Calc()" value="=">
    </td>
    <td>
     <input type="button" id="btn11" onclick="ClickPTN('ADD')" value="+">
    </td>
   </tr>
  </table>
  <input type="hidden" id="Total">
  <input type="hidden" id="CalcPtn">
  <input type="hidden" id="ViewFlg">
  <input type="button" id="dbgbtn" onclick="debug()" value="debug">
  <div id="debug"></div>
 </body>
 </form>
</html>

動作説明:
  "C"ボタン押下でClear()を呼び出す
  "0"〜"9"ボタン押下でClickBTN()を呼び出す(引数は押下されたボタンの数字とする)
  "÷"、"×"、"−"、"+"ボタン押下でClickPTN()を呼び出す(引数は押下されたボタンのスペルとする)
  "="ボタン押下でCalc()を呼び出す


【JavaScript】

// HTTP通信用、共通関数
function createXMLHttpRequest(cbFunc){
 var XMLhttpObject = null;
 try{
  XMLhttpObject = new XMLHttpRequest();
 }catch(e){
  try{
   XMLhttpObject = new ActiveXObject("Msxml2.XMLHTTP");
  }catch(e){
   try{
    XMLhttpObject = new ActiveXObject("Microsoft.XMLHTTP");
   }catch(e){
    return null;
   }
  }
 }
 if (XMLhttpObject){
  XMLhttpObject.onreadystatechange = cbFunc;
  return XMLhttpObject;
 }
}

function Clear(){
 document.getElementById('disp').innerHTML="0";
 document.getElementById('Total').Value="0";
 document.getElementById('CalcPtn').Value="";
 document.getElementById('ViewFlg').Value="0";
}

function ClickPTN(ptnName){
 if (document.getElementById('CalcPtn').Value != ""){
  tmpTXT="?Value="+document.getElementById('disp').innerHTML;
  tmpTXT=tmpTXT+"&Total="+document.getElementById('Total').Value;
  tmpTXT=tmpTXT+"&Pattern="+document.getElementById('CalcPtn').Value;
  httpObj = createXMLHttpRequest(displayData);
  if (httpObj){
   httpObj.open("GET","test.php"+tmpTXT,false);
   httpObj.send(null);
  }
 }
 document.getElementById('CalcPtn').Value=ptnName;
 document.getElementById('Total').Value
  =document.getElementById('disp').innerHTML;
 document.getElementById('ViewFlg').Value="0";
}

function ClickBTN(btnName){
 if (document.getElementById('ViewFlg').Value == "0"){
  document.getElementById('disp').innerHTML=btnName;
  document.getElementById('ViewFlg').Value="1";
 }else{
  document.getElementById('disp').innerHTML
   =document.getElementById('disp').innerHTML+btnName;
 }
}

function Calc(){
 if (document.getElementById('CalcPtn').Value != ""){
  tmpTXT="?Value="+document.getElementById('disp').innerHTML;
  tmpTXT=tmpTXT+"&Total="+document.getElementById('Total').Value;
  tmpTXT=tmpTXT+"&Pattern="+document.getElementById('CalcPtn').Value;
  httpObj = createXMLHttpRequest(displayData);
  if (httpObj){
   httpObj.open("GET","test.php"+tmpTXT,true);
   httpObj.send(null);
  }
 }
}

function displayData(){
 if ((httpObj.readyState == 4) && (httpObj.status == 200)){
   document.getElementById('disp').innerHTML=httpObj.responseText;
   document.getElementById('Total').Value
    =document.getElementById('disp').innerHTML;
   document.getElementById('ViewFlg').Value="0";
   document.getElementById('CalcPtn').Value="";
 }
}

動作説明:
  Clear() : 保持情報をクリアする
  ClickBTN(btnName) : 押下された数字を表示する
  ClickPTN(ptnName) : 押下されたボタン情報を保持する("÷"、"×"、"−"、"+"ボタンが既に押されている場合は計算する)
  Calc() : 計算する
  createXMLHttpRequest(cbFunc) : ブラウザを判断し、XMLHttpObjectを生成する
  displayData() : 非同期通信でえられたデータを処理する(表示処理)


【PHP】

<?php
$value = $_GET['Value'];
$total = $_GET['Total'];
$pattern = $_GET['Pattern'];

if ($pattern == "DIVIDE"){
  $result = $total / $value;
}elseif($pattern == "MULTIPLY"){
  $result = $total * $value;
}elseif($pattern == "SUBTRACT"){
  $result = $total - $value;
}elseif($pattern == "ADD"){
  $result = $total + $value;
}

echo $result;
?>

動作説明:
表示情報、結果情報、計算パターン情報をブラウザから受け取り、パターンを判断して計算を行った後、計算結果をブラウザに返す


まぁまぁ上手くできたと思われます。
興味のある方は是非参考にしてください・・・。
m(_ _)m