2010-11-17 7 views
4

Kendi JavaScript bağlama yöntemimi yazıyorum (uygulama için) ve tek bir nesneyi farklı nesnelerle veya birden çok nesneyle ele alma zorunluluğundan vazgeçiyorum Bu yöntemde, sadece birinden büyük bir uzunluğa sahip nesneler arasında döngü yapmam gerektiğinden. (bkz. obj vs obj [aşağıdaki tabloya bakınız]Yeniden hesaplama olmadan bir yöntemde bir ve daha büyük olan nesneler nasıl işlenir

Bu bağlama yöntemini daha az gereksiz hissettirmenin bir yolu var mı? Sen bir dizi içerisine zorlayabilir

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

Kodunuz. – SLaks

+0

Özgün nesneyi, varsa uzun bir nesneyi döndürmek için getElementByClass() yöntemlerini kurmuştum. Bunu düşünmeye başlamak şimdi aptalca bir fikirdi. Bunu yapmak, sizden bahsettiğiniz bu kontrolü yürütmek için gerekli olan ihtiyacı yarattı. – tester

cevap

1

Concat obj: Tek eleman diziler için çalışmaz

obj = [].concat(obj) 
2

(diğer bir kütüphane söz konusu olamaz .. teşekkürler kullanarak varsayalım ediniz): tam kodunuzu anlamadan

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 dakika içinde, oylarımı geri aldığımda ... (Kıstıranın iflas ettiğinden emin olmama rağmen.) – lonesomeday

0

diyorum ki eğer Sadece 1 nesne var, hala bir dizi içinde yer almalı ve böylece tek bir iterasyon meydana gelecektir. Tekil davayla ilgilenmeye gerek yok.

Sen tekil dava için kontrol ve tek girişle bir diziye dönüştürmek olmalıdır: Bunu bir nodeType özelliği olup olmadığını görmek için obj test edebilir

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

Doğru, eğer nesne tekil olsaydı işe yarayabilirdi. bir diziye dönüştürün. Buna göre değiştireceğim. –

1

. Öyleyse, bir Diziye yerleştirin.

if(obj.nodeType) { 
    obj = [ obj ]; 
    //... 
veya boş bir Dizide bir concat yapabilirsiniz. Eğer bir tane yoksa
obj = [].concat(obj); 

Bu

size bir Array verecektir.


Yani nihai kod aşağıdaki gibi görünebilir:

boş bir dizi ile
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; 
       } 
      } 
     } 
    } 
})(); 
İlgili konular