Ваша проблема чрезвычайно распространена. В JavaScript переменные находятся на уровне функций, а не на уровне операторов блока. Таким образом, когда вы повторяете этот цикл с переменной «i», каждая функция, которую вы создаете в цикле , разделяет то же самое «i». Таким образом, когда функции на самом деле называются , значение «i» будет таким, каким оно является в конце цикла & mdash; и это точка за концом массива!
Чтобы избежать этой проблемы, вам нужно создать эти функции в другой функции. Чистый способ сделать это - использовать отдельную локальную функцию:
function makeReadyStateHandler(i) {
return function() {
if (ax[i].readyState != 4) {
document.getElementById('return_table_'+i).innerHTML="loading "+i;
}
if(ax[i].readyState == 4){
// get data from the server response
var response_ready=ax[i].responseText;
document.getElementById('return_table_'+i).innerHTML = response_ready;
}
};
}
Затем просто вызовите эту функцию из цикла:
ax[i].onreadystatechange = makeReadyStateHandler(i);
Используя такую отдельную функцию, вы гарантируете, что каждая функция-обработчик будет иметь свою собственную копию «i», которая зафиксирована в правильной точке цикла. Функция вернет вновь созданную функцию в качестве результата, который вы будете использовать в качестве обработчика события.