jQuery1.9の変更内容まとめ
Published at 2012-12-19
先日jQuery1.9beta1が公開されたが、ロードマップは変わらないだろうし、変更点をまとめる。
前々から非推奨アナウンスがあったものを削除するなど主に内部APIの整理で、ファイルサイズの削減とパフォーマンスが向上される予定。2.0は古いIE等のサポートを止め、再設計・軽量化なので1.9とAPIは変わらないそう。
最近のjQueryはフルコメントで10000行くらいあったが、2.0でどのくらいになるのか。超軽くなったりしないかな。恐らくないな。
↑のUpgrade Guideを読み流してみる。
.add()
内部処理の仕方を変更。
.addBack(selector)
が.addSelf()
に
一応エイリアスとして残るみたい。
.after()
と.before()
と.replaceWith()
親を持たないノードの変更はバグを生む可能性があるので、内包する対象ノードが 親を持たない場合はこれらを使っても何もしない 。
.appendTo()
と.insertBefore()
と.insertAfter()
と.replaceAll()
要素の追加や削除系の関数ですが、1.9以降は.end()
をしなくても、要素が追加や削除された状態のjQueryオブジェクトを返す そう。
checkboxのクリック時イベントのハンドラ中の状態
未チェックのチェックボックスをクリックするとクリックイベントが発火されるけど、クリックイベント中でのチェックボックスの状態が、v1.8以前は未チェックだったことに対しv1.9からはチェックされた状態でコールバックされるようになった。
ユーザーアクションと反対の状態で取得出来る っぽい。我ながらわかり難い日本語。
focusイベント
ネイティブのfocusイベントは、DOMがフォーカスされてから初めてイベントが発火されるけどv1.9は、DOMがフォーカスされなくてもfocusイベントの実施を最後まで行う。focus()
あるいはtrigger("focus")
で、内包する要素に対しfocusを発火するが、focusイベントがハンドルされない要素があっても、全ての要素に発火をする、ということになりる。
$(htmlString)
と$(selectorString)
引数にhtmlタグが含まれていたらhtmlStringとして扱う。 タグ形式であってもhtmlタグではない場合は認識されず、$.parseHTML()
を通すことで初めてDOMノードが生成される。
プラグインは用意されるっぽいが、有効なCSSセレクタでも今までのようには動かないようで、移行の際は注意。なるべく#id
と.className
で走査しろということなんだろうか。
.data()
メソッドからイベントは発火されない
set/getで監視しないようになった。また、.data("abc.def")
はabc.defの値のみ取得し、abcからは取得しないとのこと。
jQueryの独立したノードの順序
うーん、これはいいか。
要素中にscriptがある場合実行するようになった
HTML文字列を扱うメソッド(.append()
とか.wrap()
とか)にscriptがある場合は 1.9以降はscriptを実行する ようになり、再実行されるのを防ぐため、そのscriptのノードは除かれるらしい。ほほう。
scriptは同期的に評価されるため実行に時間がかかり、また、scriptの挙動に対してアクセスするインターフェースは用意しませんとのこと。 「scriptの実行のためにこの挙動を利用するな!」 、新しいscriptをロードするときにはjQuery.getScript()
を使ってくれとのこと。
.attr()
と.prop()
.prop()
はプロパティの値の取得と設定のために1.6から用意されて、.attr()
は値の設定には使わないようにされてきた。1.9においては特別なケースの.attr()
の使用をサポートするそう。例えばチェックボックスの値の設定時の挙動。
古代IEにおける$("input").attr("type", newValue)
1.9においてもIE6/7/8だと例外が発生するものの、許容するブラウザのために残し、使える場合はどうぞ使ってくださいとのこと。個人的にはこんなイレギュラーなことしないけど。
擬似イベントhover
mouseenter
+ mouseleave
と同義なのでサポートしない。
jQueryオブジェクトの.selector
プロパティ
元々非推奨のプロパティだが、v1.9からはメソッドチェーンの場合などにこのプロパティの整合性を保つことをしない。まぁ、これもあまり使わない。
jQuery.attr()
明示されていなかったjQuery.attr(elem, name, value, pass)
をサポートしなくなる。よって、今後はpassを引数として使うことが出来ない。
jQuery.ajax()
のJSON結果が空文字の場合
jQuery.ajax
が、JSONの結果が空文字の場合を考慮するようになった。v1.9以降、空文字の場合は不正な形式とし、例外をスローする。ただしnull
の場合を除く。
jQuery.proxy()
のcontext
コールバック中のthisがproxy()によって適切に割当たるようになった。コールバックの呼び出し元がnull
かundefined
の場合、this
はwindow
になるっぽい。
.jQuery.sub()
が削除される
Coreから外され、プラグインに移動。
.data("events")
jQueryの明示されていない内部的なイベントデータを取得する。一般的に使わないため公開インターフェースを用意していないため、だそう。たぶん、あまり気にしなくても良い。
明示されていない引数をもつメソッド
jQuery.data()
jQuery.removeData()
jQuery.attr()
少し前述したが、予想しない挙動を引き起こす引数の受け方をしなくなるそう。
削除されるプロパティとかメソッド
jQuery.deletedIds
jQuery.uuid
jQuery.attrFn
jQuery.offset.bodyOffset()