0

私は現在次のスクリプトを持っています:

<script>
if(new Date().getHours() > 17 || (new Date().getHours() == 17 &&     
new Date().getMinutes()== 0 && new Date().getSeconds() == 0) && 
(new Date().getHours() < 21 && new Date().getMinutes() < 30 
&& new Date().getSeconds() == 0)){
        //do nothing.   
    } else {
    $(document).ready(function() {
        $(".inline").colorbox({inline:true, open:true, width:"50%"});
        });
    }

つまり、基本的に次の場合に当てはまります。時刻が17:00から21:30の場合は、何もしないか、ボックスを表示します。しかし、何が起こったのかというと、ボックスは18:00頃に機能を停止し、真夜中に再び機能し始めます。誰かがここで何が問題なのかわかりますか?

4

4 に答える 4

1
$(document).ready(function()
{
    var now = new Date(),
        block = $('div');

    if(now.getHours() >= 17 && (now.getHours() < 21 || (now.getHours() == 21 && now.getMinutes() <= 30)))
    {
        block.text('17:00 - 21:30');
        //do nothing.    
    }
    else
    {
        block.text('not 17:00 - 21:30');
        //$(".inline").colorbox({inline:true, open:true, width:"50%"});
    }
}); 

デモ: http://jsfiddle.net/FwtRb/10/

于 2012-09-23T12:26:39.010 に答える
1

Date の多くのフィールド (Hour を含む) は、インデックスが 0 であることに注意してください。これが、この機能が 18:00 頃に停止するのを観察する理由です。

変数を使用して、条件を簡単に推論できるようにすることをお勧めします。このようなことを試してください。名前空間の汚染が心配な場合は、その周りにクロージャーを投げてください。

var now = new Date();
var startQuietPeriod = new Date();
startQuietPeriod.setHours(16); startQuietPeriod.setMinutes(0); startQuietPeriod.setSeconds(0); startQuietPeriod.setMilliseconds(0);  // Today at 17:00
var endQuietPeriod = new Date();
endQuietPeriod.setHours(20); endQuietPeriod.setMinutes(30); endQuietPeriod.setSeconds(0); endQuietPeriod.setMilliseconds(0);  // Today at 21:30
if (startQuietPeriod < now && now < endQuietPeriod) {
  // don't show prompt
} else {
  // show prompt
}
于 2012-09-23T12:30:32.423 に答える
1

これが私がこれを書く方法です:

var now = new Date();

if (now.getHours() >= 17 && now.getHours() <= 21) {
    if (now.getHours() == 21 && now.getMinutes() > 30) {
        return;
    }
}

// Do your document.ready stuff here

最初に、現在の時刻を変数に保存しました。これにより、タイプを減らすことができます (怠惰なタイピストであることを忘れないでください!)。さらに、これにより条件が少しクリーンアップされるため、論理エラーを簡単に見つけることができます。

次に、あなたの条件 (17:00 から 21:30 の間は何もしない) を 2 つの別々の if 条件に分割します。個人的には、2 年後に自分のコードに戻ってきたとしても、簡単なので、その方法を好みます。
あなたのコードは、読みやすいかどうかにかかっています。常にそれを覚えておいてください。複雑な if 条件は、適切にコメントされたとしても、将来あなたや他の人にとって困難になるだけです。そのためにあなたを初心者と呼ぶ人々を無視してください。

また、条件が一致した場合にreturn現在の関数を単に中止する a を使用する方が読みやすいと思います 。<script>これにより、1 インデント レベルを節約できます :-)

更新: peakxu の回答(したがって、Date の MDN ページ)も読む必要があります。peakxu が言ったように、これはすべて 0 インデックスであることに注意してください。

于 2012-09-23T12:47:06.200 に答える
0
var d = new Date();

if ( d.getHours() < 17 || 
     d.getHours() > 21 ||
    (d.getHours() == 21 && d.getMinutes() >= 30)) {

        $(document).ready(function() {
            $(".inline").colorbox({inline:true, open:true, width:"50%"});
        });
}
于 2012-09-23T12:24:11.953 に答える