警告メッセージについて



0   名前: tsg : 2006/07/25(火) 11:35  ID:MiUarlyI
初心者で申し訳ありません。alertで期間限定の警告メッセージを出したいのですが方法はありますでしょうか?
例 
システム日付を取得して、30日経過したら警告メッセージを表示させない。

大変恐縮ですがよろしくお願いします。


1   名前: かふぇおれ : 2006/07/25(火) 11:35  ID:Ji0blfRq
こんなのでいい?
<script type="text/javascript">
<!--
xDay = "2006,6,23";         //いつから?
drate = 30;          //何日間表示?
xx = xDay.split(",");
oldDay = new Date(xx[0] +"/"+ xx[1] +"/"+ xx[2]);
newDay = new Date();
n = (newDay - oldDay)/(1000*60*60*24);
if (n <= drate) alert("このアラートは "+ xx[1] +"月"+ xx[2] +"日 から"+drate+"日間出ます。");
// -->
</script>


2   名前: Pid : 2006/07/25(火) 11:35  ID:yr31S3VU
// 今日が 2006-07-01 から数えて 30 日経過していれば警告
if ((new Date) - Date.UTC (2006, 6, 1) > Date.UTC (1970, 0, 30))
    alert ('期限切れ');


あれ? 逆にしちゃったけどまあいいや (^^;)。alert はうっとうしいので,本番では使わない方が良いです。

と言いますか,リソースの期限を切る場合は Cache-Control や Expires ヘッダを使うべきですが。
http://www.studyinghttp.net/header#Cache-Control

3   名前: かふぇおれ : 2006/07/25(火) 11:35  ID:Ji0blfRq
>>2 Pid さん、
便乗して私からも質問させてください。

> リソースの期限を切る場合は Cache-Control や Expires ヘッダを使うべき

こういう事ですよね。
レスポンスヘッダに Cache-Control:max-age=2592000
または <meta http-equiv="Cache-Control" content="max-age=2592000" />
30日後まではリクエストが来なくなるけど、その後「警告に類似したもの」を表示するって事ですか?
もう少し、噛み砕いて教えていただけませんでしょうか。

4   名前: Pid : 2006/07/25(火) 11:35  ID:GOE45W6U
>>3
ごめんなさいごめんなさい寝惚けてました。今回はキャッシュ制御とは違う問題なのでした。

でも,かふぇおれさんのアイデアも面白そうですね。ちょっと試してみます。

5   名前: かふぇおれ : 2006/07/25(火) 11:35  ID:MRwTGpOM
あはは、Pid さんに謝られると自分が偉くなった気になりますね(w
alert が鬱陶しいのは私も同感ですので、
<script type="text/javascript">
<!--
xDay = "2006,6,23";      //いつから?
drate = 30;                   //何日間表示?
fsize = 16;                    //表示するフォントの大きさ
fcolor = "red";             //NEWの色
var mes = ""; 
xx = xDay.split(",");
oldDay = new Date(xx[0] +"/"+ xx[1] +"/"+ xx[2]);
newDay = new Date();
n = (newDay - oldDay)/(1000*60*60*24);
if (n <= drate) mes = "<div style='color:"+fcolor+";font-size:"+fsize+"'>この警告は "+ xx[1] +"月"+ xx[2] +"日 から"+drate+"日間出ます。</div>";
document.write(mes.italics());
// -->
</script>


こんな感じでどうでしょう。

6   名前: tsg : 2006/07/25(火) 11:35  ID:MiUarlyI
皆さん有難うございます。大変参考になりました。
3〜5のスレは勉強不足で理解できませんした。
皆さんを見習いもっと勉強します。
今後ともよろしくお願いします。

7   名前: tsg : 2006/07/25(火) 11:35  ID:MiUarlyI
すみません。再度質問がございます。
“かふぇおれさん”からいただいたソースに追記させて貰い、実行日(ページを呼び出した日)をxDAYに代入したいと思います。
その代入した実行日を確定させ、そこから30日をカウントしたいと思っています。
再度実行しても、日付が置き換えられない様にするにはどうしたらよいでしょうか?

7月24日にページにアクセスして確定し、7月25日以降にアクセスしても24日確定日から30日をカウントする。
(制約として、最初に実行した日で構いません)

大変恐縮ですがよろしくお願いします。

<script type="text/javascript">
<!--
mydate=new Date();
YY=mydate.getYear();
MM=mydate.getMonth()+1
DD=mydate.getDate();
xDay =(YY+","+MM+","+DD);         //日付取得
drate = 30;          //何日間表示?
xx = xDay.split(",");
oldDay = new Date(xx[0] +"/"+ xx[1] +"/"+ xx[2]);
newDay = new Date();
n = (newDay - oldDay)/(1000*60*60*24);
if (n <= drate) alert("このアラートは "+ xx[1] +"月"+ xx[2] +"日 から"+drate+"日間出ます。");
// -->
</script>


8   名前: Pid : 2006/07/25(火) 11:35  ID:TDh0RvEz
> 再度実行しても、日付が置き換えられない様にするにはどうしたらよいでしょうか?

Cookie を使うことになるでしょうね(と言うことは,Cookie オフの環境に対してはどうしましょうか)。他に URI クエリを使う方法もありますが,場合によっては CGI などサーバ側で処理すべき問題のようにも思います。

この問題,本当に JavaScript で大丈夫ですか?


----

なお,本題とは直接関係のない部分ですが,

> YY=mydate.getYear();

getYear() は 2000 年問題の関係ですでに廃止されました。今後は getFullYear() を使って下さい。

> xDay =(YY+","+MM+","+DD);
> xx = xDay.split(",");

んーと,この部分で何をおやりになりたいのか,イマイチ分からんです(不要だと思いますが……)。

> oldDay = new Date(xx[0] +"/"+ xx[1] +"/"+ xx[2]);

Date の引数は Date (year, month, date, hours, minutes, seconds, ms) です(year と month は必須,残りはオプション)。

Date ('2006/7/24') は Date.parse ('2006/7/24') と等価ですが,微妙に実装依存なので,特に理由がなければ YY,MM,DD をそのまま Date に放り込んで大丈夫です。
http://www2u.biglobe.ne.jp/%7Eoz-07ams/prog/ecma262r3/15-9_Date_Objects.html#section-15.9.4.2

> n = (newDay - oldDay)/(1000*60*60*24);
> if (n <= drate)

ここでミリ秒に直してまた日に戻すのならば,最初からミリ秒で計算した方が速いような。

また,ECMA 262-3 仕様上,Date は 1970-01-01 から始まることになっていますので,Date.UTC (1970, 0, 30) とすれば,純粋に 30 日分のミリ秒を得られます(>>2 を参照,ただし閏秒とか考え出すとキリがない)。


日付計算は,あまり自力でやろうと思わず,とことんシステムに任せて楽した方が良いと思います(除算とか絡むといろいろ面倒なので。ただし,2000 年問題のように明らかな問題がある場合は例外)。

9   名前: かふぇおれ : 2006/07/25(火) 11:35  ID:Ji0blfRq
うひゃあ…私が拙いscriptを書いたばっかりに…
tsg さん、ごめんなさい。

クッキーを使うとすると…(汚いscriptで申し訳ない)。
<script type="text/javascript">
<!--
mydate = new Date();
YY = mydate.getFullYear();
MM = mydate.getMonth()+1;
DD = mydate.getDate();
startdate = YY+","+MM+","+DD; 
var drate = 30;          //何日間表示?
var nExpTime = 1000*60*60*24*100; //クッキーの有効期限(今は100日にしてます)
function GetCookie(strName){
var strReturn = ""; var nLoop = 0; var nLength = 0;
var strNameEx = strName + "="; var strTemp = "";
while (nLoop < document.cookie.length){ nLength = nLoop + strNameEx.length;
if (document.cookie.substring(nLoop, nLength) == strNameEx){
strTemp = document.cookie.indexOf(";", nLength);
if (strTemp == -1){strReturn = document.cookie.substring(nLength, document.cookie.length);
}else{strReturn = document.cookie.substring(nLength, strTemp);
} break;
}
nLoop = document.cookie.indexOf(" ", nLoop) + 1;
if (nLoop == 0){ SetCookie("data", startdate);
// alert("セットしました。" );
break;
}
} return strReturn;
}
function SetCookie(strName, strValue){
var dtExpire = new Date();
dtExpire.setTime(dtExpire.getTime() + nExpTime);
document.cookie = strName + "=" + strValue + "; expires=" + dtExpire.toGMTString();
}
var strValue;
strValue = GetCookie("data");
xx = strValue.split(",");
if (strValue == ""){ alert("今日から"+drate+"日の間\nずっとアラートが出ます。");
}else{ oldDay = new Date(xx[0] +"/"+ xx[1] +"/"+ xx[2]);
newDay = new Date(); n = (newDay - oldDay)/(1000*60*60*24);
if (n <= drate){ alert("このアラートは初回アクセス日\n"+ xx[1] +"月"+ xx[2] +"日から"+drate+"日間出ます。");
}
}
//-->
</script>

おそらくもっと簡単に書ける筈とは思うのですが…(他力本願)

10   名前: tsg : 2006/07/25(火) 11:35  ID:MiUarlyI
色々とありがとうございます。
かふぇおれさんが記述してくれたサンプルも参考になりますし、Pidさんのご指摘通りCookieオフの環境もありますので、環境等も考慮しながら検討したいと思います。
とても勉強となりました。みなさんすごいですね!

11   名前: かふぇおれ : 2006/07/25(火) 11:35  ID:Ji0blfRq
tsg さん、頑張ってくださいね。
でも正直に言ってしまえば…、どんな状況で利用されるかは解りませんが、私は >>9 の script が入っている様な頁には、あまり行きたくないと思います。
実際の使用法が解ればもっと他の案もあると思います。
そしてその方法の方がより解決に近づくのではないかと思うのですが…。

一覧へ戻る