Javascript 未捕获类型错误:对象没有方法';拼接';

Javascript 未捕获类型错误:对象没有方法';拼接';,javascript,jquery,ajax,Javascript,Jquery,Ajax,我在JavaScript中将数组传递给函数时遇到问题 我有一个带墙的房间,必须保存,但是元素太多了,所以我把它们分成了几个部分。单击“保存”时,这是调用的第一个函数: function getCompleteParamlist(id) { var paramlist = $("#edit_form_"+id).serialize(); var params = paramlist.split("&"); var id = params[0];

我在JavaScript中将数组传递给函数时遇到问题

我有一个带墙的房间,必须保存,但是元素太多了,所以我把它们分成了几个部分。单击“保存”时,这是调用的第一个函数:

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);
}
它获取要保存的所有值,将它们拆分为一个数组,并构建一个每次使用的参数字符串。已删除已使用的参数并调用下一个函数:

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);
}
}
此方法调用保存值的Java控制器,然后再次调用prepareSaveRoom函数,直到处理完所有参数。但当saveRoom()调用prepareSaveRoom时,它就说到点子上了:

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

for(var i=1;i您正在将所有内容转换为一个字符串。事实上,您已经显式地用引号将
params
括起来,好像您希望它是一个字符串:

window.setTimeout("prepareSaveRoom('"+fixed_params+"','"+params+"','"+loops+"','"+length+"','"+count+"')",2000);
字符串没有
.splice
。您希望传递数组
参数,而不是数组的字符串表示形式

不将字符串传递给
setTimeout
的另一个原因。应始终传递函数:

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

这样,您确实传递了一个数组(因此没有字符串转换)。

您正在将所有内容转换为一个字符串。事实上,您已经用引号显式地将
参数括起来,好像您希望它是一个字符串:

window.setTimeout("prepareSaveRoom('"+fixed_params+"','"+params+"','"+loops+"','"+length+"','"+count+"')",2000);
字符串没有
.splice
。您希望传递数组
参数,而不是数组的字符串表示形式

不将字符串传递给
setTimeout
的另一个原因。应始终传递函数:

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

通过这种方式,您确实传递了一个数组(因此没有字符串转换)。

pimvdb看起来击中了要害,但我还是会发布此内容以获取一般信息,因为我已经编写了它:)


不能调用
splice
,因为它不是数组。使用
console.log(typeof params)
找出它是什么,然后开始回溯代码,看看为什么它不是数组

可能的竞争者 -选择器
#编辑表单+id
应为
#编辑表单+id
-传递的
id
参数与表单的id不匹配
-表单是空的,因此序列化没有任何作用

pimvdb看起来已经击中了要害,但我还是会发布此内容以获取一般信息,因为我已经编写了:)


不能调用
splice
,因为它不是数组。使用
console.log(typeof params)
找出它是什么,然后开始回溯代码,看看为什么它不是数组

可能的竞争者 -选择器
#编辑表单+id
应为
#编辑表单+id
-传递的
id
参数与表单的id不匹配
-表单为空,因此序列化不起任何作用

这非常有效。我不知道为什么我没有尝试这个。myabe要长在前面的代码。非常感谢你。我会尽快接受这个答案。有一个7分钟的超时时间。这非常有效。我不知道为什么我没有尝试这个。myabe要长在前面的代码。非常感谢你。我会尽快接受这个答案。暂停7分钟。谢谢你的回答和信息。正如我在OP中提到的,第一次运行是成功的,因此id和序列化工作正常。此后,第一个函数再也不会被调用,因此这可能不是失败的原因。我爱你和你们。你已经帮了我很多次了。谢谢你的回答和信息。正如我在OP中提到的,第一次运行是成功的,因此id和序列化工作正常。此后,第一个函数再也不会被调用,因此这可能不是失败的原因。我爱你和你们。你已经帮了我很多次了。