5月
25
2009
3

「Greasemoneky(JavaScript)入門」への回答

JavaScript を初めて書いたという奮闘記なのですが、Greasemonkey(JavaScript)入門 という記事がありまして、「JavaScript いいよー、面白いよー」と勧めた者の責任としてこの中のいくつかの疑問に答えてみようと思います。

配列をforeachしたい

for(var i in list)
{
    list[i];
}

とりあえずコレでいいみたい。ただプロトタイプ拡張(?)をすると追加したメンバー関数もリストアップされちゃうので注意らしい。まだその域に達していないので良くわからない。単純な配列であれば問題ないみたい。

正確な理解だと思います。ただ、特に他の言語を知っている人は (他言語の便利メソッドが使いたくて)、String.prototype とか、Array.prototype をいじりたくなるのが人情なので、配列についての順次アクセスは面倒でも下記のように書くと癖を付けておいた方が後々楽かと思われます。

for (var i=0; i<list.length; i++) {
    vat item = list[i];
}

逆に、for~in 文は Array だけでなく全てのオブジェクトに関して使えるので、例えば外部 API の結果など、未知のオブジェクトがあった時に、そのプロパティとメソッドを一覧するために有用です。

JSONって

まぁJSONってのが何なのかわかってないんだけどねw

非常にもったいないです。是非理解して欲しいと思います。
今や多くの言語で JSON のエンコード/デコードをするライブラリがあるので、JavaScript とサーバサイドとデータをやりとりするのに便利です。JSON に慣れると XML とかタルいです。

setTimeoutなる関数

ページを開いて5秒してから実行したい
setTimeoutなる関数を使う。

setTimeout(function(){
    //code...
}, 5 * 1000);

比較的簡単でこりゃ便利と思ってたら思わぬ罠が・・・どうもこのfunction(){}の中が実行されるのが指定した時間の後になるため、function内部でfunction外部の変数を使ってると変数が変わってしまうと動作時に参照される変数も変わってしまう。

これは、「5 秒後に実行される」と捉えると勘違いしがちですね。そう考えるのではなく、「5 秒後に指定した function を実行するスレッドが起動される」と捉えるとシンプルに理解できます。
従って、下記のような記述でスレッドを外部から終了させて処理を実行させない事も可能です。

var id = setTimeout(function(){
    // 実行されない
}, 5 * 1000);
clearTimeout(id);

responseTextの処理の仕方

結果のこのx.responseTextの処理の仕方がわからなかった。この結果をdocumentと同じように扱いたいがどうやってその形式にパースしてやるのかわからない。結局responseTextを単なるテキストとして文字列マッチで処理してしまってる。

responseText のパースについては、昔悩んだ事があって結局 DOMParser を new してやる方法は成功しませんでした…。でも、下記のような方法であっさり解決できたと思います(確か)。既に存在している、document のパーサをそのまま使うっていうイメージでしょうかね。

var div = document.createElement('div')
div.style.display = 'none';
body.appendChild(div);
div.innerHTML = responseText; // ここで div 内に DOM が構築される
var children = div.childElements; // 子を取得

配列のソート

配列で飛び飛びの配列ID番号(list[332] = 10; list[567] = 20; みたいな感じ)が入ってるのがあって、そのID番号に意味があるんだけどそいつらを加工するのにfilterやsortを使うと。出来上がる配列がもとにあった飛び飛びのIDがきえちゃってて0,1,2 と詰まった感じのものになってしまう。これIDを引き継いでやる方法ないのかな?

JavaScript の Array はちょっとクセがあるので仕方ないかも。そういう事を実現したいのであれば、こういう書き方が使えます。Array の添え字はあくまでインデックスであって、ID としては使わない方が無難という事ですね。

var array = [{id:332, value:10}, {id:567, value:20}];
// var array = new Array(); var o1 = new Object(); o1.id = 332; o1.value = 10; array.push(o1); var o2 ... と等価
// 比較関数でソート
array.sort(function(a, b) {
    return a.id - b.id;
});

click イベントの起動

input type=button のオブジェクトにたいしてonclickが別JavaScriptで設定されている場合はうまく動いている気がするんだけど、img タグにonclickイベントを負荷した場合にimgタグに対してimg.click(); って呼び出しをしてもonclickイベントが通知されないみたいでコードが実行されずうんともすんとも言わない。

ボタンの click() とか、似たようなのだと、form の submit() メソッドの方が実はフォームオブジェクトに対して特別に用意されているメソッドで、普通の要素についてのイベントを起動したい時は、img.onclick(); のようにします。
まあこれは、知ってるかどうかというだけの話でしょう。

そんなこんなで

是非楽しい JavaScript ライフを送って下さい!

Written by Otchy in: Development | タグ:
5月
21
2009
2

TwitMgr に分析機能を追加しました!

某フォロワの方に教えてもらった、Your Twitter Karma に触発されて、TwitMgr に新しく「分析」機能を追加しました。

本当は分析した後に一括処理を可能にしたいのですが (そこまでやって始めて Karma を超えたと言える)、そこまで実装するにはまだまだ時間が掛かりそうなので、分析機能だけの段階でいったんリリースです。
ですので、一括処理のために使うチェックボックスがありますが、今はチェックできるだけで、そこから何かを行う事は出来ません。
次期バージョンにご期待下さい。

とはいえ、分析機能だけでも結構面白いし有用です。
片想いなのか、方想われなのか。あれ?両想いだと思ってたあの人にいつの間にか外されてた…とか、一目瞭然です。
詳細表示にして色々と並び替えてみると、発言の多い人とかも浮かび上がってくるので、フォローしたり外したりの参考にどうぞ。

Written by Otchy in: Development | タグ:
5月
19
2009
2

css による疑似フレーム IE6 標準準拠モード完全対応版 (CSS ハック / JavaScript未使用)

css のみを使って、ヘッダ / メニュー / フッタをスクロールしないように固定して疑似フレームを表現する手法は position: fixed による方法が広く知られています。
この方法は、手軽に疑似フレームを表現できる一方で、IE6 が対応していないという非常に残念な現実があり、対象ブラウザから IE6 を完全に外してしまえるような状況ならともかく、(特に仕事の上などでは) IE6 を対象から外せない事も多いので頭痛の種でした。

IE 独自拡張の expression を使って、fixed に近い状況を作り出す技が色々と開発されているのですが、どうも自分にしっくり来るものがありませんでした。
そこで、下記の条件を満たすやり方を開発したので公開します。

  • IE6 標準準拠モードで動作させる
    IE 7 に関して、fixed を正しく動作させるために標準準拠に関しては重要な要件
  • css ハックは使わない
    将来のブラウザのバージョンで異変が起きる可能性を排除
  • メニューもフッタも固定する
    ヘッダだけの固定であればシンプルな実装が他にもある
  • 無駄な HTML マークアップを追加しない
    HTML 自体は fixed 対応ブラウザのみの場合と同様
  • 極力シンプルに記述できる
    冗長なコードを書いて無理矢理つじつまを合わせるような事はしない
  • スクロール時に画面がちらつかない
    expression の使い方によってはダサイ見た目になってしまうのでそれを回避
  • IE6 以外のブラウザに影響を与えない
    当然

論より証拠。まずはサンプルを見て下さい。
このページでは、ヘッダ / メニュー / フッタの 3 つがスクロールに対して固定されています。
fixed 対応ブラウザでは fixed で実現され、IE6 に関しては expression をちょっとだけ使っています。

まず、一般的な fixed 部分について簡単に解説します。

<div id="header">ヘッダ</div>
<div id="menu">メニュー</div>
<div id="contents">
START<br />
コンテンツ...<br />
END<br />
</div>
<div id="footer">フッタ</div>

HTML については、非常にシンプルです。
各部位ごとに異なる id を指定した div があるだけです。

css のうち装飾に関わる部分を除くとこんな感じです。

* {
	margin: 0;
	padding: 0;
}
#header {
	position: fixed;
	left: 0;
	top: 0;
	width: 100%;
	height: 24px;
	z-index: 3;
}
#menu {
	position: fixed;
	left: 0;
	top: 0;
	width: 150px;
	height: 100%;
	padding-top: 24px;
	z-index: 2;
}
#contents {
	padding: 24px 0 24px 150px;
	z-index: 1;
}
#footer {
	position: fixed;
	left: 0;
	bottom: 0;
	width: 100%;
	height: 24px;
	z-index: 3;
}

#header / #menu / #footer については、fixed で固定されています。
#menu / #contents では padding を指定する事で、重なってしまう部分が隠れないようにしてあります。
fixed 対応ブラウザであれば、これだけで疑似フレームの完成です。標準準拠モードになるよう、DOCTYPE を指定しているので、IE7 であっても同様に動作します。

続いて、IE6 向けの設定です。

<!--[if lt IE 7]>
<style>
#header, #footer, #menu {
	position: absolute;
}
#contents {
	overflow: auto;
	height: expression((document.documentElement.clientHeight - 48) + 'px');
}
#menu {
	height: expression((document.documentElement.clientHeight - 48) + 'px');
}
</style>
<![endif]-->

意外なほどシンプルではないでしょうか?これだけです。

<!–[if lt IE 7]> から始まる記述は IE 独自拡張の条件付きコメントで、IE 以外のブラウザでは完全に無視されます。
ここでは、IE 7 未満の IE を指定して専用の記述を読み込ませています。
どうせ IE に対してのみ動作を変えるのであれば、変に CSS ハックを使うよりよほどリスクが少なく確実な方法だと思います。

position: absolute; は、fixed に対応していない IE6 のために、設定を上書きしています。
css の設定は後勝ちなので、IE6 向けの設定は fixed 向けよりも後に書く必要があります。

#contens / #menu にある、expression がポイントです。
expression は、filter 関数などと同様の IE 独自拡張で、任意の JavaScript コードを使用して動的に css の値を指定する事が出来きるものです。

ここでは、#contents / #menu の高さを、ウィンドウ内部の高さからヘッダとフッタの分を引いた値に指定しています。
これにより「メニューとコンテンツ部分がウィンドウからはみ出ない」という状況が生まれ、実質的な疑似フレームになります。
また、expression 関数は、ウィンドウサイズが変更された際などにも自動的に再計算されます。

ヘッダとフッタの top や left を expression 関数で設定する手法も見かけたのですが、これだとスクロール時にちらつきが出るのでイマイチです。
この手法は、ウィンドウ自体がスクロールしないよう抑制し、コンテンツ部分のみを overflow: auto; でスクロールさせるという逆転の発想で実装されています。

ソースの全容はサンプルをダウンロードして確認して下さい。
また、実際に使用する時はもちろん、css を直接 HTML に書かず、外部ファイルに切り出した方がよいです。

Written by Otchy in: Development | タグ: , ,
5月
09
2009
4

ちんゃと よゃちめう?系ジェネレータまとめ

昨日、ちんゃと よゃちめう?ジェネレータ。 を公開したのですが、同日中 (もしくは翌日) にうちのサイトだけでなく、あちこちでジェネレータが出来ていました。
みんな考える事は一緒って事ですね。

所詮ネタなのでどうでもいいですが、皆さん、自分の手に馴染むお気に入りの一品を見つけて活用して下さい!

本当にいっぱいありすぎ!みんな暇すぎ!
それぞれ作者によって得意なやり方が違うんだなぁというのと、名前の付け方が色々だなぁというが見ていて面白かったですね。

よめしてまうリンクなんていう、まとめページもありました。
あわせてどうぞ。

Written by Otchy in: Development |
5月
08
2009
3

ちんゃと よゃちめう?ジェネレータ。

読めることが間違い? : ひろゆき@オープンSNS なんていう記事があって面白かったので、早速ジェネレータを作ってみました。


変換結果がイマイチだった時は、何度かボタンを押してみるといいと思います。
ソースが気になる方はこちらからどうぞ。
yomechau.js

追記

公開当初、変換元を変えても反映されないバグと、単語のシャッフルがときどき行われないバグがありました。
現在は修正済みです。

追記2

上手く漢字仮名交じりで書くと、いちいちスペースを空けなくてもそれっぽくなる事を発見。

Written by Otchy in: Development | タグ:

Powered by WordPress | Aeros Theme | TheBuckmaker.com