2013年03月15日

JavaScriptのクイズ

会社で同僚に出したクイズです。ちょっとだけ罠入り。
どの順番で何が出力されるかな。

posted by 膳 at 14:27| Comment(0) | TrackBack(0) | JavaScript

2011年09月28日

JavaScriptでbound method

Function内のthisの値は呼び出し方によって変化するので、下記コードは意図通りに動かない。
//クラス定義
function Hoge() {
    this.propertyA = 1;
}
Hoge.prototype = {
    methodA: function() {
        return this.propertyA;
    }
};

//callback関数を受け取る適当な関数
function fuga(callback) {
    return callback();
}

var hoge = new Hoge();
console.log(fuga(hoge.methodA));    // undefined が出力されてしまう

pythonのbound methodみたいに、インスタンス生成時にthisの値を束縛してくれればインスタンスメソッドの使い勝手がよくなりそうなので、クラス定義を次のように書き換えてみた。
function Hoge() {
    this.propertyA = 1;
    for (var property in this) {
        if (typeof this[property] == 'function') {
            this[property] = (function(context, method) {
                return function() {
                    return method.apply(context, arguments);
                };
            })(this, this[property]);
        }
    }
}
Hoge.prototype = {
    methodA: function() {
        return this.propertyA;
    }
};

var hoge = new Hoge();
console.log(fuga(hoge.methodA));    // ちゃんと 1 が出力される
var a = hoge.methodA;
console.log(a());     // これでも 1 が出力される。

実際のプロダクトではこんなことしないで引数渡すときにjQuery.proxy使うけど。
posted by 膳 at 21:43| Comment(0) | TrackBack(0) | JavaScript

2011年05月05日

JavaScriptで名前空間2

二年前に、JavaScriptで名前空間という記事を書いたんですが、最近は名前空間の定義方法を変えています。

以前は、window.jp.zenbo というように、ドメイン毎にオブジェクトを用意していたのですが、同じ方法で名前空間定義する外部スクリプトと window.jp が競合しそうで怖いので(もしくはサイト側のJSが var jp, com と定義する確率がわずかにある)、window['jp.zenbo'] といった風に競合しないであろうグローバルな名前空間一つだけ用意するようにしています。

// 昔の定義方法
if (typeof window['jp'] === 'undefined') window['jp'] = {};
if (typeof window['jp']['zenbo'] === 'undefined') window['jp']['zenbo'] = {};

// 今の定義方法
if (typeof window['jp.zenbo'] === 'undefined') window['jp.zenbo'] = {};

window['jp.zenbo']以下は俺俺ルールで好きに使っておk。
名前空間は被らないようにするのが第一の目的なので、ドット付きの変数名ならまず大丈夫ではないでしょうか。
本当に大丈夫かどうか心配なので、何か問題あったら教えて下さい。
posted by 膳 at 12:46| Comment(0) | TrackBack(0) | JavaScript

2009年08月02日

産経ニュースのキーワードポップアップを無効にするgreasemonkey

ついカッとなって産経ニュースのキーワードポップアップを無効にするgreasemonkey書きました。
onmouseは慎重に使うべきだと思う。

EraseSankeiKeyword ver1.0.0.0
■ダウンロード

posted by 膳 at 14:06| Comment(1) | TrackBack(0) | JavaScript

2009年07月01日

GMarksの「オンラインで管理」が使えなくなった

多分、google側の仕様変更なんでしょうけど、GMarksメニューバーの「オンラインで管理」を選択してもgoogleのトップページに飛ばされるようになってしまいました。
というわけで、
componentsns/IGMarksCom_google.js


14行目
return "https://google.com/bookmarks";
 ↓
return "https://www.google.com/bookmarks";

と書き換えればおk。
ちなみに、0.9.9から1.0のバージョンアップで1000件バグは解消されたぽいです。
追記:変更前、変更後が逆だったので修正。
posted by 膳 at 23:22| Comment(0) | TrackBack(0) | JavaScript

2009年06月16日

mootoolsのFunction#delayは0秒指定で即時実行される

delayってのはFunctionインスタンスにsetTimeoutを組み込んだメソッドなんですが、これをsetTimeoutと同じように0秒指定(もしくはNull)で使用すると、メソッド呼んだ瞬間に実行されるらしい。

setTimeout(function() {
  alert("tnk");
}, 0);
alert("unk");


これは"unk"の後に"tnk"が表示される。

(function() {
  alert("tnk");
}).delay(0);
alert("unk");


でもdelayだと、"tnk"の後に"unk"が表示される。
delayに0を渡すことが何を意味するのかってのは難しいところだけど、公式のドキュメントにsetTimeoutのリンク貼ってるなら仕様は併せて欲しいなぁ。
posted by 膳 at 21:44| Comment(0) | TrackBack(0) | JavaScript

PixivFilterをAutoPagerizeに対応させました

pixivではAutoPagerizeを無効にしてたので絶賛放置中だったんですが、他のGMスクリプト見たら簡単そうだったので、AutoPagerizeに対応させました。
多分動く。

PixivFilter ver1.2.0.0
■ダウンロード
posted by 膳 at 00:03| Comment(2) | TrackBack(0) | JavaScript

2009年06月09日

unsafeWindow内のprototypeを書き換えつつGM関数を呼ぶ

愛復活です。

Greasemonkey側からprototypeオブジェクトにアクセスできないならunsafeWindow側でやってらえばいけるかもと試してみたらいけたっぽい。

GreasemonkeyをBookmarklet的に実行してみる - 0x集積蔵
と、
いくつかのGreasemonkeyスクリプトが動かなくなってた件 - 青春スイーツ
の合わせ技です。


例として、下記のカウントするだけのクラスをGM_getValue, GM_setValueを使って永続的なカウントをするように上書きします。

■unsafeWindow

■Greasemonkey


めんどい。
posted by 膳 at 21:37| Comment(0) | TrackBack(0) | JavaScript

2009年06月08日

Greasemonkeyの○○○!!

今更な話題なんですけど、今まさにGreasemonkeyでunsafeWindow内のprototypeにアクセスできないという問題にぶち当たってしまい、

GreasemonkeyをBookmarklet的に実行してみる - 0x集積蔵

の解決策見つけたけど、GM_setValue,GM_getValue,GM_xmlhttpRequestを使いたかったのにうわぁぁぁぁぁんな状況です。
愛が壊れた\(^o^)/
posted by 膳 at 23:02| Comment(0) | TrackBack(0) | JavaScript

2009年05月16日

EventDispachable verうp

EventDispatchable.jsを地味にバージョンアップさせました。

イベントリスナー登録時にスコープだけじゃなくてもっと色んな値をバインドさせたいよぉぉぉぉという自分需要に応えて、第四引数に配列を指定することで、リスナー関数がその配列の要素を第二引数以後で受け取れるようになりました。

例)
//イベントリスナー
function listener(eventArgs, arg2, arg3) {
  alert(arg2);
  // "value2"
  alert(arg3);  // "value3"
}
//hogeイベントにリスナーを登録
target.addListener("hoge", listener, null, ["value2", "value3"]);

prototype.jsのbindAsEventListener、mootoolsのbindWithEventが内包された感じです。
posted by 膳 at 22:27| Comment(0) | TrackBack(0) | JavaScript

2009年03月01日

GMarksの上限を突破する方法

元々GMarksは1000件超えた場合の処理も入っていて、1000件超えるとそれが表示されなくなるってのはただのindex上書きバグでした。
というわけで、
componentsns/IGMarksCom_google.js


337行目
com.GMS.bookmarkArray[i]=newbkmk;
 ↓
com.GMS.bookmarkArray[tIndex]=newbkmk;

358行目
com.getBookmarksFeed(action,sidebar,start+1000,num);
 ↓
com.getBookmarksFeed(action,sidebar,start+1000-1,num);

と書き換えればおk。
posted by 膳 at 12:07| Comment(5) | TrackBack(1) | JavaScript

2008年11月04日

prototype.jsのeachメソッドが強化されていた

暇を持て余していたのでprototype.jsのソースを読んでいたんですが、いつの間にかeachメソッド第二引数が増えてました。

ver1.5
each: function(iterator)
 ↓↓↓
ver1.6
each: function(iterator, context)

contextはiteratorのスコープとして使われるようなので、今まで

var self = this;
hoge.each(function(value, index) {
self.fuga(value);
});


みたいにわざわざ変数作ってthis参照保持していたのが

hoge.each(function(value, index) {
this.fuga(value);
}, this);


とスッキリ書ける。
1.6からこんな感じになってたのに全然気付かなかった\(^o^)/
posted by 膳 at 22:23| Comment(0) | TrackBack(0) | JavaScript

2008年10月26日

イベント駆動なオブジェクトにする

本業がテストとドキュメント作成ばかりなので週末プログラミングがはかどります。
というわけで、コードをちょいちょいいじくっていたんですが、標題のライブラリが形になったので公開です。

ソース

色々試行錯誤した結果、

fladdict.net blog: イベント・ドリブンなJavaScriptのやり方
http://www.fladdict.net/blog-jp/archives/2005/06/javascript.php

上記サイトの丸パクリになりました。

特徴としては、
1.リスナー関数登録時に実行時のスコープを指定できる。
 (this参照先変わってめんどいから)
2.イベント名を配列で指定したら一斉登録できる。
 (successだろうがfailedだろうが同じリスナー関数呼んでよ!って時に便利)
3.オブジェクトの全メソッドに対して開始/終了イベントを自動付与できる。
 (メソッドの開始と終了時に勝手に呼ばれます)
4.イベントをオブジェクトのプロパティとして扱える。
 (文字列で指定するのはなんか嫌だって人向け)
W3C DOM3互換じゃないのが利点であり欠点。

詳しい解説は以下に(ソース内からの抜粋)
続きを読む
posted by 膳 at 16:22| Comment(0) | TrackBack(0) | JavaScript

2008年08月20日

RSSに混じった広告が邪魔すぎる

某アメーバブログがRSSに広告入れるようになって邪魔だったので、なんとかLDRのエントリーから消せないもんかと思案してたらすでにもうありました。

livedoor Reader で特定のサイトや記事の本文を非表示にする - (new Hatena).blog()
http://d.hatena.ne.jp/reinyannyan/20060714/p1

if (/b.hatena.ne.jp\/hotentry/.test(link)) {
を消して全サイト対象にして、
item.category.match(p)

item.title.match(p)
にして広告っぽいタイトルをandsにぶっこむ(/PR:/でいい)。

心が病気で広告が気になって仕方ない人向け。
ありがたやありがたや。
posted by 膳 at 22:01| Comment(0) | TrackBack(0) | JavaScript

2008年08月05日

cloneNodeでのイベントコピー

cloneNodeではイベントがコピーされない。(DOM2で決まってるらしい)
でもIE7だけはコピーする。(イベント解除処理がコピー元と共有されるという情報見たけど再現しなかった)
HTMLタグの中にonclick="hoge()"と書いたものはコピーされる。(でもこれはちょっとねぇ……)


結論:jQueryのcloneメソッドを使う。(ライブラリの選択権あるといいね……)
posted by 膳 at 23:21| Comment(0) | TrackBack(0) | JavaScript

2008年07月02日

フォーム部品の取得

フォームから form1["hoge"] と名前で中身のinput要素を取り出した場合、

1.同名要素が複数ある場合はNodeList(配列みたいなの)を返す
2.一つしかない場合はその要素を直接返す

という仕様だと知らずに躓いたorz

ラジオボタンとかチェックボタンを動的に生成して何個あるのか分からない場合は、配列もどきが返ってきたりコントロールそのものが返ってきたりでめんどくさいです。
取得後にlengthプロパティを見てundefinedだったら配列化してどっちも同じように扱えるようにして回避したんですが、もっとスマートな解決方法はないですかねぇ……。
posted by 膳 at 23:53| Comment(0) | TrackBack(0) | JavaScript

2008年06月26日

PixivFilter verうp

投稿者が付けたタグに*が付くようになったのでそれに対応しました。
ついでにメンバーIDでフィルタかけられるようにしました。
使い方はタグの時と同じような感じで、NG_ID_LISTにカンマ区切りでフィルタかけたいIDをぶっこめばおkです。

PixivFilter ver1.1.0.0
■ダウンロード
posted by 膳 at 23:49| Comment(7) | TrackBack(1) | JavaScript

2008年04月29日

Greasemonkey使ってフィルタかけちゃえ

pixivでホモ画像見たくないから閲覧制限かけてよ\(^o^)/
とお願いしても望み薄そうなので、Greasemonkeyでタグフィルタ実装してみました。

使い方は、NG_TAG_LISTにカンマ区切りでフィルタかけたいタグをぶっこめばおkです。
タグを取得するために詳細画面のHTMLもらいに行っているので、読み込みが終わるまでフィルタ対象の画像が出っぱなしになってしまいますがそこはご愛敬。

■ダウンロード
posted by 膳 at 22:12| Comment(27) | TrackBack(2) | JavaScript

2008年04月20日

JavaScriptでテーブルを操作する

春なので、いきなり「JavaScript書け」と職場で言われて困惑しているIT奴隷仲間も多いことでしょう。
なので、特につまずきそうなテーブル操作についてざっくりまとめてみました。
ちゃんとした情報はJavaScriptクイックリファレンス 第5版でも参照してください。


続きを読む
posted by 膳 at 23:47| Comment(5) | TrackBack(0) | JavaScript

2008年04月13日

JavaScriptは俺の嫁

なんて言葉を全く見かけない。他の言語についても同様っぽい。
これはやはり、
「俺なんか全然お前のこと理解してやれてないよ」
という引け目のせいで、プロポーズする勇気が沸かないためではないだろうか。
自分にしても「結婚したい」という願望であって、それを現実にできるかは定かではない。
他の奴の方が○○言語を幸せにしてやれるんじゃないか、それが○○言語のためじゃないのかと毎夜悶々としているプログラマが数多くいるに違いない。


というわけで、
>> くわん
まぁ引かれると思う。俺も引く。
式には呼んでくれよな!

式は当分先になりそうです。
別の言語に浮気もしたいし。
posted by 膳 at 02:02| Comment(2) | TrackBack(0) | JavaScript