雑食性雑感雑記

知識の整理場。ため込んだ知識をブログ記事として再構築します。

Bootstrap alert の表示 or 非表示

概要

  • Bootstrap の alert を好きなタイミングで表示 or 非表示させる。

環境

  • Bootstrap 3.0
  • jQuery 1.10

  • サンプルは firefox 26 で確認。

使用例

  • ユーザの動作に対して、alert 表示を出す。
    • javascript の「alert()」だと画面が固まってしまうので、使いたくない。
    • Bootstrap で表示を統一したい場合にも。

実装サンプル

  • jsdo.it 上に置いた。

  • 以降のサンプルコードとは若干違うところあり。

方法1「 css で操作 」

  • css の "display=block" or "display=none" で表示 or 非表示
    • これだけでも要求は満たせる。
    • しかし、ユーザが close ボタンを押してしまうと、それ以降表示されなくなってしまう。

  • サンプルページ
    • 一定時間ごとに alert の表示 / 非表示を繰り返す。
    • ユーザが close ボタン ( x の表示 ) を押すと、それ以降表示されない!!

  • 該当部分ソースコード
<div class="container">
    <div class="row">
        <div class="col-xs-12" id="alert_col">
            <div class="alert alert-success alert-dismissable" id="alert_sample">
                <button type="button" class="close" data-dismiss="alert" aria-hidden"true">&times;</button>
                Sample alert message
            </div>
        </div>
    </div>
</div>

// 前提:jquery & bootstrap が読み込まれていること。
$(window).ready( function() {

    var update_msec = 3000;

    var hideAlert = function() {
        console.log( 'Hide alert' );
        $('#alert_sample').css( 'display', 'none' );
        setTimeout( showAlert, update_msec );
    };
                
    var showAlert = function() {
        console.log( 'Show alert' );
        $('#alert_sample').css( 'display', 'block' );
        setTimeout( hideAlert, update_msec );
    };
                
    showAlert();
} );

方法2「毎回、要素を作成する」

  • 表示毎に要素を作成してしまう。
    • ユーザによって消されても、次回表示時に作成するので問題なし!!
    • プログラム側で消す場合は、非表示ではなく削除にする。
      • 削除は、「element.alert( 'close' )」を使用。

  • サンプルページ
    • 一定時間ごとに alert の表示 / 非表示。ランダムで alert の種類を変えるようにした。
    • ユーザが close ボタンを押しても大丈夫!!

  • 該当部分ソースコード
<div class="container">
    <div class="row">
        <div class="col-xs-12" id="alert_col"></div>
    </div>
</div>

$(window).ready( function() {
                
    var alerts = [
        { 'type' : 'success', 'message' : 'Success alert' },
        { 'type' : 'info', 'message' : 'Info alert' },
        { 'type' : 'warning', 'message' : 'Warning alert' },
        { 'type' : 'danger', 'message' : 'Danger alert' }
    ];

    var update_msec = 3000;
                
    var createAlert = function( alert_type, message ) {
                
        var alert = document.createElement( 'div' );
        alert.setAttribute( 'id', 'alert_sample' );
        alert.setAttribute( 'class', 'alert alert-' + alert_type + ' alert-dismissable' );
                
        var button = document.createElement( 'button' );
        button.setAttribute( 'type', 'button' );
        button.setAttribute( 'class', 'close' );
        button.setAttribute( 'data-dismiss', 'alert' );
        button.setAttribute( 'aria-hidden', 'true' );
        button.appendChild( document.createTextNode( 'x' ) );
                
        alert.appendChild( button );
        alert.appendChild( document.createTextNode( message ) );
                
        return alert;
    };
            
    var hideAlert = function() {
        console.log( 'Hide alert' );
        $('#alert_sample').alert( 'close' );
        setTimeout( showAlert, update_msec );
    };
                
    var showAlert = function() {
        console.log( 'Show alert' );
        var alert = alerts[ Math.floor( Math.random() * alerts.length ) ];
        $('#alert_col').append( createAlert( alert.type, alert.message ) );
        setTimeout( hideAlert, update_msec );
    };
                
    showAlert();
} );