Javascript 未捕获类型错误:对象没有方法';拼接';
我在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];
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和序列化工作正常。此后,第一个函数再也不会被调用,因此这可能不是失败的原因。我爱你和你们。你已经帮了我很多次了。