2015-04-22 63 views
1

我有一個將數據發送到服務器的JS函數。在函數中,我用來自輸入字段的數據填充數組(row_data)。該數組不是空的,我可以得到值後,我設置它們。但是,如果我把數組放到ajax調用中,數組是完全空的。我不瞭解這種行爲。JavaScript數組在Ajax調用時爲空

function send_data() { 
     var d = new Date(); 
     var row_data = []; 
     timestamp = d.getTime(); 

     for(i = 1; i <= rows; i++) { 
      row_data[i] = []; 
      row_data[i]['bold'] = jQuery('#bold' + i + '_val').val(); 
      row_data[i]['italic'] = jQuery('#italic' + i + '_val').val(); 
      row_data[i]['underline'] = jQuery('#underline' + i + '_val').val(); 
      row_data[i]['align'] = jQuery('#align' + i + '_val').val(); 
      row_data[i]['capitalize'] = jQuery('#capitalize' + i + '_val').val(); 
      row_data[i]['curved'] = jQuery('#curved' + i + '_val').val(); 
      row_data[i]['font'] = jQuery('#font' + i + '_val').val(); 
      row_data[i]['font_size'] = jQuery('#fontsize' + i + '_val').val(); 
      row_data[i]['abstand'] = jQuery('#abstand' + i + '_val').val(); 
      row_data[i]['text'] = jQuery('#zeile' + i).val(); 

      if (row_data.length <1) alert("array is empty"); 
     } 

     if (row_data.length <1) alert("array is empty"); 

     $.ajax({ 
      method: 'POST', 
      url: server_script_url, 
      cache: false, 
      dataType: 'xml', 
      data: { 'id': session_id, 
         'rows' : rows, 
         'row_data' : row_data 
        } 
     }) 
     .done(function(xml) { 
      var image = $(xml).find('file').first().text(); 
      jQuery('#preview_image').attr('src', image + '?t=' + timestamp); 
     }) 
     .fail(function() { 
      alert('Leider gab es bei der Datenübermittlung einen unbekannten Fehler.'); 
     }); 

    } 

回答

1

幾個問題有:

  1. 數組下標0,不1啓動,所以你的第一個條目的值將undefined,這可能是扔東西了。

  2. 另外,你初始化row_data[i][](空數組),但此時你就好像是一個對象,這也可能混淆了系列化分配給它的非索引屬性。

您可以通過使用push來避免#1;您可以通過使用{}而不是[]來避免#2。事實上,你可以使用對象文本來使代碼少一點重複整體:

for(i = 1; i <= rows; i++) { 
//    v----- Note { rather than [ 
    row_data.push({ 
     'bold': jQuery('#bold' + i + '_val').val(), 
     'italic': jQuery('#italic' + i + '_val').val(), 
     'underline': jQuery('#underline' + i + '_val').val(), 
     'align': jQuery('#align' + i + '_val').val(), 
     'capitalize': jQuery('#capitalize' + i + '_val').val(), 
     'curved': jQuery('#curved' + i + '_val').val(), 
     'font': jQuery('#font' + i + '_val').val(), 
     'font_size': jQuery('#fontsize' + i + '_val').val(), 
     'abstand': jQuery('#abstand' + i + '_val').val(), 
     'text': jQuery('#zeile' + i).val() 
    }); 
// ^------------------- Note } rather than ] 
} 
if (row_data.length <1) alert("array is empty"); 

另外,但可能無關,你if是內環路;你可能需要在循環之後處理沒有添加行的情況。我把它移到了上面。


邊注:因爲沒有你的屬性名稱是無效的「標識符名稱爲」在JavaScript中,我們也可以離開了他們周圍的報價在初始化:

for(i = 1; i <= rows; i++) { 
//    v----- Note { rather than [ 
    row_data.push({ 
     bold: jQuery('#bold' + i + '_val').val(), 
     italic: jQuery('#italic' + i + '_val').val(), 
     underline: jQuery('#underline' + i + '_val').val(), 
     align: jQuery('#align' + i + '_val').val(), 
     capitalize: jQuery('#capitalize' + i + '_val').val(), 
     curved: jQuery('#curved' + i + '_val').val(), 
     font: jQuery('#font' + i + '_val').val(), 
     font_size: jQuery('#fontsize' + i + '_val').val(), 
     abstand: jQuery('#abstand' + i + '_val').val(), 
     text: jQuery('#zeile' + i).val() 
    }); 
// ^------------------- Note } rather than ] 
} 
if (row_data.length <1) alert("array is empty"); 
+0

此外,他還需要將for(i = 1; i <= rows; i ++)'更改爲'for(for i = 0; i

+0

完美的,這是有效的!我的主要失敗是定義一個數組而不是一個對象?感謝您的詳細解答。 – Smedi

0

測試此代碼

for(var i = 0; i <= rows; i++) { 
     row_data[i] = {}; 
     row_data[i]['bold'] = jQuery('#bold' + i + '_val').val(); 
     row_data[i]['italic'] = jQuery('#italic' + i + '_val').val(); 
     row_data[i]['underline'] = jQuery('#underline' + i + '_val').val(); 
     row_data[i]['align'] = jQuery('#align' + i + '_val').val(); 
     row_data[i]['capitalize'] = jQuery('#capitalize' + i + '_val').val(); 
     row_data[i]['curved'] = jQuery('#curved' + i + '_val').val(); 
     row_data[i]['font'] = jQuery('#font' + i + '_val').val(); 
     row_data[i]['font_size'] = jQuery('#fontsize' + i + '_val').val(); 
     row_data[i]['abstand'] = jQuery('#abstand' + i + '_val').val(); 
     row_data[i]['text'] = jQuery('#zeile' + i).val(); 

     if (row_data.length <1) alert("array is empty"); 
    }