2008/11/06(木)javascriptのprototypeではまった

微妙にはまった罠

A = function(){}
A.prototype = {
  data: new Array(),
  push: function(a){
    this.data.push(a);
  },
  pop: function(){
    return this.data.pop();
  }
}

a = new A();
b = new A();

a.push('1st');
a.push('2nd');
b.push('3rd');

a.pop(); // -> '3rd'
b.pop(); // -> '2nd'
a.pop(); // -> '1st'

当然と言えば当然だけど、ポインタ的なものが見えにくいので原因がわかるまで時間がかかりました。というか、C++のクラスとJavascriptのプロトタイプの違いがわかった気がする。正しくは↓の通り。

A = function(){
  this.data = new Array();
}
A.prototype = {
  data: null,
  push: function(a){
    this.data.push(a);
  },
  pop: function(){
    return this.data.pop();
  }
}

a = new A();
b = new A();

a.push('1st');
a.push('2nd');
b.push('3rd');

a.pop(); // -> '2nd'
b.pop(); // -> '3rd'
a.pop(); // -> '1st'

オブジェクトを生成するたびに data そのものを正しく初期化する必要あり。

2008/09/09(火)IEとFFの互換性を維持するために

片方にあったり無かったりするメソッドやプロパティを何とかするためのメモ。
無い場合はundefinedとか返されるので || で繋いでしまえばなんとかなることが多い。

メモ書きなので間違えてるかも。
でも、
x = obj.yyy || obj.zzz;
って書く分には逆でも問題なかったりする。

そのうちいろいろ追加したりすると思う。

プロパティまわり

IE FF 用途
innerTexttextContentエレメントの中のテキストのみ取り出す
e.srcElemente.targetイベントの発生元
tagNamelocalNameタグの名前(AとかIMGとか)*
obj.currentStyledocument.defaultView.getComputedStyle(obj, '')実際に表示されているスタイル
clientHeightoffsetHeightエレメントの高さ
clientWidthoffsetWidthエレメントの幅

* Safari, Google ChromeはlocalNameは小文字で、tagNameは大文字で返すっぽい

イベントまわり

デフォルトの動作を止める

_preventDefault = function (ev){
  if(IsIE)  ev.returnValue = false;
  else      ev.preventDefault();
}

これ以上次の要素にイベントを送らない

但し、IEとFFではイベントの発生順が逆なので注意

_stopPropagation = function (ev){
  if(ADIARY.IsIE) ev.cancelBubble = true;
  else            ev.stopPropagation();
}

エレメントのイベントにメソッドを割り当てる

クリックとかいろいろ。
但し、無名関数を登録すると取り除けなくなるので注意*1

addEvent = function (target, name, func) {
  if(target == undefined || name == '' || func == undefined) return;
  if(target.addEventListener) target.addEventListener(name, func, false);
  else if(target.attachEvent) target.attachEvent('on'+name, func);
  else return false;// setAttribute('on'+name, func);

  return true;
}

エレメントのイベントからメソッドを取り除く

上のaddEventで追加したやつ限定

delEvent = function (target, name, func) {
  if(target == undefined || name == '' || func == undefined) return;
  if(target.removeEventListener) target.removeEventListener(name, func, false);
  else if(target.detachEvent)    target.detachEvent) ('on'+name, func);
  else return false;// setAttribute('on'+name, '');

  return true;
}

*1 : arguments.calleeを使うと取り除けたりするけどそれは例外

2008/08/29(金)ajax

せりかのアルバムで利用しようかと思い、試行錯誤中。
ファイルの移動や、リネームあたりを実装してみたいなぁ。

現在通信する部分を一通りライブラリ化。
あと、一部のよく使いそうなあたりもメソッド化。

prototype.jsとかYUIとか使えば簡単なんだろうけど、そこまででかいライブラリ入れても仕方ないし。

以下、現在の実装例のメモ

続きを読む

2008/08/27(水)[C++] 久しぶりだ

ここしばらくPHPとかJavaScriptとかPerlとかばかりだったのでなんかいろいろ忘れてるtp162_sweat01

で、一番戸惑ったのが変数の型。
以前は型があってこそプログラムという感じがしていたのに、逆に鬱陶しくなってきた。
探せば型に囚われない変数を扱うライブラリとかありそうだけど、リハビリも込めて自前でclassを書いてみることにした。

とりあえず目標は

var a;
a = "10";
a += 3.5;
cout << a; // 13.5

になるようにしたいところ

作ったけど 2008/08/28

なんかいまいちなので無かったことにした。

2008/07/21(月)日付関数 mktime

mktime

int mktime ([ int $hour [, int $minute [, int $second [, int $month [, int $day [, int $year [, int $is_dst ]]]]]]] )

指定した時間とかでUNIX時間を作る.
それぞれのパラメータには,負の数や本来の値を超えた数値を指定することができる.
その場合,適切に日付は変換されるため,特定の日付からの相対日を作ることができる.

mktime(0, 0, 0, 7, -1); // 6/30のこと
mktime(0, 1600, 0, 7, 1); // 1600min -> 26[hour] 40[min]なので 7/2 2:40のこと

以下検索用

[php] [getdate] [mktime] [日付]

2008/07/05(土)オブジェクトのサイズ

フォームオブジェクトのサイズを変更したいということで,ここ最近ずっといじってるのですが,やはりIEが強敵.
Firefoxは無事動いたのですが,IEがどうしても思うような動作にならない.

今のところ一番の問題点は,高さが正しく設定できない.height指定しても,実際の高さはそれ以上になってしまう.
もうしばらく悩むことになりそうです.

2008/06/26(木)Resizeable Textareaをいじってみた

Firefox addonのResizeable Textareaとかいうやつ.
formのtextareaのサイズを自由に変えられるようにする拡張.
長文を書くときなどに便利.

なんだけど,残念なことにサイズを変えられるのはtextareaのみ.普通のinput type="text"も横幅広くしたいので,他のも広げられるように拡張してました.
今のところ

  • input type="text"
  • input type="password"
  • select

を追加*1.ただしX軸方向のみresize可能.

一応 Resizeable Form Fields ってのもあるのですが,firefox3まで対応するつもりはないResizeable Textareaが3に対応しそうってことで,配布をやめてしまったようです.

Resizeable Textareaのほうで対応して貰えるとありがたいけど,アップロードされてから1年以上たってるし,あまり期待できなさそうかな.

*1 : iframeにも対応させたいけど,うまくいかないらしい.