リリース2010年1月14日に、jQuery1.4がリリースされました。昨年のjQuery1.3のリリース以来、ちょうど1年ぶりのメジャーバージョンアップです。速度の劇的向上jQueryの売りである速度がさらにブラッシュアップされました。画像はこちらsetter関数がより簡単に今までも.attr()を使って、コールバック関数の戻り値をDOMの属性にセットすることができましたが、この機能が全てのsetter関数に拡張されました。.toggleClass())さらにこれらのうちいくつかのメソッドでは第二引数に現在の値を渡すことができます。(別ウィンドウが開きます)";});Ajax配列のserializationjQuery1.4からjQuery.param()において引数に配列(入れ子構造のパラメータ)が使えるようになりました。{foo:["bar","baz"]}はserializeの結果、"foo[]=bar&foo[]=baz"と出力されます。serializeされると"foo=bar&foo=baz"と出力されていました。この古いバージョンの挙動の方がいいという場合は下記の方法で設定が選べます。typeで返ってきた場合、特に指定がなければdataTypeはデフォルトで"json"に設定されます。場合は、同じくデフォルトのdataTypeは"script"となります。これによりスクリプトが自動実行されます。Etagサポート始めましたデフォルトではjQueryはブラウザのキャッシュを使わず都度リクエストを行なうように、Last-Modifiedヘッダを無視します。ifModifiedをtrueに指定すると、ブラウザのキャッシュを利用します。jQuery1.4からはさらにifModifiedを指定した場合、If-None-Matchヘッダも送信します。JSON形式への変換が厳密にjQuery1.3以前のバージョンでは受け取ったJSON形式のデータをevalで評価していました。jQuery1.4からは可能であればnativeのJSONパーサを利用します。引数として受け取ったJSON形式のデータもチェックします。"bar"}という誤ったフォーマットのデータはjQuery.getJSONでは受け取れません。RequestでdataTypeを"json"と指定した場合も同様です。新しいHTML標準であるHTML5のinput要素(datetimeやrangeなど)もserialize()されます。Ajax通信の書き方Ajax通信は以下のように行ないます。コールバック関数をこのように書くことでコードを短縮し、場合によってはクロージャや他のオブジェクトを使わずに済みます。}});Success時のコールバック関数が第三引数にXHRを受け取るようにsuccess時のコールバック関数が第三引数にXMLHttpRequestオブジェクトを受け取るようになりました。以前のバージョンだとこのXMLHttpRequestオブジェクトは$.ajaxの戻り値としてしかアクセスできませんでした。content-typeは正確にjQuery1.3では、送信データが空だった場合contentTypeオプションは無視されます。jQuery1.4では、contentTypeは毎回送られます。この変更はレスポンスの種類を決めるバックエンド処理に多少影響します。XHRクロスドメインのAjax通信をサポートしているブラウザであっても今後はデフォルトでクロスドメイン通信は禁止されます。タイマーではなくonreadystatechangeイベントをAjax通信の際には、タイマーを使って順次問合せを自前で実装するよりもonreadystatechangeイベントを使った方が簡単です。Attributes.css()と.attr()が速くなりました画像はこちら.attr()が引数にsetter関数を使えるようにattr()で関数を使えるだけでなく、その関数に現在の属性の値も渡すことができるようになりました。});});</li>.text()がテキストだけでなくCDATAセクションでも使えるようになりましたCore要素を素早く生成jQueryで要素を生成すると同時に、オブジェクトに渡すことでその要素にAttributeやEventを追加することができます。.get(-N).get()と.eq()にマイナスの数を指定できるようになりました。最後から2つめのdivを取得したい場合は以下のように書きます。Ver.1.3まで戻り値の型は配列でした。今後の混乱を避けるために配列を返すための関数として.toArray()を追加しました。.get()と違い、.toArray()は引数を取りません。jQuery()が空のセットを返すようになりますVer.1.3ではjQuery()の戻り値はdocumentのみを含むjQueryのsetでしたが、Ver.1.4からは空のjQueryのsetに変更になりました。これは戻り値で動的に要素を生成する際に便利です。注意:jQuery().ready()を使ったテクニックはVer.1.4でも動作しますが、非推奨です。jQuery(document).ready()もしくはjQuery(function(){})を使ってください。jQuery("タグ名")1つしか存在しないタグ名でセレクトすると高速です。jQuery("<div></div>")この3つのやり方は内部ではどれも同じコードパスを経由します。(document.createElementを利用)jQuery("<div></div>")と書いた場合の速度を改善しました。属性を指定した場合、jQuery内部では利用ブラウザのネイティブのパーサを使うことに注意してください。.hasClass()の速度が約3倍向上しました。active");Datadata()はgetter関数に、.data(Object)はsetter関数に要素に結びついたデータをそっくりそのまま(完全な形で)使いたいケースはよくあるのではないでしょうか?よくある例である要素のクローンを作る際にその要素の全てのデータをコピーしたいというケースがあります。.data(Object)というように引数にオブジェクトを渡すとその内容をセットします。このオブジェクトには要素にバインドされたイベントも含まれるので使う際には注意してください。必要な時にだけ生成jQueryは特定の要素に対して.data()で情報を取得する際に、独自の拡張を行なっています。今回のVer.アップで、検索されたデータが見つからなかった場合、この拡張をしないように修正しました。これによりパフォーマンスの向上とDOMの汚染防止が期待できます。animationが指定できるようになりました。Padolseyがこのエントリーで詳しく述べています。jQuery.proxy()あるスコープの内部に限り"this"が示す値を固定したいという場合は、jQuery.proxy()を使うことができます。);Eventの複数指定オブジェクトを引数に渡すことで1つの要素に複数のEventを一括バインドできるようになりました。events共に、ブラウザにより挙動が異なっていました。Explorer上での通常のchangeイベントとsubmitイベントの挙動を他のブラウザと統一しました。'focusin'と'focusout'focusinとfocusoutはfocus、blurとほぼ同義ですが、bubbling処理が行なわれるケースに関しては違います。focusとblurはlive()では設定できないことに注意してください。ントがliveイベントで使えるようになりました。.live()で実行される下記イベントのクロスブラウザサポートも実装したことを報告します。mouseleave)前述の通り、focusとblurはバブリング処理に対応していないので、focusイベントを利用する場合は、focus/blurではなくfocusin/focusoutを使ってください。bind()と同様にlive()も引数にDataオブジェクトを受け取れるようになりました。live()とdie()でコンテキストを指定可にlive()イベントにバインドするセレクターのコンテキストを指定できるようになりました。この場合、そのコンテキスト内の要素のみにイベントが登録されます。live()イベントを生成するタイミングで必ずしもその要素が存在する必要はありませんが、そのコンテキストは存在していなければいけません。readyイベントにbodyの存在は必須jQueryはbody要素の存在をチェックし、もしない場合はbody要素を生成します。メモリリーク用の処理を必要としないIE以外のブラウザではUnload()の速度が向上しました。ManipulationDOM要素の操作メソッドの速度が大幅に向上しました。.append()、.prepend()、.before()、そして.after()が早くなりました画像はこちら.html()が約3倍速くなりました画像はこちら.remove()とempty()が約4倍速くなりました画像はこちら新メソッド:detach()detach()は関連するイベントハンドラはそのままに、DOMから要素のみを削除するメソッドです。要素を一時的に削除した後、再び生成する際に便利です。その親要素と置換します。stevie内部関数でキャッシュを保持jQuery("<div>")や.after("<div>")などのメソッドで生成された要素はjQuery内部でキャッシュとして保持するようにしました。これにより文字列を引数として使うDOM操作系の関数のパフォーマンスがかなり向上しました。before()、after()、replaceWith()をDOMにない要素にも適用可これらのメソッドをDOMに紐付けられていない要素にも使えるようになりました。これでさらに複雑なDOM操作が可能になり、DOM操作が行なわれている間の描画の再計算も回避できるようになりました。要素だけでなくイベントもコピーしていましたが、データまではコピーしませんでした。jQuery1.4では、イベントに加えデータもコピーします。jQuery.extendと同じ文法で用い、今までは使えなかったプレーンなogjectや空の配列のコピーが作れます。Offset.offset()要素に対してオフセットを設定できるようになりました。他のセッター関数と同様に、第2引数として関数を受け取ることができます。Queueingキューは全体的に見直され、デフォルトのfxキュー以外のキューを利用できるように改善されました。(訳注:キューには名前をつけていくつかのキューを並行して管理できるらしい。デフォルトのキューはfx。)新しい.delay()メソッド.delay()メソッドはキューに入っている要素の実行を指定したミリ秒ほど遅らせます。第2引数なしで呼び出した場合は、fxのキューを利用します。オプションで第2引数を指定して別のキューに入れることができます。nextjQuery1.4ではキューで実行される関数の第1引数として、次に実行される関数が渡されます。その引数の関数を呼び出すと自動的にキューを一つ進めます。dequeue()しなくてもキューが進行する。$(this).fadeIn();});.clearQueue()キューは消去できるようになりました。このメソッドは未実行の関数を全てキューから消去しますが、実行中の関数を停止することはありません。引数なしで呼び出した場合、fxのキューを消去します。p"と指定した方が速いID指定で始まるセレクタは瞬時にDOMを選択できるよう最適化されており、そのように指定したセレクタは常に最速です。.index(String).index()メソッドは書き直され、より直感的で柔軟になりました。1.4ではある要素の兄弟要素の中でのインデックス(番号)を取得できるようになりました。$("li.current").index()index()メソッドの引数にセレクタを渡すことで、そのセレクタにマッチする要素の中での番号を取得できます。elements:$("#more-info").index("h3")</h3>新しい.has()メソッドこのメソッドはセレクタ書式での:has()フィルタをメソッド化したものです。あるjQueryセットのうち、指定したセレクタにマッチするものだけを返します。.parents()と似た動作をします。違いは、引数で受け取ったセレクタにマッチしたところで取得をストップするところです。.add(String,Element).add()メソッドにコンテキストを指定できるようになりました。このことは、(例えばajaxリクエストで返ってきた)追加の要素を他の要素セットに加えて、一緒に操作したいときに便利です。DOMElement)closest()メソッドが第2引数としてDOM要素を受け取り、コンテキストを指定できるようになりました。コンテキストを指定することでより速く実行することができます。この方法は、内部的にclosest()を利用しているlive()メソッドにおいても同様です。UtilitiesjQuery.isEmptyObject()このメソッドは引数のオブジェクトが何もプロパティを持っていなければtrueを返します。jQuery.isEmptyObject()に渡せるのはオブジェクトだけです。文で)イテレーションできるかどうかを試み、それ以外はチェックしていないからです。jQuery.isPlainObject()jQuery.isPlainObject()は引数のオブジェクトが、オブジェクトリテラルであればtrueを返し、それ以外のオブジェクト(訳注:コンストラクタ関数で生成したオブジェクトや、組み込みオブジェクト)やプリミティブ値であればfalseを返します。jQuery.contains()jQuery.contains()は2つの引数がどちらもDOM要素で、かつ、第2引数の要素が第1引数の要素に内包されている場合にtrueを返します。jQuery.noopjQuery.noopは空の関数です。関数が必要とされる箇所で利用されています。(訳注:空の関数が必要な箇所で毎回関数生成するのではなく、jQuery.noopを参照することでパフォーマンスアップしているのでしょう。)jQuery.unique()jQuery1.4ではjQuery.unique()メソッド(jQuery内部で、jQuery要素の集合を生成するのに使用されています)は、結果を常にdocumentでの出現順に並び替えて返します。このことはつまり、あらゆるjQuery関数により返される結果セットはdocumentでの出現順に並んで返されるということになります。「Webkit」かどうかをテストできるようになりました。(訳注:Safariかどうかではなく、Webkitかどうかのテストができる。)アプレットのサポートが改善されましたJavaアプレットに対してイベントやデータの束縛を試みなくなりました。coreでの全てのarguments.callee使用可所を削除しました。Compilerを使用するようになりました内部的なコード再編1.4で実施した大きなアピール点の一つは、より読みやすく、理解しやすいコードベースを築いた点です。我々が成し遂げたコードベースの大きな改編は内部的ですが、スタイルガイドラインを確立しはじめました。‘queue.js’に分割されました。readyイベントはcore.jsに移動されました。Guidelinesに則っています。cssとattributesに対するロジックは分割され、相互に入り組むことはなくなりました。テストjQuery1.4では207個のバグが修正されました(1.3をリリースした時は97個でした)。加えて、テストの範囲も、1.3.2では1504件のテストケースでしたが、1.4では3060件のテストを実施しました。jQueryのテストスイートはメジャーなブラウザで100%合格しています。Chrome)後方互換性のない変更点jQuery1.4ではバージョンアップによる大きなコンフリクトが極力起きないように試みました。パブリックな関数については型を変えないように調整しました。念の為、下記の一覧を読んであなたのアプリケーションに問題がないかどうか注意してください。単純にDOMの選択結果を結合していましたが、1.4では、結果を(訳注:重複がないように)マージし、documentにおける出現順にソートするようになりました。DOMに付随しているイベントだけ一緒に複製していましたが、1.4ではイベントとデータも複製するようになりました。value)によりDOM要素に対して保存したデータのこと)jQuery.data(elem)はidを返していましたが、DOM要素のオブジェクトキャッシュを返すようになりました。jQuery()(引数なし)はjQuery(document)と同じ解釈をされなくなりました。option要素またはcheckbox要素に対する.val("...")の動作が曖昧ではなくなりました。(name属性またはvalue属性を見て選択していましたが、常にvalue属性のみを見て選択するようになりました。)jQuery.browser.versionがレンダリングエンジンのバージョンを返すようになりました。受け取るJSONの書式に対して厳格になり、適格でないJSONを受け取った場合に例外を投げるようになりました。JavaScriptのリテラル文字列としては妥当であるが、JSON書式としては適格でないJSONを評価する必要がある場合は、文字列としてリクエストし、その後eval()を用いて評価することができます。リクエストパラメータの文字列化方法がデフォルトでPHPやRailsの動作と同じになりました。(訳注:nameが同じパラメータを[]によって配列としてリクエストできることでしょうか。すれば以前と同じ動作で文字列化できます。(訳注:以後全てのAJAXリクエストに対して有効。オプションを渡すことで、リクエストごとに動作を選択できます。...)が、プレーンなオブジェクトでないものや配列に対して動作しなくなりました。Ajaxリクエストにおいて、dataTypeオプションを指定せずに実行し、またレスポンスがtext/javascriptだった場合、そのコードは実行されます。以前のバージョンではdataTypeの指定は必須でした。AjaxリクエストのifModifiedオプションを設定するとETagが考慮されるようになりました。過去のバージョンと衝突を起こす可能性のある変更点の全てを後方互換できるようにするプラグインも用意しました。1.4を導入し、もし問題が起こった場合はそのプラグインをぜひダウンロードし、使用してみてください。Apartments。