Kinopyo's Blog

I love this game.

アーカイブ

Posts Tagged ‘jQuery’

jQueryセレクタのパフォーマンス:elem vs id

2010年05月17日

elem指定とID指定のjQueryセレクタパフォーマンス実験を行いました。

“先にJavascriptでelementをとってそれをjQueryの$セレクタに囲むやつ”

vs

“直接jQueryのidセレクタでとるやつ”。


コードで言うと

$(document.getElementById(“foo”))

vs

$(“#foo”)


普通前者が勝だろうと思うだろう、

どれくらいの差かを確認したくて。

結果

一万回ループでとった結果です。

  • IE8: 187 vs 344
  • IE6: 203 vs 453
  • Firefox×(3.6.3): 21 vs 63
  • Chrome(4.1.xx): 9 vs 39

サンプルコード

デモページへ

var t0 = new Date();

for (var i=0; i<10000; i++){
	$(document.getElementById("foo"));
}

var t1 = new Date();

for (var i=0; i<10000; i++){
	$("#foo");
}

var t2 = new Date();

alert("直接elementを渡す時間は:" + (t1-t0) + " , ID指定でとる時間は:"+ (t2-t1));

jQuery blockUI Pluginのバグ:unblock時にマウスカーソルが砂時計のまま(IE, Chrome)

2010年04月26日

下記のURLで試してみればすぐ分かりますが、

表題の通りblockUIで制御したところは解除した後にマウスのカーソルがおかしいです。

IE,FirefoxとChromeでテストした結果、Firefoxは無事のようです。

http://malsup.com/jquery/block/position.html

解決策

jquery.blockUI.jsを開いてreset()のfunctionのところに以下のコードを追加

data.el.style.cursor = 'default';

第三者のソースに手を加えるのはあまりやりたくないけど。

参考サイト

Forbidden

jQuery siblings()とchildren()の内部ソースを見た

2010年04月19日

よく出来ていると思います。

勉強になります。

siblings: function( elem ) {
	return jQuery.sibling( elem.parentNode.firstChild, elem );
},
children: function( elem ) {
	return jQuery.sibling( elem.firstChild );
},

そしてjQuery.sibling()の中身です!

nodeTypeが1の場合はelementノードの意味です。

nはループに使われて、elemは除外する要素です。

例えばsiblings()の場合は自分自身を除外しています。

for文の書き方も覚えとこう、、

javaでのIteratorのhasNext()関数みたいな動きをしていますね。


	sibling: function( n, elem ) {
		var r = [];

		for ( ; n; n = n.nextSibling ) {
			if ( n.nodeType === 1 && n !== elem ) {
				r.push( n );
			}
		}

		return r;
	}

jQuery1.3.2 bind時にnamespaceを使うとIE6ではメモリリーク

2010年04月04日

表題の通り、IE6 + jQuery1.3.2の状態でbindする時に

jQueryのnamespaceを使うと確実にメモリリークが発生します。

jQuery1.4.2では発生しないことを確認しました。

メモリリークが発生するコード

$("#foo").bind("change.abc", function(){});

上記”change.abc”のabcがnamespaceです。

それをなくすことでメモリリークは解消されます。

イベントハンドラの中身とは関係ありません。

メモリリークは発生しない

$("#foo").bind("change", function(){});

これはjQueryのbugとして上げられましたが、

完全に修正できなかったみたいです。

http://dev.jquery.com/ticket/4241

当時の担当者のコメントを見ると

I had a really difficult time getting a reliable test case to verify this actually solves the memory leak. r6321 appears to have fixed this issue

「時間ないからちゃんとテストしてない、r6321の対応で解決できたように見える」と、

ずいぶん適当な回答ですよね。。。

jQueryパフォーマンス:DOM操作について

2010年03月26日

DOM操作を避けてjQueryのパフォーマンスを改善する掟です。

こんなコードがあるとしましょう。

パフォーマンスの悪い例

var list = [....];    // 長さ100の配列とする

for (var i in list) {

    var li = document.createElement("li");

    $(li)
       .attr("id", "li" + i)
       .text(list[i]);

$("ul").append(li);

}

改善したコード

var list = [....];    // 長さ100の配列とする

var li = "";
for (var i in list) {

    li += "<li id='li" + i "'>" + list[i] + "</li>";

}

$("ul").html(li);

まとめ

  • document.createElementの代わりにHTMLの文字列を作る
  • jQueryオブジェクトに属性やテキストを設定するのではなく、直接HTML文字列に書く
  • for文内毎回appendの代わりにhtml()を使う

実際のプロジェクトでやってみたら10倍以上は速くなりました。

とは言ってもこれはIE6でのパフォーマンスで、

FirefoxやIE8だと悪い例のコードても遅いとは実感できないくらいでした。

ちなみに

$(li).attr(…).val(…).text(…)の方は読みやすいので結構気に入ったんですけど。。。

jQuery1.3.2のバグ?IEで&nbsp;を$.trimするとき変な結果に

2010年03月10日

jQuery 1.4.2ではこれは治ったようです。

jQuery最新版をお使いの方は下記のようなバグはもう発生しません。

サンプル

※jQuery 1.3.2で発生する問題※

HTML
<select>
	<option id="foo">&nbsp;</option>
	<option>11</option>
	<option>22</option>
</select>

<tr id="bar">&nbsp;</tr>
Javascript
var optionText = $("#foo").text();

// firefoxは0、IEは1
alert("select optionタグの をtrimした後のlength: " + $.trim(optionText).length);

var trText = $("#bar").text();

// firefoxは0、IEも0!
alert("trタグの をtrimした後のlength: " + $.trim(trText).length);

結果

selectのoptionタグのテキストにある“&nbsp;”

$.trimをかけて見ると

Firefoxはちゃんとtrimしてlengthが0になったが、

IEはtrimできずlengthが1のままです。

しかしtrタグのテキストにある”&nbsp;”をtrimすると

IEも正しくtrimしてlengthが0になるんです。。。

DEMO

jQuery最新版(1.4.2)を使うDEMO

jQuery IDに括弧がついたオブジェクトを取るには

2010年03月03日

こんなHTMLがあるとします。

idに[]が付いてますね。

<input id="foo[0]" type="text" />
<input id="foo[1]" type="text" />
<input id="foo[2]" type="text" />

こういうIDに括弧が付いたモノに対して

普通の#付きのjQueryセレクタでは選択できません。

$("#foo[0]");    // 取れません

属性フィルタ[attribute=value]でとるのが正解です。

$("[id='foo[0]']");

0311更新:

もし具体的なタグがわかってあれば、

それを指定することでパフォーマンスを向上できます。

上記の例で言うと

$("input[id='foo[0]']");

このほうが速いです。

jQuery $.inArray()関数の戻り値に注意を

2010年01月15日

$.inArray(value, array)

指定した値が配列中にあれば、そのインデックスを返します。

配列に存在しなければ戻り値は”-1″になりますので注意してください。


var array = ["a", "b", "c"];

if ($.inArray("d", array) == -1) {

    // d is not in array

}

下記のコードは間違いですよ。。。

if ($.inArray("d", array)) {}

$.isArray(obj)

パラメータで渡された値が配列であるかどうかを判別します。

戻り値はtrueかfalseです。

jQueryで右クリックを無効にする方法

2010年01月07日

jQueryでマウス右クリックを無効にする方法です。

“contextmenu”のイベントはjQueryのドキュメントには乗ってませんが、

それのハンドラでreturn falseすることで簡単に実現できます。


$("document").bind("contextmenu", function(){

    return false;

});

jQuery APIを一枚の紙にまとめたノート。他にもHTML、CSS、JavaScriptノートが満載

2009年12月27日

jQueryのAPIを一枚の紙にまとめたものです。

ノートはPDFファイルで、ダウンロードすることができます。

jQuery APIノート

jQuery-api-note


作者はMattさんです。ありがとうございました。


他にもHTML、CSS、JavaScript、PHP、Mac、Windows、Photoshop、Browserなどのノートが満載です。

HTML, CSS, PHP, Javascript And More Cheat Sheets

興味のある方は直接作者のサイトを参照してください。

Get Adobe Flash playerPlugin by wpburn.com wordpress themes