createElement создает бесконечный цикл - PullRequest
0 голосов
/ 07 декабря 2018

Я действительно новичок в javascript и в кодировании в целом, и я не могу понять, почему это вызывает бесконечный цикл:

  let newTr = document.createElement('tr');

Если я уберу его, веб-страница загрузится нормально, ноесли я оставлю его, веб-страница никогда не загрузится полностью, и мой браузер использует 50% моего процессора.

Вот остальная часть моего кода:

// client-side js
// run by the browser each time your view template referencing it is loaded

console.log('hello world :o');

let arrPfcCases = [];

// define variables that reference elements on our page

const tablePfcCases = document.getElementById("tablePfcCases");
const formNewPfcCase = document.forms[0];
const caseTitle = formNewPfcCase.elements['caseTitle'];
const caseMOI = formNewPfcCase.elements['caseMOI'];
const caseInjuries = formNewPfcCase.elements['caseInjuries'];

// a helper function to call when our request for case is done
const  getPfcCaseListener = function() {
  // parse our response to convert to JSON
  arrPfcCases = JSON.parse(this.responseText);

  // iterate through every case and add it to our page
  for (var i = 0; i = arrPfcCases.length-1;i++) {
    appendNewCase(arrPfcCases[i]);
  };
}

// request the dreams from our app's sqlite database
const pfcCaseRequest = new XMLHttpRequest();
pfcCaseRequest.onload = getPfcCaseListener;
pfcCaseRequest.open('get', '/getDreams');
pfcCaseRequest.send();

// a helper function that creates a list item for a given dream
const appendNewCase = function(pfcCase) {
  if (pfcCase != null) {
  tablePfcCases.insertRow();
  let newTr = document.createElement('tr');
  for (var i = 0; i = pfcCase.length - 1; i++) {
    let newTd = document.createElement('td');
    let newText = document.createTextNode(i.value);
    console.log(i.value);
    newTd.appendChild(newText);
    newTr.appendChild(newTd);
  }

  tablePfcCases.appendChild(newTr);
  }
}

// listen for the form to be submitted and add a new dream when it is
formNewPfcCase.onsubmit = function(event) {
  // stop our form submission from refreshing the page
  event.preventDefault();
  let newPfcCase = [caseTitle, caseMOI, caseInjuries];
  // get dream value and add it to the list
  arrPfcCases.push(newPfcCase);
  appendNewCase(newPfcCase);

  // reset form 
  formNewPfcCase.reset;

};

Спасибо!

PS Возможно, с кодом не так много других проблем, я просто не могу сделатьчто-нибудь еще, пока я не выясню это!

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Здесь нет условного утверждения.В этом утверждении вы назначаете длину pfcCase минус 1. Переменной I.

for (var i = 0; i = pfcCase.length - 1; i++) {

Вы должны сравнить переменную i с длиной pfcCase минус 1.

Это должно сработать.

for (var i = 0; i < pfcCase.length - 1; i++) {

заметил что-то еще

Эта строка не делает то, что вы думаете, что она дозирует.

let newText = document.createTextNode(i.value);

i это просто индекс, то есть число.У него нет свойства value.

Это то, что вы хотите сделать.

let newText = document.createTextNode(pfcCase[i].value);

мои предпочтения (forEach)

Я предпочитаю использовать метод массива forEach,Он чище и менее подвержен ошибкам.

pfcCase.forEach( function(val){
    let newTd = document.createElement('td');
    let newText = document.createTextNode(val.value);
    console.log('The array element is. '. val.value, ' The value is. ', val.value);
    newTd.appendChild(newText);
    newTr.appendChild(newTd);
  });
0 голосов
/ 07 декабря 2018

В качестве объяснения в вашем коде

i = pfcCase.length - 1

присвоено значение pfcCase.length - 1 для i.Синтаксис этой части цикла должен быть

выражением, которое будет оцениваться перед каждой итерацией цикла. Если это выражение имеет значение true, оператор выполняется.

Оценка вашего кода не имеет смысла.

Оценка

i < pfCase.length

перед каждой итерацией, чтобы проверить, что текущий индекс меньше длиныОднако массив работает правильно.

...