2012-02-15 80 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

相关问题