SSブログ

Javascript小僧:タイムリミットの「日」を設定する(改) [コンピューター]

Javascript小僧:タイムリミットの「日」を設定する
http://blog.so-net.ne.jp/cheese999/2013-10-20

で紹介したコードですが、試験している中で、以下の点を修正しました。

1.タイムリミットを変更している間は、残り時間の周期起動を一時停止して、変てこりんな残り時間が表示されないようにする。
2.タイムリミットの年 or 月を変更したとき、日の設定がその月の最大日を超えているとき、強制的に最大日に変更する。例えば、タイムリミットが2013/3/31に設定されている状態で、月が2に変更されたら、日を28に変更し、タイムリミットを2013/2/28とする。

001.jpg

タイムリミットの西暦年、月、日、時、分、秒にフォーカスが当たったら、FStartEnDayMon1関数を1を付けて呼び出し、フォーカスが外れたらFStartEnDayMon1関数を2を付けて呼び出すようにHTMLを変更。

<form>タイムリミット:<input type="text" size="5" class="TxtCls1a" id="Idyyyy1" name="NMyyyy1"
value="2000" maxlength="4" onFocus="FStartEnDayMon1(1)" onBlur="FStartEnDayMon1(2)" disabled>年
(<input type="text" size="8" class="TxtCls1a" id="Idyyyy2" name="NMyyyy2"
value="昭和60" readonly>年)
<select name="SelMonth4" id="IdSelMonth4" onFocus="FStartEnDayMon1(1)" onBlur="FStartEnDayMon1(2)" disabled>
<option value="1">1

(中略)

<option value="12">12
</select>月
<select name="SelDay3" id="IdSelDay3"
onFocus="FStartEnDayMon1(1)" onBlur="FStartEnDayMon1(2)" disabled>
<option value="1">1

(中略)

<option value="28">28
<option value="29" id="IdOpDay29" disabled>29
<option value="30" id="IdOpDay30" disabled>30
<option value="31" id="IdOpDay31" disabled>31
</select>日
<select name="SelHour3" id="IdSelHour3" onFocus="FStartEnDayMon1(1)" onBlur="FStartEnDayMon1(2)" disabled>
<option value="0">0

(中略)

<option value="23">23
</select>時
<select name="SelMin3" id="IdSelMin3" onFocus="FStartEnDayMon1(1)" onBlur="FStartEnDayMon1(2)" disabled>
<option value="0">0

(中略)

<option value="59">59
</select>分
<select name="SelSec3" id="IdSelSec3" onFocus="FStartEnDayMon1(1)" onBlur="FStartEnDayMon1(2)" disabled>
<option value="0">0

(中略)

<option value="59">59
</select>秒
</form>

なお、HTMLを最初にロードしたとき、周期起動をかけるため、bodyタグには、reset2関数を呼ぶようにしてあります。

<body background="gif/kabe.gif" text="#000000" lang="ja" onload="reset2(null)">

javascript部分ですが、FEnableDayMon1関数に、「年」、「月」の組み合わせから求めた、その月の最終日(NumMDays)とプルダウンメニューで選択されている日を比べて、選択されている日の方が大きい場合、選択されている日を強制的に最終日(NumMDays)に合わせるコードを追加します。

// 1か月の日数に応じて日付の選択肢を選択可能( or 不可能)にする
// 【引数】
// myYear : 西暦の年。4桁。例:2005
// myMonth : 月。(1 - 12)
// Obj1[0], Obj1[1], Obj1[2]:29日、30日、31日のオブジェクト
// Obj1[5]:「日」のプルダウンメニュー全体のオブジェクト
// 【戻り値】
// 無し
// 【コード】
function FEnableDayMon1(myYear, myMonth, Obj1){
  Obj1[0].disabled = true; // 29日を選択不可能
  Obj1[1].disabled = true; // 30日を選択不可能
  Obj1[2].disabled = true; // 31日を選択不可能
  var NumMDays = FNumDayMon1(myYear, myMonth); // 1か月の日数
  if(NumMDays >= 29){Obj1[0].disabled = false} // 29日を選択可能
  if(NumMDays >= 30){Obj1[1].disabled = false} // 30日を選択可能
  if(NumMDays >= 31){Obj1[2].disabled = false} // 31日を選択可能
  // 現在選択されている日が最終日を超えているなら、最終日にずらす。
  if((Obj1[5].selectedIndex+1) > NumMDays){
    Obj1[5].selectedIndex = NumMDays -1
  }
}

プルダウンメニューの1日のselectedIndexは0なので、NumMDays -1を代入しています。

次に、タイムリミットにフォーカスしたとき、周期起動を停止し、タイムリミットからフォーカスが外れた時、周期起動を再開するため、FStartEnDayMon1関数を次のように変更します。

// 【引数】
// mode:モード
// =1 : タイムリミットにフォーカスしたとき
// =2 : タイムリミットからフォーカスが外れた時
function FStartEnDayMon1(mode){
  clearInterval(T[2]); // 残り時間を停止
  clearInterval(T[3]); // タイムリミットの元号年を停止
  clearInterval(T[4]); // FEnableDayMon1関数を停止
  // タイムリミットからフォーカスが外れた時
  if(mode == 2){
    // オブジェクト
    var Obj1 = new Array();
    Obj1[0] = document.getElementById("IdOpDay29"); // 29日
    Obj1[1] = document.getElementById("IdOpDay30"); // 30日
    Obj1[2] = document.getElementById("IdOpDay31"); // 31日
    Obj1[3] = document.getElementById("Idyyyy1"); // 年
    Obj1[4] = document.getElementById("IdSelMonth4"); // 月
    Obj1[5] = document.getElementById("IdSelDay3"); // 日
    Obj1[6] = document.getElementById("IdTime3_2"); // 残り時間
    Obj1[7] = document.getElementById("IdSelHour3"); // 時
    Obj1[8] = document.getElementById("IdSelMin3"); // 分
    Obj1[9] = document.getElementById("IdSelSec3"); // 秒
    Obj1[10] = document.getElementById("Idyyyy2"); // 元号年
    // 西暦年が数字じゃなかったら、代替文字を表示
    if(isNaN(Obj1[3].value)){
      Obj1[6].value = "YY/MM/DD hh:mm:ss";
    // 西暦年が数字だったら、残り時間を表示
    }else{
      T[2] = setInterval(function(){
        getElTm1(3,new Date(Obj1[3].value,
Obj1[4].selectedIndex,Obj1[5].selectedIndex+1,Obj1[7].selectedIndex,
Obj1[8].selectedIndex,Obj1[9].selectedIndex,000),Obj1[6])
      },500);
    }
    // タイムリミットの元号年を周期起動
    T[3] = setInterval(function(){
      FTranYear6(Obj1[3],Obj1[10])
    },500);
    // FEnableDayMon1関数を周期起動
    T[4] = setInterval(function(){
      FEnableDayMon1(Obj1[3].value,Obj1[4].selectedIndex+1, Obj1)
    },500);
  }
}

引数のmodeに関わらず、最初に周期起動を止めます。そしてmodeが2のときのみ、周期起動を再開します。

HTMLを最初にロードしたときコールされるreset2関数にFStartEnDayMon1関数をmode引数を2でコールするコードを追加します。これで、HTMLを最初にロードしたときに周期起動をスタートさせます。

function reset2(){

(中略)

  FStartEnDayMon1(2);

(中略)

}
タグ:JavaScript
ヤバイぜ!(5)  コメント(2)  トラックバック(0) 

ヤバイぜ! 5

コメント 2

cheese999

やったぜ! ありがとうございます。[__猫]
by cheese999 (2013-10-27 20:32) 

cheese999

javascriptのコードを見やすくするため、字下げしました。[__猫]
by cheese999 (2013-10-27 20:34) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字(英大文字の「オー」、英小文字の「ユー」、アラビア数字の「ハチ」、アラビア数字の「イチ」、アラビア数字の「ニ」)を入力してください。

Facebook コメント

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。