blog.ikekou.jp

jQuery.proxy()でAS3.0ライクにイベントハンドラまわりを書く

個人的に
どーやるんだろ、っておもってたことができたので、jQuery.proxy()のメモ。
説明が面倒だからコードで。

例えば最も単純に書くとこうなるとする

var message = 'hello.';
$('#button').click(function()
{
	alert(message);
});

クラスにするとこうなる

var message='hello.';
var ExampleButtonController = function(element)
{
	element.click(function()
	{
		alert(message);
	});
}
new ExampleButtonController($('#button'));

messageをコンストラクタで渡そう

var ExampleButtonController = function(element,message)
{
	element.click(function()
	{
		alert(message);
	});
}
new ExampleButtonController($('#button'),'hello.');

でまあここまではいいけど、click()の引数の無名関数が再利用できないとかいけてないからクラスメソッドにしたい。(カプセル化は今は忘れる)

var ExampleButtonController = function(element,message)
{
	element.click(this.onClick);
}
ExampleButtonController.prototype={
	onClick:function()
	{
		alert(message);
	}
};
new ExampleButtonController($('#button'),'hello.');

となるけど、onClickで参照してるmessageはスコープ外。ダメ。インスタンス変数にしよう。じゃあ

var ExampleButtonController = function(element,message)
{
	this.message=message;
	element.click(this.onClick);
}
ExampleButtonController.prototype={
	onClick:function(event)
	{
		alert(this.message);
	}
};
new ExampleButtonController($('#button'),'hello.');

でいいじゃないか、とみせかけてこれもダメ。
onClickのスコープのthisはAS3と違ってインスタンスじゃない。イベントのターゲット。AS2はこんなだったよね。
そこでjQuery.proxy()の登場で

var ExampleButtonController = function(element,message)
{
	this.message=message;
	element.click($.proxy(this.onClick,this));
}
ExampleButtonController.prototype={
	onClick:function(event)
	{
		alert(this.message);
	}
};
new ExampleButtonController($('#button'),'hello.');

と書くと、onClickのthisがインスタンスになる。jQuery.proxyをはさんで、thisを事前に指定する。
じゃあ今までthisで取得してたイベントのターゲットはどうすんのって言うとまあもちろんインスタンス変数に持っておいてもいいんだけどこれもASと一緒で(というかW3Cの仕様らしい)

var ExampleButtonController = function(element,message)
{
	this.message=message;
	element.click($.proxy(this.onClick,this));
}
ExampleButtonController.prototype={
	onClick:function(event)
	{
		//これが、通常jQuery使ってる場合のthisにあたる
		alert(event.currentTarget);
		alert(this.message);
	}
};
new ExampleButtonController($('#button'),'hello.');

event.currentTargetでとれます。
event.targetとかもあります。まあASといっしょですね。

ということで、jQuery.proxy()を使うと、イベントハンドラを無名関数じゃなくできるので慣れた書き方っぽくできますよと。いうかんじでした。

でもJSでのオブジェクト指向はまだまだ勉強不足。
継承とかも結局どれがいーのかかたまってないし。
むずかしー

Categories : Development
Comments : 0

Facebook Friendlist Manager

Facebook Friendlist Manager 2

Facebookでフレンドリスト(発言の公開範囲を設定するグループ)を細かく設定するのに公式のUIはあまり向いてないです。一人一人設定していかないといけない。
Google+のはそこらへんやりやすくていいなーと思ったので、作りました。

Facebook FriendList Manager

[2011.12.07追記] Ctrl押しながらクリックで複数選択がMacではできてWinではできない模様。jQueryUIつかっただけなんで原因ちょっとよくわかってないのでわかったら修正します。一番便利なポイントなのに。。。

Functions

機能は
・フレンドリストの作成
・フレンドリストの削除
・ユーザーのフレンドリストへの追加
・ユーザーのフレンドリスト除外
です。
フレンド自体を削除したりとかはないです。

Usage

使い方は

Facebook Friendlist Manager 1

とりあえずJOINしてOAuthして

Facebook Friendlist Manager 3

左から順に、表示するフレンドリストを選択して、表示されたフレンドから処理対象フレンドを選択、次に処理対象のフレンドリストを選択して、最後に追加or除外を押す。
対象フレンドと対象フレンドリストは複数選択可。jQueryUIのお陰でドラッグでも選択できます。あとCtrl押しながらで複数選択できます。(一番やりたかったのは結局これ)
だから10人選んで、それをリストAとリストBに追加とか、その逆とか、できます。

Facebook Friendlist Manager 4

あとは左から三番目の処理対象フレンドリストの下に、フレンドリストの追加ボタンと、選択中のフレンドリストの削除ボタンあり。
フレンドリストの削除だけは間違って消しちゃうと悲しいので、確認ダイアログあり。気をつけて!

英語の成績は学生時代惨憺たるものだったので英語は多分おかしいけど、なんとなく伝わればまあいいです。

Notes

注意事項。
僕はフレンドが120人くらいしかいないので普通に使えてますけど、フレンドがめっちゃ多い人が使ったら多分止まります。何人くらいからやばいか不明。
リストからのフレンドの追加・除外処理は600件くらいまとめて(120人を5つのリストに追加)やっても大丈夫でしたけど、何件くらいからやばいか不明。
ブラウザチェックはMacのFirefox,Chrome,Safariの最新しかしてないです。IE?なにそれ。
止まったらリロードしてね。

一応免責。
このアプリを使って生じたいかなる損害も、その責任は負えませんのでご了承の上でご使用ください。

これでみなさんも今日から快適な陰口ライフを!

Facebook FriendList Manager

あ、キャプチャとるにあたって、嫁に内緒でFacebookやってたりしなさそうな、載せて大丈夫そうな方を選びましたが、問題あったらこっそり連絡ください。すぐ修正します。

Categories : Development
Comments : 0

CakePHP Tips

cakephp

CakePHPに関するメモ。

Read more ?

Categories : Development
Comments : 0

Mac Tips

IMG_4273
Creative Commons License photo credit: CLF

Mac OSX で mkpasswd が使えなくても pwgen がある | Sun Limited Mt.

Categories : Development
Comments : 0

HTML/CSS Tips

Nerdy books
Creative Commons License photo credit: cyrildoussin

[CSS]スクリプト無しで、高さがバラバラの画像を隙間無く配置するスタイルシートのテクニック | コリス

Categories : Development
Comments : 0
Copyright © kouseiikeda All Rights Reserved. Powered by WordPress 3.2.1.