hash(url の #~)を監視して変更イベントを発行するようにする tm.hash-observer.js を作りました

phiary に引っ越しました. 毎日プログラミングやWebに関する情報を発信しています! RSS 登録してたまに覗いたり, tweet やハテブして拡散してもらえると幸いです.

Pocket

前回に引き続き dispatch メソッドを活用したスクリプトです.

hash の値を監視して, 値に応じて表示物を変えるというテクニックは Gmail や Twitter といった Web サービスでも使われている テクニックです.

画面の更新が不要で情報を設定することができるので Ajax の普及と共に重要な技術となりました. ちなみに名前は 『Unique URLs』(昔エントリーとしてまとめたのでよかったらこちらも)

しかし, このテクニックには問題があります. 戻る/進むボタンに反応しないのです!! hash 値の変更イベントを発行する処理がネイティブにはないので, 表示を変えることができないのです.

この問題を解決するのが 『tm.hash-observer.js』 です. 『tm.hash-observer.js』は hash(url の #~)値を監視し, 変更があった際に変更イベントを発行するようにするスクリプトです.

簡単に導入できるのでよかったら使ってください.

View Demo Download

About

デモプログラムは hash 値に設定した色をテキストのカラーとして設定するサンプルです. 下にあるカラーリンクをクリックして色を変えてみてください.

また, 戻る/進むボタンを押しても hash 値の色が反映されているのがわかるかと思います.

Usage

『tm.hash-observer.js』の使い方は

  1. 『tm.hash-observer.js』を script タグで読み込む
  2. tm.hashObserver.enable() メソッドで hash 値の監視を開始
  3. document.addEventListener(‘changehash’, function(e){ … }); で変更時に実行したい処理を登録

です.

また, changehash で発行されるイベントオブジェクトには hash(現在のハッシュ値), prevHash(以前のハッシュ値)のプロパティを持っています.

window.onload = function()
{
    // hash の監視を開始
    tm.HashObserver.enable();
    
    // ハッシュ変更イベントを登録
    document.addEventListener("changehash", function(e) {
        alert(e.hash);
    }, false);
};

Code

サンプルのコード全体です.

<html>
    <head>
        <meta charset="UTF-8" />
        <title>tm.hash-observer.js Sample - ハッシュに指定された色をテキスト色として使用する</title>
        <style>
            * {
                -webkit-box-sizing: border-box;
                -moz-box-sizing: border-box;
                -o-box-sizing: border-box;
                box-sizing: border-box;
                font-family: "Meiryo", Arial, Helvetica, sans-serif;
                line-height: 1.5em;
            }
            
            body {
                font-size: 16px;
            }
            
            #main {
                
            }
        </style>
        <script src="tm.hash-observer.js"></script>
        <script>
            
            window.onload = function()
            {
                // hash の監視を開始
                tm.HashObserver.enable();
                
                // もともとある hash の色を反映させておく
                setMainColor( window.location.hash.substr(1) );
                
                // ハッシュ変更イベントを登録
                document.addEventListener("changehash", function(e) {
                    var color   = e.hash.substr(1);
                    setMainColor(color);
                }, false);
            };
            
            // color を main 要素のフォント色としてセットする
            var setMainColor = function(color) {
                var eMain   = document.getElementById("main");
                
                eMain.style.color = color;
            };
        </script>
    </head>
    <body>
        <header>
            <h1>tm.hash-observer.js Sample - ハッシュに指定された色をテキスト色として使用する</h1>
            <p>
                tm.hash-observer.js を使ったサンプルです.
                ハッシュに指定された色をテキスト色として使用します.
                下にあるカラーリンクをクリックするとハッシュ値がその色名になります.
            </p>
            <p>
                また, "戻る"や"進む"ボタンを押してもテキストの色がちゃんと反映されているのが分かるかと思います.
            </p>
        </header>
        
        <section id="main">
            <h2>Title</h2>
            <p>
                Text Text Text Text Text Text Text Text
                Text Text Text Text Text Text Text Text
            </p>
            <p>
                Text Text Text Text Text Text Text Text
                Text Text Text Text Text Text Text Text
            </p>
            <p>
                Text Text Text Text Text Text Text Text
                Text Text Text Text Text Text Text Text
            </p>
        </section>
        <section>
            <h2>Color Links</h2>
            <ul>
                <li><a href="#yellow">yellow</a></li>
                <li><a href="#blue">blue</a></li>
                <li><a href="#red">red</a></li>
                <li><a href="#purple">purple</a></li>
                <li><a href="#orange">orange</a></li>
                <li><a href="#green">green</a></li>
                <li><a href="#brown">brown</a></li>
                <li><a href="#black">black</a></li>
                <li><a href="#white">white</a></li>
            </ul>
        </section>
    </body>
</html>

Reference

なんか最近楽しい.

TRACK BACK URL

POST COMMENT

メールアドレスが公開されることはありません。

COMMENT

  • phi_jp より:

    戻る/進むボタンにも対応.Ajax 使った Web サイトを作る際なんかに使って下さいな♪
    『hash(urlの#~)を監視して変更イベントを発行するようにするtm.hash-observer.jsを作りました.』
    http://t.co/cyZoDHhD
    #javascript