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 | 用途 |
---|---|---|
innerText | textContent | エレメントの中のテキストのみ取り出す |
e.srcElement | e.target | イベントの発生元 |
tagName | localName | タグの名前(AとかIMGとか)* |
obj.currentStyle | document.defaultView.getComputedStyle(obj, '') | 実際に表示されているスタイル |
clientHeight | offsetHeight | エレメントの高さ |
clientWidth | offsetWidth | エレメントの幅 |
* 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; }
2008/08/29(金)ajax
せりかのアルバムで利用しようかと思い、試行錯誤中。
ファイルの移動や、リネームあたりを実装してみたいなぁ。
現在通信する部分を一通りライブラリ化。
あと、一部のよく使いそうなあたりもメソッド化。
prototype.jsとかYUIとか使えば簡単なんだろうけど、そこまででかいライブラリ入れても仕方ないし。
以下、現在の実装例のメモ
2008/08/27(水)[C++] 久しぶりだ
ここしばらくPHPとかJavaScriptとかPerlとかばかりだったのでなんかいろいろ忘れてる
で、一番戸惑ったのが変数の型。
以前は型があってこそプログラムという感じがしていたのに、逆に鬱陶しくなってきた。
探せば型に囚われない変数を扱うライブラリとかありそうだけど、リハビリも込めて自前でclassを書いてみることにした。
とりあえず目標は
var a;
a = "10";
a += 3.5;
cout << a; // 13.5
になるようにしたいところ
作ったけど
なんかいまいちなので無かったことにした。
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/06(日)エレメントのサイズ変更
なんとかなるようになりました.
今のところ
- IE6
- Firefox 2
- Firefox 3
- Opera 9.5
で動作確認済み
微妙な実装だったりもするけれど,なんとか目標は達成できた模様
まあ,自分で作らずにyuiとか使えば早かったんだろうけどね
JavaScript+CSSのお勉強と言うことで
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年以上たってるし,あまり期待できなさそうかな.
2008/06/26(木)JavaScript
久しぶりにいじってみたけど,かなり忘れてる.
手元に一冊辞書が欲しい.