2010-11-17 16 views
4

私は独自のJavaScriptバインドメソッドを(練習用に)作成していますが、単一のオブジェクトと複数のオブジェクトを別々に扱う必要があります。この方法では、1より大きい長さのオブジェクトをループする必要があるためです。 (下記のobj対obj [i]を参照してください)冗長性のないメソッドで長さが1以上のオブジェクトを処理する方法

私はこのバインド方法を冗長性の少ない感じにする方法はありますか?(仮定してください別のライブラリを使用すると、問題外です。..感謝)

var foo = (function() { 
    return { 
     bind: function (obj, type, handler, delegate) { 
      var delegate = delegate || false, 
       len = obj.length; 
      if (typeof obj == 'undefined') { 
       return false; 
      } 
      if (len > 1) { 
       for (var i = 0; i < len; i++) { 
        if (obj.addEventListener) { 
         obj[i].addEventListener(type, handler, delegate); // false: bubble (^). true: capture (v). 
        } else if (obj.attachEvent) { 
         obj[i].attachEvent('on' + type, handler); 
        } else { 
         obj[i]['on' + type] = handler; 
        } 
       } 
      } else { 
       if (obj.addEventListener) { 
        obj.addEventListener(type, handler, delegate); // false: bubble (^). true: capture (v). 
       } else if (obj.attachEvent) { 
        obj.attachEvent('on' + type, handler); 
       } else { 
        obj['on' + type] = handler; 
       } 
      } 
     } 
    } 
})(); 
+0

あなたのコードは、単一要素の配列では動作しません。 – SLaks

+0

私は元々getElementByClass()メソッドを設定していました。長さが1であれば、実際のオブジェクトを返します。これは今、ばかげたアイデアだと考えるようになりました。それは基本的に、あなたが話しているこの小切手を実行する必要性を作り出しました。 – tester

答えて

1

連結方式のOBJ空の配列で:

obj = [].concat(obj) 
2

あなたは配列にそれを強制することができます:あなたの場合は、完全にあなたのコードを理解せずに

if (!('length' in obj)) 
    obj = [ obj ]; 

for (var i = 0; i < obj.length; i++) { 
    if (obj[i].addEventListener) { 
     obj[i].addEventListener(type, handler, delegate); // false: bubble (^). true: capture (v). 
    } else if (obj[i].attachEvent) { 
     obj[i].attachEvent('on' + type, handler); 
    } else { 
     obj[i]['on' + type] = handler; 
    } 
} 
+0

+1を20分後に返すと、私は投票を取り戻すことができます。(if文で中括弧を省略しても嫌いですが) – lonesomeday

0

、私がいることを言うだろう1つのオブジェクトだけが配列内に含まれている必要があり、したがって1つの繰り返しが発生します。特異なケースに対応する必要はありません。

あなたは特異なケースをチェックして、単一のエントリを配列に変換する必要があります

if (obj.constructor.toString().indexOf("Array") == -1) { 
    obj = [obj]; 
} 
+0

そう、オブジェクトが単数形であれば、それを配列に変換します。それに応じて修正します。 –

1

あなたはそれがnodeType性質を持っているかどうかを確認するためにobjをテストすることができます。その場合は、Arrayに配置します。

if(obj.nodeType) { 
    obj = [ obj ]; 
    //... 

また、空の配列で連結を行うこともできます。

obj = [].concat(obj); 

これはあなたには配列がありません。


だからあなたの最終的なコードは次のようになります。

var foo = (function() { 
    return { 
     bind: function (obj, type, handler, delegate) { 
      var delegate = delegate || false 
      if (typeof obj == 'undefined') { 
       return false; 
      } 
      obj = [].concat(obj); 
      for (var i = 0, len = obj.length; i < len; i++) { 
       if (obj[i].addEventListener) { 
        obj[i].addEventListener(type, handler, delegate); // false: bubble (^). true: capture (v). 
       } else if (obj.attachEvent) { 
        obj[i].attachEvent('on' + type, handler); 
       } else { 
        obj[i]['on' + type] = handler; 
       } 
      } 
     } 
    } 
})();