2012-03-28 12 views
5

mam obiektu w następujący sposób:JavaScript .length nieprawidłowe w IE

var dataSources = [ 
     { 
      Stage: [2, 3, 4], 
      Name: "GetAustralianStateList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetGenderList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetTitleList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetCountryList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetRegionList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetNonEnglishLanguageList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetContactRelationshipList" 
     }, 
     { 
      Stage: [3, 4], 
      Name: "GetCompanyCodeList" 
     }, 
     { 
      Stage: [3, 4], 
      Name: "GetBusinessContractList" 
     }, 
     { 
      Stage: [3, 4], 
      Name: "GetPayrollAreaList" 
     }, 
     { 
      Stage: [3, 4], 
      Name: "GetAdministrationAreaList" 
     }, 
     { 
      Stage: [3, 4], 
      Name: "GetWorkContractList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetFirstLanguageList" 
     }, 
    ]; 

Kiedy zadzwonić dataSources.length w Chrome zwraca poprawną liczbę elementów obiektu. Jednak Internet Explorer zwraca długość 14-1 razy więcej niż jest w rzeczywistości.

Wszelkie pomysły?

Odpowiedz

6

Niestety odkryliśmy jeden z niewielu błędów w implementacji ECMAScript: IE traktuje pojedynczą tylną przecinek w tablicy dosłownym jako wyrzutnia, tak że zwiększa się długość kolejno:

var a = [0,1,]; 

alert(a.length); // 3 in IE 
        // 2 in other browsers 

a.hasOwnProperty('2'); // false in all browsers 

powyższe ukazuje, że IE traktuje przecinek jako elizji: długość został zwiększony o jeden, ale nie ma elementu macierzy o indeksie 2

8

Po ostatnim obiekcie zobacz ,?

IE widzi element elektywny z tego powodu.

+0

Doh. Szkolny chłopiec błąd! Dzięki – Darbio

1

Należy usunąć ostatnią „,”, na przykład:

{ 
     Stage: [2, 3, 4], 
     Name: "GetFirstLanguageList" 
    } 
]; 
1

Może się to również zdarzyć podczas tworzenia tablic z "push". Mam uderzył go z kodem tak:

var Entries = new Array; 
...some loop that adds entries... 
Entries.push(createEntry(values)); 

Funkcja createEntry zrobi jakąś weryfikację tablicy „wartości”, a jeśli to nie powiodła się weryfikacja, czy po prostu nie zwraca wartości. Niezdefiniowana wartość zostanie następnie przekazana do tablicy Entries. Jeśli ten niezdefiniowany wpis byłby "ostatnią" wartością, to zawodziłby w I.E. przeglądarki. Aby to naprawić, użyłem:

var Entries = new Array; 
...loop to add entries... 
var Entry = createEntry(values); 
if(Entry) Entries.push(Entry); 

Zasadniczo, nie pchaj rzeczy do Tablicy, jeśli są niezdefiniowane.