違い
<div id="hoge" data-hogehoge="foobar" />
jquery1.11未満
console.log('存在するid、存在するdata属性');
console.log($('#hoge').data('hogehoge')); // "foobar"
console.log('存在するid、存在しないdata属性'); //undefined
console.log($('#hoge').data('hoge'));
console.log('存在しないid');
console.log($('#hogehoge').data('hogehoge')); //null
jquery1.11以降
console.log('存在するid、存在するdata属性');
console.log($('#hoge').data('hogehoge')); // "foobar"
console.log('存在するid、存在しないdata属性'); //undefined
console.log($('#hoge').data('hoge'));
console.log('存在しないid');
console.log($('#hogehoge').data('hogehoge')); //undefined
これにより発生する問題
$.ajax()使用時
- 送信するパラメータは
ajaxSetup()
の中でajaxExtend()
されて実際のパラメータとして使用される。 - ajaxExtend中で
undefinedのパラメータは無視される
。 - 1.11未満は
null
だったので、無視されずパラメータ的には空文字として送信されるが、1.11以降はundefined
なので、無視されてしまいパラメータとして送信されない。
その結果
-
param = {selected_value: $(xxx :selected).data(yyy)};
みたいなコードが書かれていたので、項目が選択されていない時に値が飛んでこず、バリデート処理が入っていなかったのでエラーで落ちた。 - どう見てもサーバー側処理のせいによるバグです、本当にありがとうございました。
おまけ
どうやら1.8.3の頃は存在しない要素に対して.data()した場合にはundefinedが返ってきていたのに、1.9になってnullを返すようになり、1.10でもそのままで、1.11で再びundefinedに戻ったようですね。