未捕获的TypeError:对象没有方法'拼接'

时间:2012-02-15 13:37:58

标签: javascript jquery ajax

我在将数组传递给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);
}
}

这适用于第一次运行,并且构建新的临时参数列表并调用saveRoom函数。这将构建一个将要保存的部分参数列表。从数组中删除对象并调用save 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);
}

我得到的错误是Object没有方法'splice'。 我找不到这个bug,所以我试图在这里找到一些帮助。 我不知道为什么我不能在从函数传递给函数的参数数组上调用splice。

感谢阅读和可能的帮助:)

2 个答案:

答案 0 :(得分: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);

这样,你确实传递了一个数组(所以没有字符串转换)。

答案 1 :(得分:1)

pimvdb看起来已经敲了敲头,但我会发布这个一般信息,因为我已经写过了:)


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

可能的竞争者   - 选择器#edit_form_ + id应为#edit_form + id   - 传入的id参数与表单的ID不匹配   - 表单为空,因此序列化不执行任何操作