2012-02-15 17 views
0

JavaScriptの関数に配列を渡す際に問題があります。Uncaught TypeError:オブジェクトに 'splice'メソッドがありません

私は壁を持つ部屋がありますが、保存する必要がありますが、要素が多すぎるため、部分的に分割しています。

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の文字列を作成します:uが、これはと呼ばれる最初の機能である「保存」をクリックすると、 。既に使用されるパラメータを削除して、次の関数を呼び出します。

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関数が呼び出されます。これにより、保存される部分的なパラメータリストが構築されます。アレイからオブジェクトを除去し、このメソッドは、値を保存するJavaコントローラ呼び出し、すべてのパラメータが処理されるまで、それは、再びprepareSaveRoom関数を呼び出す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"); 
    } 
}); 
} 

保存呼び出します。しかし、ときsaveRoom()はprepareSaveRoomを呼び出し、それがポイントになります:

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

私はオブジェクトがメソッド「スプライス」を持っていないエラーが発生します。 私はバグを見つけることができないので、私はここでいくつかの助けを見つけることを試みています。 なぜ関数から関数に渡されるパラメータ配列でspliceを呼び出せないのかわかりません。読書や可能助けを

感謝:)

答えて

2

あなたは、文字列にすべてを変換しています。

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

文字列は.spliceを持っていない:あなたはそれを文字列になりたかったかのように実際には、明示的に引用符で囲まれたparamsをしました。配列paramsを渡したいと思います。文字列表現ではありません。

もう1つの理由でないsetTimeoutに文字列を渡す。

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

このようにして、実際には配列を渡します(文字列変換はしません)。私はすでにそれを書いたので、

+0

しません、私はこれをしようとすると、それがうまくいけば、フィードバックを与えてください – Przemek

+0

これは完全に働いた。なぜ私はこれを試していないのかわかりません。コードの前で長い間、マイアベ。どうもありがとうございました。できるだけ早くこの回答を受け入れます。 7分のタイムアウトがあります。 – Przemek

1

pimvdbは頭の上に釘を打っているように見えますが、私はとにかく一般的な情報のためにこれを投稿します:)


それだからあなたがspliceを呼び出すことはできません配列ではありません。それが何であるかを知るためにconsole.log(typeof params)を使用し、コードでバックトラックを開始して配列でない理由を確認してください。

可能性のある候補 - セレクタ#edit_form_ + id#edit_form + id する必要があります - に渡されるid paramはフォーム のIDが一致しない - フォームは空なので、シリアライズは何も

+0

答えと情報に感謝します。私はOPで述べたように、最初の実行は成功していたので、IDとシリアライズは機能しました。その後、最初の関数は決して再び呼び出されないので、これは失敗の原因にはなりません。私はあなたとstackoverflowが大好きです。あなたは私のことを何度も助けてくれました。 – Przemek

関連する問題