Kinopyo Blog

プログラマとしてRuby, Rails, iPhone, iPad,Macなどなどと向き合う日々のログポース

Posts Tagged ‘トラブル’

jQuery focus()によるIEとFirefox動きの違い

2009年11月22日

jQueryのfocus()はデフォルトのフォーカス動作とそのエレメントにバインドされたイベントが実行されます。

しかしIE8とFirefoxではこのfocus()の動作が多少違います。

現象

例えば複数のinput要素があって、それぞれfocusイベントとblurイベントがバインドされたとします。

focus()を実行する前はelem1にフォーカスしていて、要素$(‘elem2′).focus()を実行すると

  • Firefox 3.5.5ではelem1のblurイベントが実行した後に、elem2のfocusイベントが実行する
  • IE8ではelem1のblurイベントは実行されますが、elem2には2回フォーカスするように動作します。つまり下記の動きです。
    1. elem1のblurイベント
    2. elem2のfocusイベント
    3. elem2のblurイベント
    4. elem2のfocusイベント

普通に考えたらFirefoxの動きが正しいはずですよね。
上記の3と4は余計な処理になります。

サンプルコード

$("form :input").bind("focus", function() {
	$(this).css("background-color", "gray");
	// ログを出力
		$("#result").append($(this).get(0).id + " focus event triggered.");
	}).bind("blur", function() {
	$(this).css("background-color", "");
	// ログを出力
		$("#result").append($(this).get(0).id + " blur event triggered.");
	});
$("#foo").focus();
setTimeout(focusBar, 3000);
function focusBar() {
	$("#" + document.activeElement.id).trigger('blur');
	$("#bar").focus();
};
Foo

Bar

先にfooテキストエリアにフォーカスしてくささい。

3秒後にbarテキストエリアにfocus()メソッドでフォーカスします。

その時の出力ログを見てください。

回避策

まだいい方法はつかんでません。

Googleで検索すると似たようなものはありましたが、

回避策はまだないようです。

[jQuery] Focus event firing twice in Internet Explorer

IE JavaScript実行した際の「アクセスが拒否されました」メッセージ

2009年11月19日

経緯

iframeで動的に画面を読み込む際URL不正などによる通信エラーが起こした場合の

エラーハンドラを追加したかったので判断するロジックが必要でした。

わざと誤ったURLを渡して検証しましたが、以下のコードはだめでした。


// documentがnullかと思ってそれで判断しようとしたんです。
if (this.contentWindow.document) {}

現象

あるプロパティは存在しているのに、アクセスができない。コードで書くと

// プロパティがオブジェクトに存在するかを判断
// ここはアラーとが出した、つまり存在したってこと
if ("aProperty" in obj) alert('obj has aProperty');
// 次にそのオブジェクトにアクセスしようとすると
// エラーになった
obj.aProperty

IE8の開発ツールで見たら「アクセスが拒否されました」と書いてある。

f:id:kinopyo:20091119133655j:image


エラーをcatch

判断のロジックをtry-catch文に書けばいいです。

try {
this.contentWindow.document;
} catch (e) {
if (e.number == -2147024891) {
//アクセスが拒否されました。
alert(e.message);
} else {
alert("別のメッセージ");
}
}


参考サイト:http://sei.qee.jp/docs/freetalk/2009/02.html

IE6でjQueryを使う時のエラー:selectにoption生成の不具合

2009年11月09日

環境f:id:kinopyo:20091110011109j:image:right

  • IE6
  • jQuery1.3.2

現象

IE7、IE8、Firefox上全部OKのアプリが

なぜかIE6ではエラーが頻発しました。

エラーの詳細もないので、原因がはっきりわかりません。


ソースは特に変な作り方をしてないと思うので、

やはりIE6が主な原因と判断しググってみました。

調査結果

IE6でselect boxに

その追加した値を.valで設定しようとすると上記のエラーが発生します。

(設定する値が追加した値以外の場合、正常に設定できます)

今回のアプリではselectボックスは静的にHTMLで書いて、

jQueryでoptionをどんどんappendしてました。

やはりこの辺が怪しかったですね。


回避策としてあげられるのは.valを設定する前に.width()を一回実行することです。

信じられないぐらい、本当になおりました。

setTimeout(function () {}, 0); も回避策の一つとの選択肢もあったのですが、

なぜかこれは効きませんでした。

以下個人感想

IE6のばかばかしい動きが元凶なので、詳しく追求する気はないです。

ほかにもjQueryを使うときに注意すべきものがいっぱいあるようです。

まあ、またエラーなんか起きたらそのときまた検索すればって思います。


ウェブアプリ開発者はIE6~IE8、Firefoxなどいろいろなブラウザにも注意しながら

開発するしかないことがすごく嫌です。

この前FirefoxがやっとIE6を市場シェアを抜けて一位になった記事がありました。

(Firefox > IE6 > IE7 > IE8の感じかな、トータルではもちろIE全体がまだトップ)

IE6なんかもう早く下がってほしい。


なので、ブラウザに気にしないFlex開発に興味を持ち、今勉強中です。

そこら辺の感想はまた別途で記事書きます。


ちなみに、Google分析で私のブログを見る平均時間は44秒です。

内容的にこんなに駄目なんですか。。?

44秒、、短すぎ、、

参考になったサイト

jQueryでoption要素を追加した際の諸問題

jQueryを使うときに気をつけるべき8のポイント