<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>location.hash &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/location-hash/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Mon, 26 Sep 2011 02:14:20 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>JavaScriptでHashChangeのシンプルなクラスを書いてみる</title>
		<link>https://blog.mach3.jp/2011/09/26/js-hashchange-class.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 26 Sep 2011 02:14:20 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Class]]></category>
		<category><![CDATA[HashChange]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[location.hash]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2016</guid>

					<description><![CDATA[以前に紹介したSammy.jsのサイトを見に行ったら、 何やら色々とバージョンアップしてフレームワーク的な物に生まれ変わっていました。 もうちょっとシンプルな物が欲しい場合もあるので、エクササイズを兼ねて書いてみました。 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>以前に紹介した<a href="http://sammyjs.org">Sammy.js</a>のサイトを見に行ったら、<br />
何やら色々とバージョンアップしてフレームワーク的な物に生まれ変わっていました。<br />
もうちょっとシンプルな物が欲しい場合もあるので、エクササイズを兼ねて書いてみました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/--BUJ4-y9pmA/TnramMbrmQI/AAAAAAAABXM/i3orJbmJPao/201109221549.png" alt="HashChangeのシンプルなクラスを書いてみる"/></figure>



<p></p>



<span id="more-2016"></span>



<h2 class="wp-block-heading">HashChangeとは</h2>



<p>たとえば、いわゆるページ内リンクで</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>http://www.example.com/</p>
</blockquote>



<p>から</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>http://www.example.com/#foobar</p>
</blockquote>



<p>にURLが変わったタイミングにイベントを受け取って<br />
なんやかんやする為のもの。</p>



<p>わりと有名だと思われるのが、jQuery hashchange eventプラグインですね。<br />
» <a href="http://benalman.com/projects/jquery-hashchange-plugin/">Ben Alman » jQuery hashchange event</a></p>



<p>あとは、冒頭で言ったSammy.js。こちらもjQueryプラグインです。<br />
» <a href="http://sammyjs.org/">Sammy.js / A Small Web Framework with Class / RESTFul Evented JavaScript</a></p>



<h2 class="wp-block-heading">車輪の再発明です</h2>



<p>本稿は車輪の再発明です。<br />
日々変わりゆく自分のJSの書き方をログっておくのに丁度良い題材な気がしたので。</p>



<p>特にクラスの書き方なんかはなかなか定まらず、ふらふらしてます。<br />
近いうちにそこら辺もまとめておきたい物です。</p>



<h2 class="wp-block-heading">書いたもの</h2>



<p>» <a href="https://gist.github.com/1219138">location.hashの変更イベントを受け取るためのもの。 — Gist</a></p>



<p>今回は敢えてjQueryから切り離した作りにしてみた。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">/*!
 * HashChange.js
 * <span class="hljs-doctag">@version</span> 1.0
 * <span class="hljs-doctag">@author</span> mach3
 * <span class="hljs-doctag">@example</span>
 * var foo = new HashChange();
 * foo.config({ onInit:myInitFunc, onChange:myChangeFunc, interval:100 });
 * foo.start(); // When start to observe.
 * foo.stop(); // When stop to observe.
 */</span>

<span class="hljs-comment">/**
 * Creates a new HashChange.
 * <span class="hljs-doctag">@constructor</span>
 * <span class="hljs-doctag">@class</span> observe changes of locatin.hash.
 * <span class="hljs-doctag">@param</span> {Object} options Configuration options.
 */</span>
<span class="hljs-keyword">var</span> HashChange = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">( options )</span></span>{

    <span class="hljs-keyword">var</span> my, vars, methods ;

    my = this;
    vars = {
        onChange : <span class="hljs-keyword">null</span>,
        onInit : <span class="hljs-keyword">null</span>,
        interval : <span class="hljs-number">100</span>,
        timer : <span class="hljs-keyword">null</span>,
        hash : <span class="hljs-keyword">null</span>
    };
    methods = {
        isFunction : <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">( target )</span></span>{
            <span class="hljs-keyword">return</span> typeof( target ) === <span class="hljs-string">"function"</span> ;
        }
    };

    <span class="hljs-comment">/**
     * Configure options.
     * <span class="hljs-doctag">@param</span> {Object} options Configuration options.
     */</span>
    my.config = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">( options )</span></span>{
        <span class="hljs-keyword">for</span>( i in options ){
            <span class="hljs-keyword">if</span>( !vars.hasOwnProperty( i ) ){ <span class="hljs-keyword">continue</span>; }
            vars&#91;i] = options&#91;i];
        }
    };
    <span class="hljs-comment">/**
     * Start to observe.
     */</span>
    my.start = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span></span>{
        my.run();
    };
    <span class="hljs-comment">/**
     * Check whether location.hash has been changed or not,
     * call onInit/onChange function if set,
     * and call itself by timeout again.
     */</span>
    my.run = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span></span>{
        <span class="hljs-keyword">var</span> h = location.hash;
        <span class="hljs-keyword">if</span>( vars.hash === <span class="hljs-keyword">null</span> &amp;&amp; methods.isFunction( vars.onInit ) ){
            vars.onInit( h );
        } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> ( vars.hash !== h &amp;&amp; methods.isFunction( vars.onChange ) ){
            vars.onChange( h );
        }
        vars.hash = location.hash;
        vars.timer = setTimeout( my.run, vars.interval );
    };
    <span class="hljs-comment">/**
     * Stop to observe.
     */</span>
    my.stop = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span></span>{
        clearTimeout( vars.timer );
    };

    my.config( options );
};
</code></span></pre>


<h2 class="wp-block-heading">使い方</h2>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> myHashChange = <span class="hljs-keyword">new</span> HashChange();
myHashChange.config({
    <span class="hljs-attr">onInit</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> hash </span>)</span>{
        <span class="hljs-built_in">console</span>.log( <span class="hljs-string">"Initialize : "</span> + hash );
    },
    <span class="hljs-attr">onChange</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> hash </span>)</span>{
        <span class="hljs-built_in">console</span>.log( <span class="hljs-string">"Change : "</span> + hash );
    }
});
myHashChange.start();
</code></span></pre>


<p>config() でイベントリスナを含めたオプションを設定して、<br />
start() すればlocation.hashの監視を始めます。<br />
監視を停止したい時はstop()で。</p>



<p>尚、コンストラクタでもオプション受け取れます。</p>



<h3 class="wp-block-heading">オプション</h3>



<dl>
<dt>onInit</dt>
<dd>初期化時のイベントリスナ</dd>
<dt>onChange</dt>
<dd>location.hashが変更された時のイベントリスナ</dd>
<dt>interval</dt>
<dd>監視用タイマーのインターバル。デフォルトは100ミリ秒。</dd>
</dl>



<h2 class="wp-block-heading">まとめ</h2>



<p>やっぱりjQueryプラグイン！っていう感じの書き方より、<br />
クラスベースっぽく書くのが好みみたいです。</p>



<p>ちょっとだけ、Prototype.jsに戻りたくなってきていたり。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
