jQuery-1.2.6の気になるコード

| コメント(0) | トラックバック(1) | jQuery-1.2.6の気になるコード | この記事をはてなブックマークに登録 このエントリのはてなブックマーク数

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')といったセレクタ処理がうまくいかなくなってしまいました・・

トラックバック(1)

トラックバックURL: http://blog.fulltext-search.biz/mt/mt-tb.cgi/49

昔、jQueryを利用したブックマークレットを作ってて、 [Exception... ”Component returned failure code:... 続きを読む

コメントする

カテゴリ

  • サービス

あわせてなかのひとのはてな

あわせて読みたい
この日記のはてなブックマーク数
OpenID対応しています OpenIDについて

このブログ記事について

このページは、noriakiが2008年8月 9日 14:40に書いたブログ記事です。

ひとつ前のブログ記事は「Heat the Nicovideo Up 0.3.8 公開しました(bug fix)」です。

次のブログ記事は「Greasemonkeyスクリプトに自動更新機能をお手軽に付ける」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。