page_adsence

2009年4月24日金曜日

valueの書き換えに関して

Jqueryでinput textに入っている値をkeyupのイベントのタイミングで書き換えを行っていたら、
カーソルが強制的に文末に移動してしまうという現象があった。
発祥したブラウザはIE7のみ

コードは以下の通り。
$('input:text').bind('keyup', function(){
    var input_text = $(this).val();
    $(this).val( parseInt(input_text) );
})

どうもvalueを書き換えると、勝手にフォーカスを移動させるという
おせっかい仕様のせいらしい。

2009年4月22日水曜日

parseIntに関して

parseInt( number, 10 );

とやると10進数の数値型に直してくれるが、
以下のような数字を040から40にしたい場合にそのままparseIntすると問題があるので、
toStringしてから変換すること。
var a = 040;
var b = parseInt( a, 10 );
alert(b);

var a = 040;
var b = parseInt( a.toString(), 10 );
alert(b);

2009年4月21日火曜日

Jqueryのチェックボックス

$(':checkbox').val([1,2,3,4])

でcheckboxを一括で:checkedにできる。

select[multiple="multiple"]

でも同じようにできる。
指定された値以外の項目は

:not(:checked)

になる。

ってさ。
へー、速度が気になる所だけど、これ結構便利かも。

ajaxの通信時ステータスについて

XMLHttpRequest内にはreadyStateというプロパティがあり、
それは0~4でステータスが切り替わるたびに、この数字が切り替わる。

readyStateの詳細は以下の通り。
0 : open()は呼び出されていない。
1 : open()は呼び出されたが、send()は呼び出されてない。
2 : send()は呼び出されたが、サーバからのレスポンスはまだ返ってきてない。
3 : サーバからのデータを受信中。
4 : サーバからのレスポンスの受信が完了した。

readyState==3の時にはFirefoxとIEで挙動が変わる。
Firefoxに関しては通信中に何度もonreadystatechangeが呼ばれるが、
IEではステータスが切り替わったタイミングで1度だけ呼ばれる。

var request = HTTP.newRequest();
request.onreadystatechange = function(){
    if ( request.readyState == 4 ) {
        /* request complete */
    }
}

javascript 高速化

switch caseで文字列の比較ではなく、hashを用意して数値として比較したほうが早くなる。
但し文字列を、charAt() や charCodeAt() で数値化してから比較しようとすると関数呼び出しコストがかかる為、予想に反して遅くなる。

■参考URL
http://d.hatena.ne.jp/uupaa/20081029/1225223181

2009年4月20日月曜日

jqueryによる$.ajax通信の終了を取得するには

$.activeを使うと可能。
$.activeにはajaxの通信中の数が格納されており、
0になるタイミングで全ての処理が終わったことなる。

参考ページ
http://hkom.blog1.fc2.com/blog-entry-648.html

http://gihyo.jp/dev/feature/01/jquery/0012?page=3

2008年12月10日水曜日

画像やswfのキャッシュに関して

javascriptのImage Objectを使って画像があるかどうかを判定するコードを書いていると

IE6,IE7でonloadもonerrorもonabortも返ってこないという現象があった。

初回は普通にできるが2回目以降のチェックの際にURL自体はもらってきているのに、

処理が先に進まない・・・。



JqueryのLoad使ってやろうと思ったら、それはシステムエラーでなんかうまく動かない・・・。

なんだろうと思いつつ原因を探ってみると、

どうやらブラウザに残ってるキャッシュにアクセスして判定しようとしていたため、

処理が止まってしまっていたらしい。

キャッシュを残らないように「?~~」(適当なクエリ)をつけて送信すれば、

毎回サーバにアクセスされる。

2008年12月9日火曜日

objectやembedタグに直接display:noneをすると、一部のSafari、chromeで消えない

ジャック中に別のswfは基本非表示にしているが、
objectタグやembedタグに直接display:noneをかけると、Safariやchromeで非表示にならない。
非表示にしたい場合はvisibilityをhideenにする

2008年11月19日水曜日

FireFox3でoverflow:autoがあるとFlashの動作がおかしくなる

いつも通り全画面ジャックのブログパーツを作ってたらへんな現象に遭遇した。

■現象
クリックイベント自体は取れてるが、そのイベントに対してハンドルされているFlashの処理が実行されない。
通常、Flash上で右クリックするとFlash用のメニューがアイコンがある位置に出てくるが、
この場合画面左上のほうに出てくる。
また、アイコンがpointerのはずなのに、defaultになってしまう。

■原因
おそらくblog上にoverflow:autoがかかってるエリア上ではFlashコンテンツがうまく動作しないというブラウザのバグらしい・・・。

■対策
flashのwmodeをwindowにすると普通にいける。
以前IE6で透過するとクリックイベントがうまく取れないという現象があり、
それは透明に近いレイヤーを引くことで解決できた。
同様のことを今回のブログパーツでやってみたがダメだった。
JavaScriptで強制的にCSSを書き換えるにしても、
該当のCSSを検索するのに時間がかかるので現実的ではない。
正直お手上げ。
強行手段としてはいくつか案があるがどれも微妙な気がする。

■案1
CSSを追加することで強制的autoからhiddenにする
*{overflow:hidden !important}


これを全画面ジャック時に適用する。

■案2
wmode="window"のswfをイベントが設定されている位置に浮かせる。
これも相当な力技な上に、複数の場所でイベントが設定されてる場合は大変なことになる。

■参考記事

IE7でswfobjectがうまく動作しない

■現象
IE7でswfobjectを利用してFlashコンテンツをDOMに追加しようとするとエラーが出る。

■原因
FlashPlayerがバージョンアップの際に、古いバージョンのFlashPlayerを削除せずにインストールしているため、JavaScriptでFlashのバージョン判定する際に判別できずにエラーになってしまう。

■対策
現在のところ、そのような現象に当たったことがないので、対応は何もしてない。
もしやるとすればどうすっかなー。
よくわからん。
yktkさんも今のところ対策はしてないとのこと。
今までそういった報告ないから、結構レアなケースなのかな。
同時に大量にそういった報告がない限り対応する気がしない・・・。
しばらくは個別に対応してもらうっきゃないかなー。

■参考記事