自動リロード [jQuery] [js]

2016/08に公開

webページを一定間隔で自動リロード→手動に切り替えるjsコードです。
たとえば、ユーザーからのコメントをリアルタイムで表示させたいといったときに定期的にリロードしてwebページを常に最新状態にするようにします。
あまりリロードを繰り返されるとイラっとするユーザーもいるので、ユーザーのタイミングで自動リロードをOFFするようにしてみます。
ここではjqueryを使用していますが、その気になれば使わなくても可能かと思われます。


sample

自動ON

30秒で自動リロードするようにしています。リロードがうざかったら、ボタンをクリックして自動リロードを解除してください。
「自動OFF」をクリックすると手動でリロードできます。
「自動OFF」ボタンのすぐ右の空間(濃いグレー部分)をクリックすると自動ONに戻ります。

CSS3を使っているので、古いブラウザでは表示が崩れます。jsはIE7/8でも動作します。


html

<span class="reload auto"><span>自動ON</span></span>

※黒い部分をダブルクリックするとソースを選択できるので、コピーして使ってください。

構造さえ同じであれば、使用するタグ、class(id)名はこの限りではありません(さらに言えば、テキストにするとか、デザインによってはこの構造にこだわる必要もありません)。


css

.reload{
    display: table;
    margin: 10px auto 0;
    padding:0 0 0 30px;
    border-radius: 20px;
    background: rgba(0,0,0,0.5);
    position: relative;
    cursor: pointer;
}
.reload > span{
    display: inline-block;
    background: rgba(171, 171, 171,0.6);
    border-radius: 20px;
    padding: 7px 20px;
    border: double 3px #fff;
    color: #fff;
}
.reload.auto span{
    background: rgba(90, 187, 69, 0.6);
}
.reload #reset{
    display: block;
    width: 30px;
    height: 41px;
    position: absolute;
    top:0;
    right:0;
}

※黒い部分をダブルクリックするとソースを選択できるので、コピーして使ってください。

cssの設定はデザインによって変更してください。


js

$(function() {
    var reloadTimer;
    var thisUrl = location.href;

    if(thisUrl.indexOf('?mo') != -1){ //urlに?moが付いていたら手動状態にする
        $('.reload').append('<em id="reset"></em>');
        offBtn();
    }

    if($('.reload').attr('class').indexOf('auto') != -1) reloadS(); //リロードボタン初期状態(自動リロードON)

    $(document).on('click', '.reload', function(e) {
        if($(e.target).is('#reset')) { //リロードボタン内のリセット部分は別の動作(自動リロードOFF状態でボタンの余白をクリックしたら自動リロードONに戻る)
            $('#reset').remove();
            $('.reload').addClass('auto').css('padding','0 0 0 30px');
            $('.reload span').text('自動ON');
            reloadS();
        } else { //リロードボタン自体は自動リロードか手動リロード
            if($(this).parent().attr('class').indexOf('auto') != -1){ //自動リロードOFF
                reloadP();
                offBtn();
            } else { //自動リロードOFF状態なら手動でリロード
                if(thisUrl.indexOf('?mo') != -1) location.reload();
                else location.href = thisUrl + "?mo";
            }
        }
    });

    function reloadS(){
        if(thisUrl.indexOf('?mo') != -1) location.href = thisUrl.replace( "?mo" , ""); //urlに?moが付いていたら削除
        reloadTimer=setInterval(function(){
            location.reload();
        } , 30000);//30秒ごとに自動リロード
    }
    function reloadP(){ //自動リロード解除
        clearInterval(reloadTimer);
    }
    function offBtn(){
        if(!$('#reset').length) $('.reload').append('<em id="reset"></em>'); //#resetがなかったらリロードボタン内に追加
        $('.reload').removeClass('auto').css('padding','0 30px 0 0');
        $('.reload span').text('自動OFF');
    }
});

※黒い部分をダブルクリックするとソースを選択できるので、コピーして使ってください。

何をしているか大まかに言うと、一定時間ごとにリロードをくりかえす関数reloadS()を最初に実行しておきます(10行目)。その後リロードボタンをクリックしたとき、自動リロードがONならば手動に切り替え、OFFならばそのタイミングでリロードするようにしています。また、自動リロードがOFFのとき、ある部分をクリックしたら自動リロードをONにするようにしています(12〜27行目)。

  1. 2〜3行目:必要な変数を用意(自動リロード解除するのに必要な変数とリロードボタンを設置するページのurlを格納する変数)
  2. 29〜34行目:定期的にリロードする関数reloadS()を用意(関数名は任意)。
    定期的に自動リロードする記述は31〜33行目なので、自動リロードをOFFにする必要がなければ、setInterval(〜);の部分を記述すればおけー。
    自動リロードする間隔を変更したい場合は数字部分を適宜変更(ミリ秒単位)。
    30行目のif文は自動リロードOFF状態かどうかをURLにクエリ文字列[mo]が付与されているかどうか判定して、付いていれば除外するためのもの。
  3. 35〜37行目:自動リロードをOFFにする関数reloadP()を用意(関数名は任意)
  4. 38〜42行目:自動リロードがOFFになったときのリロードボタンの表示を変えるための関数offBtn()を用意(関数名は任意)
    39行目は自動リロードをOFFからONに戻すためのパーツ(id[reset]を設定したemタグ)がすでに追加されているかどうか判定して、なければ追加している。
  5. 10行目:最初にページが読み込まれたときに関数reloadS()を実行して、自動リロードがONになるようにする。
    OFF状態で手動リロードした際にON状態に戻るのを防ぐため、ボタンの状態を判定している。
  6. 12〜27行目:リロードボタン(class[reload])をクリックしたときの処理。
    if($(e.target).is('#reset')) 〜 の判定で、リロードボタン内の自動リロードをONに戻すためのパーツ(id[reset]を設定したemタグ)がクリックされたときの処理と、それ以外がクリックされたときの処理に分けている(ちなみにONに戻すためのパーツは自動リロードをOFFにしたときに追加される)。
  7. 19〜25行目:リロードボタン内の自動リロードをONに戻すためのパーツ(id[reset]を設定したemタグ)以外がクリックされたときの処理。
    ONに戻すためのパーツ以外とは、ここではリロードボタン内のspanタグだが、その親タグ(つまりリロードボタン・・・class[reload]が設定されたタグ)にclass[auto]があるか否かで、自動リロードがONかOFFかを判定し、ON状態なら自動リロードをOFFになる関数reloadP()を実行し、ボタンの表示を変更する。
    OFFなら「自動OFF」ボタンをクリックすることで手動リロードする。このときURLにクエリ文字列[mo]が付与されていなければ付与。付与されているなら何もしないでリロードする。
    リロードした際にURLにクエリ文字列[mo]があるうちは、自動リロードのOFF状態が維持される。
  8. 14〜17行目:リロードボタン内の自動リロードをONに戻すためのパーツ(id[reset]を設定したemタグ)がクリックされたときの処理。
    ONに戻すためのパーツを削除し、リロードボタンの表示をON状態のものに戻し、関数reloadS()を実行して自動リロードがONにする。

なお、このコードはもっとシンプルにしようと思えばできると思います。うまく工夫してみてください。

  • 自動リロードOFF状態でリロードしたときに、OFF状態を維持するためにURLにクエリ文字列[mo]を追加してOFFなのかどうかを判定していますが、Cookiewebストレージを用いたり、input type="hidden"を用いたりする方法もあります。それらを使う場合はクエリ文字列[mo]を追加したり削除したりするコードは不要です。
  • ここでは手動で自動リロードをOFFにするようにしましたが、応用すれば一定回数リロードしたら勝手に自動リロードをOFFするということもできると思います。
  • ここではページ全体を再読み込みさせていますが、ページの一部だけ(frameとか)を再読み込みさせる方法もあります。その方法や条件は様々なので、興味があれば調べてみてください。

webストレージの場合

上のjsを改変して、sessionStorageを使った場合のコードにしてみました。
上のコードではURLにクエリ文字列を付加するので、それが気になる場合はこのようにwebストレージを使うか、Cookieなどを使用することになると思います。

ただし、sessionStorageはIE8より前のブラウザでは動作しないなど制約があります。
企業などのwebサイトではサポートする環境(OS・ブラウザおよびそれらのバージョン等)について明記していると思うので、それらに合わせて使用するかどうか決めると良いと思います。

なお、サンプルではこのwebストレージの場合のコードを使用しています。上のコードを使用したパターンは「ランダム背景 [js]」のページで確認できます。アドレスバーに注目していただくと、上のコードとこのwebストレージの場合のコードの違いがわかると思います。

$(function() {
    var reloadTimer;
    var thisUrl = location.href;

    if (typeof sessionStorage !== 'undefined') { //sessionStorageが使えるか検証
        var storage = sessionStorage; //変数storageにsessionStorageを格納
        var status = storage.getItem('rlStatus');

        if(status == 'off'){ //自動リロードOFFなら手動状態を維持
            $('.reload').append('');
            offBtn();
        } else reloadS(); //リロードボタン初期状態(自動リロードON)

        $(document).on('click', '.reload', function(e) {
            if($(e.target).is('#reset')) { //リロードボタン内のリセット部分は別の動作(自動リロードOFF状態でボタンの余白をクリックしたら自動リロードONに戻る)
                $('#reset').remove();
                $('.reload').addClass('auto').css('padding','0 0 0 30px');
                $('.reload span').text('自動ON');
                reloadS();
            } else { //リロードボタン自体は自動リロードか手動リロード
                status = storage.setItem('rlStatus', 'off'); //リロードボタン内のリセット部分以外がクリックされたらsessionStorageのrlStatusキーに値offを保存
                if($(this).parent().attr('class').indexOf('auto') != -1){ //自動リロードがONならOFF表示
                    reloadP();
                    offBtn();
                } else { //自動リロードOFF状態なら手動でリロード
                    location.reload();
                }
            }
        });
    } else {
        alert('ご使用のブラウザではリロードボタンは動作しません。');
        $('.reload span').text('リロードできぬ・・・');
    }

    function reloadS(){
        status = storage.setItem('rlStatus', 'on');
        reloadTimer=setInterval(function(){
            location.reload();
        } , 30000);//30秒ごとに自動リロード
    }
    function reloadP(){ //自動リロード解除
        clearInterval(reloadTimer);
    }
    function offBtn(){
        if(!$('#reset').length) $('.reload').append(''); //#resetがなかったら追加
        $('.reload').removeClass('auto').css('padding','0 30px 0 0');
        $('.reload span').text('自動OFF');
    }
});

※黒い部分をダブルクリックするとソースを選択できるので、コピーして使ってください。

やっていることはほぼ上のURLにクエリ文字列を付加するパターンのコードと同じなので、詳細の説明は割愛します。


戻る

Top