汎用化

昨日のは マウスオーバー, マウスアウトによる制御だったけど他のイベントでもできるようにしてみた。

(function($){
	$.fn.eventDelay = function(delay, triger, cancel, callback) {
		return this.each(function() {
			var target = $(this);
			var tid;
			target.bind(triger, function(){
				tid = setTimeout(callback, delay * 1000)
			})
			target.bind(cancel, function(){
				clearTimeout(tid)
			})
		});
	}
})(jQuery)

引数が多くなったけど気にしない。

マウスオーバー

昨日のをこれで書くと

$('#foo').eventDelay(5, 'mouseover', 'mouseout', function(){
	alert('bar')
})

キー入力

最後のキー入力から 1秒後に 内容をアラート.

<input id="foo" type="text" />
$('#foo').eventDelay(1, 'keyup', 'keydown', function() {
	alert($('#foo').val());
});


名前が適当すぎるけど気にしない。 delay ではないと思う。

マウスオーバーしつづけると動く

はてなスター削除の時のように、ある要素にマウスオーバーし続けるとある動作が起こるようにする jQuery プラグインを書いた。

(function($) {

$.fn.mouseOverDelay = function(delay, callback) {
  return this.each(function(){
    var tid;
    $(this).hover(function(){
      tid = setTimeout(callback, delay * 1000);
    }, function(){
      clearTimeout(tid);
    });
  });
}

})(jQuery);

/* 
  例: id=foo な要素に 5 秒間マウスオーバーし続けると 'bar' とアラート
  $('#foo').mouseOverDelay(5, function() { alert('bar') });
*/


名前が適当すぎて泣ける。

new Number() and new Boolean()

0 || 1
>> 1 // JavaScript では 0 も false のようにあつかわれると、思っていたんだけど
Number(0) || 1
>> 1 // これは普通だ
new Number(0) || 1
>> 0


false || 1
>> 1
Boolean(false) || 1
>> 1
new Boolean(false) || 1
>> false


typeof 関数で object がかえるものはすべて true なのか。
これではまる人はあんまりいないか。

preventDefault() and stopPropagation()

jQuery でイベントの伝播を止めたり、デフォルトの動作を殺したりするには

element.click(function(evt) {
  evt.preventDefault();
  evt.stopPropagation();
  alert('hoge');
});

のように書くんだけどこれは, IE

event.returnValue = false;

event.cancelBubble = true;

もやってくれるのね。
そりゃそうだよな。同じ名前だからやってくれてないのかと一瞬思った。

http:// を補完する.

ttp:// とか tp:// とかを http:// にする.

function completeHttp(str) {
    var sc = "http://"
    var h = sc.split("");
    var i = 0;
    while(str.indexOf(h.join('')) != 0) {
        h.shift();
        i++;
    }
    return sc.substr(0, i) + str;
}

var a = "http://www.google.com/";
var b = "ttp://www.google.com/";
var c = "tp://www.google.com/";
var d = "p://www.google.com/";
var e = "://www.google.com/";
var f = "//www.google.com/";
var g = "/www.google.com/";
var h = "www.google.com/";

print(completeHttp(a) == a);
print(completeHttp(b) == a);
print(completeHttp(c) == a);
print(completeHttp(d) == a);
print(completeHttp(e) == a);
print(completeHttp(f) == a);
print(completeHttp(g) == a);
print(completeHttp(h) == a);

追記

普通に正規表現でできたな.トラックバックを参考.

Object.watch メソッド

LDRの未読数をfaviconに表示するGreasemonkeyスクリプト - 素人がプログラミングを勉強していたブログ を見ていて watch メソッドってのがあったことを思い出した.


で,調べて見たところ watch メソッドっていうのは Firefox(Gecko) でしか使えないのか?*1
さらに,JavaScript のバイブル オライリーJavaScript 第5版を見てみると watch() を扱っているページがない.
ECMAScript のページにも載っていない.


コーヒーで汚れた JavaScript 第3版にはしっかりあるのになぁ*2


あったところで watch メソッドの使い道が思いつかないけど.

*1:IE 未検証

*2:P158 8.7.5