はてなダイアリーの下書きをlocalStorageに自動保存するユーザスクリプト

プニルメモリリークの根源?

Twitter上にて「Win版ver3のRC使ってます。使用時間が長くなるとどんどんメモリ使用量が増えていきます。何か抑える方法あるのでしょうか?」の問いに対して fenrir_official の回答。

こちらの問題についてはTridentエンジンからのリークを確認しており改善方法を検討しております。
恥ずかしい答えになりますが、しばらくは再起動にてお待ちいただけますと幸いです。

http://twitter.com/fenrir_official/status/103689324612173826

アメブロの件もTridentエンジンの問題だったわけで抜本的解決には到っておらず。
本件も取れる手段はMSに修正をお願いし続けるくらいしかないだろうとは思いますが、はてさてどうなることやら。

Web Storage使ってみたかったので

HTML5関連の話題で触れられることの多い技術の一つがWeb Storageです。
@ITの「人気順に説明する初めてのHTML5開発」という連載では2番目に触れられていますね。
なお、厳密にはHTML5の仕様からは分離されています。
ですのでWikipediawikipedia:HTML5の項目ページでは"広義HTML5"の箇所に書かれていたり。
詳しくはググるなりW3Cのドラフト読むなりしてください。

Web Storageには「sessionStorage」「localStorage」という2種類のストレージがあって、今回は後者の localStorage を使ってみました。


最初はメモ帳的なパネルでも作ってみようかなと思ったんだけど*1IEはローカルファイルに対しては localStorage が使えないみたいなので諦めました。
まぁ、HTMLファイルを鯖に上げてそれにアクセスすれば使えるわけだからそのうちやろうかな。*2

ということで何か無いかと考えてはてなダイアリーの日記を執筆中に飛ばしてしまうことが多いので定期的に保存するスクリプトを書いてみました。
とりあえず5000ミリ秒(=5秒)間隔で保存されるようになってます。
とはいえ今書いてちょろっとテストしただけで実際に問題の場面に出くわして、無事助かるかは不明ですけどね。
また、実験的に作ったものなので"下書き記事"の"新しい下書きを書く"でのみ動作するはず。
一度でも"下書き保存"したあとにそれを"編集"から書き換える場合は動かないです。

HatedaLocalStorage.user.js

// ==UserScript==
// @name         LocalStoraging HatenaDiary Draft
// @namespace    http://d.hatena.ne.jp/barrackdo/
// @include      http://d.hatena.ne.jp/*/draft
// ==/UserScript==

(function() {
	if(typeof localStorage !== 'undefined') {
		
		var se = document.getElementById("section-title");
		var te = document.getElementById("textarea-edit");
		
		se.value = localStorage.getItem("sectionTitle") != null ? localStorage.getItem("sectionTitle") : "";
		te.innerText = localStorage.getItem("textareaEdit") != null ? localStorage.getItem("textareaEdit") : "";	
		var spn = document.createElement("span");
		var eb = document.getElementById("edit-buttons");
		eb.parentNode.appendChild(spn);
		
		
		window.setInterval(function(){
			spn.innerText = new Date().toLocaleString().replace(/年|月/g,"\/").replace("日","")+" saved.";
			localStorage.setItem("sectionTitle",se.value);
			localStorage.setItem("textareaEdit",te.innerText);
		},5000);
	}else {
		alert("localStorage をサポートしてないか使用不能な設定になっています(´-ω-`)");
	}
}());

IEではIE8以降でWeb Storageに対応しているので、Sleipnir2(+IE8)以降の環境で動くはず。Sleipnir2.9.7(+IE9)でしか試してないけど。
IEWeb Storageは無効になっている場合もあるみたいなので「インターネットオプション>詳細設定>セキュリティ>DOM ストレージを有効にする」の状態を確認してください。
また、他のブラウザでも動作するような気もしますが、こちらも試してないですw


なお、もっと汎用的なものとしてフェンリル謹製のRememberMeプラグイン、プヨぷよ氏作のSaveTextAreaスクリプトってのがあります。*3

*1:それにしても最近似たようなパネル作りたすぎだなw

*2:非公開予定ならlocalhostで良いんだけどね

*3:理由は分からんがRememberMeがいまいち効いてないようなので今回の書いたんですけどね