JavaScript с использованием settimeout() с циклом

У меня есть таблица с ячейками 8x10.. каждая продажа получила элемент ввода со своим собственным идентификатором (11, 12, ..., 21,22,23,...), теперь я хочу заполнить эти входы до и после (пусть скажем 0,5 сек) я только что ввел некоторые значения для тестирования

        Betrag = new Array();
        Betrag[0] = new Array();
        Betrag[1] = new Array("asd","asd","asd","asd","asd","asd","asd","asd","asd","asd","513.000,00");
        Betrag[2] = new Array("asd","adsd","asd","asd","asd","asd","asd","asd","asd","asd","asd");
        Betrag[3] = new Array("asd","asd","asd","asd","asd","asd","asd","asd","asd","asd","asd");
        Betrag[4] = new Array("asd","uisgui","asd","asd","asd","asd","asd","asd","asd","asd","asd");
        Betrag[5] = new Array("asd","asd","asd","asd","asd","asd","asd","asd","asd","asd","asd");
        Betrag[6] = new Array("asd","asd","asd","asd","asd","asd","asd","asd","asd","asd","asd");
        Betrag[7] = new Array("asd","asd","asd","asd","asd","asd","asd","asd","asd","asd","asd");
        Betrag[8] = new Array("asd","asd","asd","asd","asd","asd","asd","asd","asd","asd","asd");

          for(i=1; i<=8; i++){
            for(k=1; k<=10; k++){
              setTimeout(function schreiben(){document.getElementById(''+i+k+'').value= Betrag[i][k];}, 1000);
              //document.getElementById(''+i+k+'').value= Betrag[i][k];
            }
          }

компилятор говорит: "TypeError: невозможно прочитать свойство '11' из неопределенного"

если бы я не использовал функцию settimeout(), весь цикл работает нормально, но с этой функцией я получил эту ошибку..

4 ответа

Решение

Вы можете попробовать что-то вроде этого:

    var i = 1;
    var k = 1;
    var obj = setInterval( function () {
        document.getElementById(i + '' + k).value= Betrag[i][k];
        if(k <= 10)
           k++;
        else
        {
            k = 1;
            if(i<=8)
                 i++;
            else
                 clearInterval(obj);
        }
    }, 1000);

Вот бегущий пример на http://jsfiddle.net/Ex98V/

Это должно работать так, как вы хотели.

for(i=1; i<=8; i++){
    for(k=1; k<=10; k++){
        (function(i, k){
            setTimeout(function schreiben(){document.getElementById(''+i+k+'').value= Betrag[i][k];}, 1000*k + 10000*i);
            //document.getElementById(''+i+k+'').value= Betrag[i][k];
        })(i, k);
    }
}

Чтобы сделать вещи немного понятнее, рассмотрите возможность рефакторинга следующим образом:

for(i=1; i<=8; i++){
    for(k=1; k<=10; k++){
        setSchreibTimeout(i, k);
    }
}

function setSchreibTimeout(i, k){
    setTimeout(function schreiben(){document.getElementById(''+i+k+'').value= Betrag[i][k];}, 1000*k + 10000*i);
    //document.getElementById(''+i+k+'').value= Betrag[i][k];
}

Барт Фридрихс прав. Не уверен, почему вы хотите сделать это таким образом, но вы можете объявить пару переменных внутри функции schreiben и увеличить их внутри той же функции screiben.

k а также i читаются после for цикл закончился (1 секунда, если быть точным). Их значения равны 9 и 11, что приводит к проблеме переполнения массива.

Один из способов исправить это - создать функцию, выполняющую эту работу, и создать фиксированную строку из k а также i переменные, чтобы назвать это:

function schreiben(__i, __k) {
   document.getElementById(''+__i+__k+'').value= Betrag[__i][__k];
}

Затем позвоните setTimeout как это:

setTimeout("schreiben("+i+","+k+")", 1000);

Не самый элегантный способ, но это работает.

Другие вопросы по тегам