jQuery 1.2.6が公開されから2ヶ月ほどたちましたが、使っていていくつか気になった部分があるのでメモとして残しておきます。
原因とか対策とかご存じの方、教えてください。
jQuery.makeArray
1129-1143行目
makeArray: function( array ) {
var ret = [];
if( array != null ){
var i = array.length;
//the window, strings and functions also have 'length'
if( i == null || array.split || array.setInterval || array.call )
ret[0] = array;
else
while( i )
ret[--i] = array[i];
}
return ret;
},
Arrayオブジェクトかどうかを判定するために、lengthプロパティの有無を調べているのですが、windowオブジェクトや、String、Functionにもlengthプロパティがあるということで、それぞれを判定しています。
その中で、「array.call」での判定が失敗することがあり、twitterでつぶやいてみると、
@noriaki なんか古いscriptaculousのeffect.jsだとArray.prototype.callを定義してるんだけど、関係無さげ?http://tinyurl.com/6de2mj
@noriaki なんか古いscriptaculousのeffect.jsだとArray.prototype.callを定義してるんだけど、関係無さげ?http://tinyurl.com/6de2mj
という話が出てきて、まさしくその通りでした。
というわけで、以下のように暫定的に対応したものを独自に使ってます。
--- jquery-1.2.6.org.js Sat Aug 09 15:40:15 2008
+++ jquery-1.2.6.js Sat Aug 09 15:39:57 2008
@@ -1132,7 +1132,7 @@
if( array != null ){
var i = array.length;
//the window, strings and functions also have 'length'
- if( i == null || array.split || array.setInterval || array.call )
+ if( i == null || array.split || array.setInterval || array.apply )
ret[0] = array;
else
while( i )
一応、他のところへの影響はなさそうですが、ご利用になる際は十分注意してください。
ってか、よく考えたらjQuery.isFunction(array)使ったらいいんじゃないのかな!(笑)
jQuery.map
よくつかう$.mapにも気になるコードがあります。
1205-1218行目
map: function( elems, callback ) {
var ret = [];
// Go through the array, translating each of the items to their
// new value (or values).
for ( var i = 0, length = elems.length; i < length; i++ ) {
var value = callback( elems[ i ], i );
if ( value != null )
ret[ ret.length ] = value;
}
return ret.concat.apply( [], ret );
}
この最後にある、return ret.concat.apply( [], ret );はなにを意図してこうなっているんでしょうか。新しい配列にmapした結果の配列を連結して返しています。
でも、以下のコードを実行した場合、期待しているものとは違った結果が返ってきてしまいます。
$.map([1,2,3], function(value, index) {
return [index, value];
}); //=> [1,1,2,2,3,3]
// [[1,1],[2,2],[3,3]]を期待していた
さてさて、どうしたものでしょうか。
単純に、return val;とかにしちゃっていいのかな・・
追記(2008-08-17T14:30:00+09:00):上記のように変更してみたところ、通常の$('p.myclass')といったセレクタ処理がうまくいかなくなってしまいました・・