2012-02-15 2 views
0

У меня проблема с передачей массива функции в JavaScript.Uncaught TypeError: Object не имеет метода '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 используется каждый раз, когда , Удалены уже используемые параметры и вызывает следующую функцию:

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

+0

, это сработало отлично.Я не знаю, почему я этого не пытался. myabe, чтобы долго стоять перед кодом. Большое спасибо. будет принимать этот ответ, как только смогу. имеют тайм-аут 7 мин. – Przemek

1

pimvdb выглядит ударил ноготь на голове, но я выложу это для общей информации в любом случае, потому что я уже написал :)


Вы не можете назвать splice, потому что это а не массив. Используйте console.log(typeof params), чтобы узнать, что это такое, и начните обратный отсчет через ваш код, чтобы понять, почему это не массив.

Возможные соперники - Селектор #edit_form_ + id должен быть #edit_form + id - The id Param передается в не соответствует идентификатор формы - форма пуста, поэтому сериализация ничего не делает

+0

спасибо за ответ и информацию. как я упомянул в OP, первый запуск был успешным, так что работали id и сериализация. после этого первая функция никогда не вызывается снова, поэтому это не может быть источником сбоя. Я люблю stackoverflow и вы, ребята. вы помогли мне уже столько раз. – Przemek

Смежные вопросы