2012-02-15 47 views
0

我在將數組傳遞給JavaScript函數時遇到問題。未捕獲TypeError:對象沒有方法「拼接」

我有一個房間的牆壁必須保存,但有太多元素,所以我把它們分成幾部分。當U點擊「保存」這是一個被稱爲第一功能:

function getCompleteParamlist(id) 
{ 
var paramlist = $("#edit_form_"+id).serialize(); 
var params = paramlist.split("&"); 

var id      = params[0]; 
var name     = params[1]; 
var x_max     = params[2]; 
var y_max     = params[3]; 
var tools     = params[4]; 
var style_toolbrush   = params[5]; 
var roompiece_brushchooser = params[6]; 
params.splice(0,7); 
var y = y_max.replace(/\D/g, ''); 
var length = params.length; 

var fixed_params = id+"&"+name+"&"+x_max+"&"+y_max+"&"+tools+"&"+style_toolbrush+"&"+roompiece_brushchooser+"&y_val="; 

prepareSaveRoom(fixed_params,params,y,length,1); 
} 

它讓所有將要保存的值,他們分成數組,並建立PARAMS的字符串每次使用。刪除了已經使用的參數,並調用一個函數:

function prepareSaveRoom(fixed_params,params,loops,length,count) 
{ 
    var temp_paramlist = fixed_params+count; 

for(var i=1; i<=length/loops; i++) 
{ 
    temp_paramlist += "&"+params[0]; 
    params.splice(0,1); 
} 

if (count == loops) 
{ 
    temp_paramlist += "&last=true"; 
    saveRoom(temp_paramlist,1,fixed_params,params,loops,length,count); 
} 
else 
{ 
    temp_paramlist += "&last=false"; 
    count++; 
    saveRoom(temp_paramlist,0,fixed_params,params,loops,length,count); 
} 
} 

這個工程在第一次運行和新的臨時PARAMETERLIST是建立和saveRoom函數被調用。這會建立一個將要保存的部分參數列表。除去從陣列中的對象,並調用保存funvtion

function saveRoom(temp_paramlist,lastloop,fixed_params,params,loops,length,count) 
{ 
alert(temp_paramlist); 
$.ajax({ 
    type: "POST", 
    dataType: "html", 
    url: "SaveRoom?"+temp_paramlist, 
    contentType: "application/x-www-form-urlencoded;charset=UTF-8", 
    cache: false, 
    success: function(data){ 
     if(lastloop == 1){ 
      location.href=data; 
     } 
     else{ 
      window.setTimeout("prepareSaveRoom('"+fixed_params+"','"+params+"','"+loops+"','"+length+"','"+count+"')",2000); 
     } 
    }, 
    error: function(data){ 
     showErrorDialogHandleSecondDiv(data.responseText,"#edit_room"); 
    } 
}); 
} 

此方法調用一個Java控制器節省了值,然後它再次調用prepareSaveRoom功能,直到所有的參數的處理方式。但是,當saveRoom()調用prepareSaveRoom連帶的一點是:

for(var i=1; i<=length/loops; i++) 
{ 
    temp_paramlist += "&"+params[0]; 
    params.splice(0,1); 
} 

我得到的對象沒有方法「拼接」的錯誤。 我找不到這個錯誤,所以我想在這裏找到一些幫助。 我不知道爲什麼我無法調用從函數傳遞給函數的參數數組上的拼接。

感謝您的閱讀和可能的幫助:)

回答

2

您正在將所有內容轉換爲字符串。事實上,你已經明確封閉params帶引號的,如果你希望它是一個字符串:

window.setTimeout("prepareSaveRoom('"+fixed_params+"','"+params+"','"+loops+"','"+length+"','"+count+"')",2000); 

字符串沒有.splice。你想傳遞數組params,而不是它的字符串表示。

另一個原因不是將字符串傳遞給setTimeout。你應該在任何時候都傳遞一個函數:

window.setTimeout(function() { 
    prepareSaveRoom(fixed_params, params, loops, length, count); 
}, 2000); 

這樣的話,你確實傳遞一個數組(所以沒有字符串轉換)。

+0

我會嘗試這一點,然後給予反饋,如果它的工作 – Przemek 2012-02-15 13:44:11

+0

這工作完美。我不知道爲什麼我沒有嘗試這個。 myabe在代碼前面長。非常感謝你。我會盡快接受這個答案。有7分鐘超時。 – Przemek 2012-02-15 13:46:52

1

pimvdb看起來已經擊中了要害,但無論如何,我會寄這對於一般信息,因爲我已經寫吧:)


不能稱之爲splice,因爲它是不是一個數組。使用console.log(typeof params)找出它是什麼,並通過代碼開始回溯,看看它爲什麼不是數組。

可能的競爭者 - 選擇器#edit_form_ + id應該是#edit_form + id - 該id PARAM傳遞的不匹配形式 的ID - 形式是空的,所以序列化什麼也不做

+0

感謝您的回答和信息。正如我在OP中提到的,第一次運行是成功的,所以id和序列化工作。之後,第一個函數不會再被調用,所以這不能成爲失敗的根源。我喜歡stackoverflow和你們。你已經幫了我很多次了。 – Przemek 2012-02-15 13:55:02

相關問題