jQuery 1.12.0-4 と 2.2.0-4 での変更箇所の自分なりのまとめ
jQuery 1.12.0(2.2.0), 1.12.1(2.2.1), 1.12.2(2.2.2), 1.12.3(2.2.3), 1.12.4(2.2.4) の リリースノートを読んで、今さらですが歯抜けがあると気持ち悪いので 自分なりにまとめました。
といっても、機能追加は 1.12.0(2.2.0) のみであり、 1.12.1(2.2.1) から 1.12.4(2.2.4) はリグレッションの修正がメインです。 箇条書きを含めた簡単なまとめになります。
誤訳による間違いなどもあると思われますので、 読まれる際はご注意を。
jQuery 1.12.0(2.2.0)
沢山のバグ修正と改良が施されているそうです。1.x系と2.x系の最後のリリースに するつもりで、jQuery 3.0 のリリース以降もサポートするつもりだが、 重大なリグレッションの修正パッチのみになるだろうとのことです。
セレクタエンジンの性能向上
ネイティブのquerySelectorAll
やmatchesSelector
で処理できないセレクタは、
2回目以降、事前コンパイルした Sizzle の selector を
すぐに使用するようにしたそうです。
そのセレクタがquerySelectorAll
やmatchesSelector
で処理できないと
判るまでに時間がかかり、この判別処理を飛ばすことで
セレクタエンジンの性能が向上しスピードアップしたそうです。
新機能
細かいが、破壊的でなく有用と思われる機能をいくつか導入したそうです。 大体、jQuery 3.0 upgrade guide(和訳)で 3.0 の新機能としても 言及されています。
SVG の class 操作
※3.0 upgrade guide で 3 の機能として言及
SVG 上で.addClass()
,.removeClass()
,.toggleClass()
,.hasClass()
が
実行可能だそうです(※他の大半は SVG 上で動かないということに注意)。
jQuery は今では className プロパティではなく class 属性を変更していて、
このため一般的な XML ドキュメントでも class メソッド群が使用できるそうです。
これ以上の操作を望むなら SVG 用のライブラリを使用してほしいとのこと。
jQuery.post(options)
とjQuery.get(options)
※3.0 upgrade guide で 3 の機能として言及
この2つのメソッドにオプションオブジェクトを渡す用法が導入されました。
jQuery.post({
url: “/example”
});
Symbol/iterator のサポート
※3.0 upgrade guide で 3 の機能として for...of に言及
ES6/ES2015 で追加された
Symbol 型と Symbol.iterator を使ったイテレータ
をサポートしたそうです。
Symbol はjQuery.type
で検出可能で、
for...of をサポートする環境下なら
jQuery オブジェクトを for...of で走査できるようになったそうです。
for (element of $elements) {
console.log(element);
}
jQuery.htmlPrefilter()
.html()
,.append()
,replaceWith()
のような DOM 操作メソッドに渡す
HTML ソースはフィルタリングされますが、
そのフィルタリングに干渉できるようになりました。
デフォルトの prefilter は単一タグを XHTML 互換のタグに変換します
(例:<hoge/>
→<hoge></hoge>
)。
このメソッドはユーザがある極端なケース、
例えば<script type='text/javascript'> alert('<What?/>'); </script>
のような
HTML ソースを上のメソッド群に読み込ませたい
(http://github.com/jquery/jquery/issues/2668)
といった場合に
上のデフォルトの振る舞いを変更して自前で
ソースをサニタイズできるようになるそうです。
jQuery.uniqueSort
のエイリアス
※3.0 upgrade guide で 3 の機能として言及
jQuery.unique()
がソートすることをはっきり示すため、
メソッド名を新しくしたそうです。
jQuery.unique
はまだ存在しますが、jQuery.uniqueSort
が
公式に正しいメソッド名になります。
このメソッドのソートは DOM 要素をドキュメントオーダーに 並べるという意味で名前にソートが付きます。 一般的なソートを行うメソッドという意味ではありません。
jQuery 1.12.1(2.2.1)
- 共通
.position()
の振る舞い修正で問題が発生したので元に 戻して、これにより IE での jQuery UI のツールチップの位置に 影響が出るそうです。.on()
へのハンドラが指定されていなくても メソッドチェーンが途切れないようになりました$.parseHTML
で取得した要素の style の読み取りができない問題の修正
- 2.x 系
- table に要素を追加する時、無いなら tbody を入れるようにしていた (古いIE用)処理を 2.2.0 で止めたところ、問題が 発生したので差し戻したそうです
- Opera12 での不具合の修正
- 1.x 系
- dom の ready の判定で 2.x系との整合性をとる作業を行ったそうです
jQuery 1.12.2(2.2.2)
- 共通
- IE 11 で
.prop()
を使って option 要素のプロパティ selected を 設定する時の IE のバグの修正 parseHTML()
等でdocument.implementation.createHTMLDocument("")
の 使用を取りやめたそうです (a 要素の href の値が現在の document に従って 解決されなくなってしまうため)。jQuery.isPlainObject
の診断の修正- option での
.val()
の空白に関する処理のバグを修正
- IE 11 で
- 2.x 系
jQuery.isPlainObject
の修正
jQuery 1.12.3(2.2.3)
- 共通
.load()
のコールバックのコンテキスト(this)が、ドキュメントに書かれた DOM 要素でなく jQuery オブジェクトになってしまっていたのを修正
1.x 系
2.2 でセキュリティ上の問題を修正するコミットの 差し戻しが、1.x 系ではまだだったので差し戻されました。 このセキュリティ上の問題 (https://github.com/jquery/jquery/issues/2432) を修正するには破壊的な挙動変更を 行うため、1.x(2.x)系では修正せず、3系でのみ修正するつもりが、 間違って1.x(2.x)系にも取り入れてしまったためだそうです (3.0 更新ガイドにこの破壊的な変更について書いてあります)。
そのため、1.12.3(2.2.0)以降でも、異なるドメインに
jQuery.ajax()
等で dataType を指定せずにアクセスする時はセキュリティ上の問題が残っています。 この問題を修正するには、jQuery 3.x に更新するか、または jQuery を 読み込んだ直後に以下のパッチを実行します。// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) // 明確に dataType を指定してない時のスクリプトの自動実行を防ぐ jQuery.ajaxPrefilter( function( s ) { if ( s.crossDomain ) { s.contents.script = false; } } );
jQuery 1.12.4(2.2.4)
- 共通
- IE11 で、iframe 内の要素がフルスクリーンモードに置かれると 100倍小さくなるバグがあって、100倍することでこれを修正していたが、 思いがけずそのバグが修正され、バグが存在するIEなのか修正されたIEなのか 特定できないのでバグ修正を行わないことにしたそうです。
- webpack のビルドに失敗する問題の修正
- jquery.slim.js のヘッダコメントに違うバージョンが書かれている問題の修正
- 2.x 系
- firefox で、イベントハンドラが
false
を返すとフォーカスがはずれてしまう 問題の修正
- firefox で、イベントハンドラが
- 1.x 系
- IE で、DOM ツリーに接続されてない要素がセレクタ
:visible
で 表示と判断されてしまう問題の修正 - jQuery の機能特定(reliableHiddenOffsets)が CSS の影響を受けて うまくいかなかった問題の修正
- IE で、DOM ツリーに接続されてない要素がセレクタ