Что заставляет массив на сайте Squarespace, инициализированный как = [], заполняться объектами до первой ссылки на него? - PullRequest
0 голосов
/ 21 июня 2019

Я написал некоторый JavaScript для перехвата данных формы в событии submit и для создания массива объектов из нескольких полей <select>, обрабатывая одно поле за итерацию цикла, который захватывает значение поля и помещает его в массив,Каждая итерация должна создать и push() один объект в массиве. Все поля формы были обработаны.

Вместо этого на этой тестовой странице на моем веб-сайте я получаю полный массив всехобъекты из всех полей формы на первой итерации до первого нажатия .Массив остается точно таким же на каждой последующей итерации , несмотря на повторяющиеся нажатия.

JS:

function buildClasses(formData) {
  var timeslots = ['0830', '0900', '1030', '1245', '1415', '1545'];
  var classrooms = ['chapel', 'A', 'B', 'C', 'D', 'E', 'F', 'I'];
  var classes = [];
  var ts = '';
  var rm = '';
  var startIndex = 3; 

  if(formData[startIndex].value == 'attend') { 
    formData[startIndex].value = 'chapel'; 
  }
    else {formData[startIndex].value = 'unsure';} 
  for(var i = startIndex; i < formData.length; i++) {
    if(formData[i].value == 'unsure') {}
      else {
             ts = timeslots[i - startIndex];
             rm = formDataArr[i].value; 
             classes.push(
                            {
                               timeslot: ts,
                               room: rm
                            }
                         );  
           }  //  end else/if
    }  //  end for
  return classSelections;
}  //  end def fn buildClasses

formData is:

3: Object {name: "select-yui_3_nnn ... nnn-field", value: "unsure"}
4: Object {name: "select-yui_3_nnn ... nnn-field", value: "A"}
5: Object {name: "select-yui_3_nnn ... nnn-field", value: "B"}
6: Object {name: "select-yui_3_nnn ... nnn-field", value: "A"}
7: Object {name: "select-yui_3_nnn ... nnn-field", value: "unsure"}
8: Object {name: "select-yui_3_nnn ... nnn-field", value: "C"}
length: 9

Схема в buildClasses() заключается в циклическом переключении полей формы, начинающихся с индекса 3, игнорировании «неуверенных» значений и построении classes с использованиемнеуверенные значения, по одному на каждую итерацию цикла.

Исследуя с помощью console.log() на тестовой странице, я определил, что на первой итерации, до первой push(), classes это:

1: Object {timeslot: "0900", room: "A"}
2: Object {timesolt: "1030", room: "B"}
3: Object {timeslot: "1245", room: "A"}
5: Object {timeslot: "1545:, room: "C"}
length: 4

Это невероятно, я знаю.Но перед тем, как составить этот вопрос, я тестировал его на тестовой странице десятки раз, всегда с таким результатом.

Все это в прямом эфире на странице Регистрация в тестовой конференции 2019 .Я замусорил код консольными журналами, чтобы было видно, что создается на каждой итерации.Проверьте это, как вы будете.(Он подключается и обновляет живую таблицу AWS, поэтому вы также получите в консоли информацию о возврате AWS.)

Функция выглядит простой и понятной.Тем не менее, это вызывает неприятные результаты на моем сайте.Сайт построен на платформе Squarespace , использующей один из его «блоков формы» для создания формы.

Ниже приведен фрагмент кода с использованием того же кода.Он работает правильно, как и ожидалось.

Итак, должно быть что-то в том, как работает блок формы Squarespace, что заставляет весь массив появляться даже до первого нажатия.Я надеюсь, что кто-то здесь может иметь опыт работы с Squarespace и может пролить свет.

Спасибо за прочтение и за любые попытки найти ответы.

Обновление:

С тех пор, как я впервые опубликовал этот вопрос, я понял проблему лучше и по-другому.Я полностью пересмотрел его, изменил проблему и опубликовал ее под новым названием.Надеюсь, я прояснил ситуацию и опубликовал лучший вопрос, чем изначально.

Спасибо всем, кто ответил на первую версию этого вопроса.

/*  new schema w/o comments  */

$(document).ready(function() {
  init();
}); // end doc.ready

function init() {
  document.addEventListener("submit", processFormData);
} // end def fn init

function processFormData(event) {
  event.preventDefault();
  var formData = $('form').serializeArray();
  classes = buildClasses(formData);
} //  end def fn processFormData

function buildClasses(fd) {
  var timeslots = ['0830', '0900', '1030', '1245', '1415', '1545'];
  var classrooms = ['chapel', 'A', 'B', 'C', 'D', 'E', 'F', 'I'];
  var ts = '';
  var rm = '';
  var startIndex = 3;
  var classes = [];

  console.log('classes post-initialization : ', classes);

  if (fd[startIndex].value == 'attend') {
    fd[startIndex].value = 'chapel';
  } else {
    fd[startIndex].value = 'unsure';
  }
  for (var i = startIndex; i < fd.length; i++) {
    if (fd[i].value == 'unsure') {} else {
      ts = timeslots[i - startIndex];
      rm = fd[i].value;

      console.log('fd[i].value : ', i, fd[i].value);
      console.log('classes pre-push', classes);

      classes.push({
        timeslot: ts,
        room: rm
      });

      console.log('classes post-push : ', classes);

    } //  end else/if
  } //  end for
  return classes;
} //  end def fn buildClassSelections
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form action="" method="post">
  <div>
    <label>First Name
    <input type="text" name="fname" size="25">
  </label>
  </div>
  <div>
    <label>Last Name
    <input type="text" name="lname" size="25">
  </label>
  </div>
  <div>
    <label>email address
    <input type="email" name="email" size="25">
  </label>
  </div>
  <div>
    <label>08:30 Keynote Speaker
    <select name="select">
      <option value="" name="defaultOptionUnsure">unsure</option>
      <option value="attend" name="">attend</option>
      <option value="not attend">not attend</option>
    </select>
  </label>
    <label>09:00 Classes
    <select name="select">
      <option value="">unsure</option>
      <option value="class room A">room A</option>
      <option value="class room B">room B</option>
    </select>
    </label>
    <label>10:30 Classes
    <select name="select">
      <option value="">unsure</option>
      <option value="class room A">room A</option>
      <option value="class room B">room B</option>
    </select>
  </label>
  </div>
  <div>
    <input type="submit" value="submit form">
  </div>
</form>

Ответы [ 2 ]

1 голос
/ 21 июня 2019

для начала

const myForm    = document.querySelector("#My-Form")
,     FormNames = Array.from(myForm.elements).reduce((a,n)=>{ if (n.name ) a.push(n.name);  return a }, [])
;
var ResultArray = []

myForm.onsubmit = e =>{
  e.preventDefault()

  let info = {}
  for (let elm of FormNames) {
    info[elm] = myForm[elm].value
  }

  ResultArray.push(info)

  myForm.reset()
  console.clear()
  console.log('ResultArray = ', ResultArray )
}
body { font-family: Arial, Helvetica, sans-serif; }
form { margin: 1em }
label,
button {
  display: block;
  float: left;
  clear: both;
  margin: .3em;
}
label { width:24em; line-height: 2em; }
input,
select { float: right; width: 15em;}
<form action="" method="post" id="My-Form">
  <label>First Name     <input type="text"  name="fName"></label>
  <label>Last Name      <input type="text"  name="lName"></label>
  <label>email address  <input thpe="email" name="email"></label>
  <label>08:30 Keynote Speaker
    <select name="Keynote_Speaker">
      <option value=""          >unsure     </option>
      <option value="attend"    >attend     </option>
      <option value="not attend">not attend </option>
    </select>
  </label>
  <label>09:00 Classes
    <select name="Classes_09_00">
      <option value=""            >unsure </option>
      <option value="class room A">room A </option>
      <option value="class room B">room B </option>
      <option value="class room C">room C </option>
    </select>
  </label>
  <label>10:30 Classes
    <select name="Classes_10_30">
      <option value=""            >unsure </option>
      <option value="class room A">room A </option>
      <option value="claww room B">room B </option>
      <option value="class room C">room C </option>
    </select>
  </label>
  <button type="submit">submit form</button>
</form>
1 голос
/ 21 июня 2019

Трудно сказать, но я бы поспорил, что эта строка:

if(formDataArr[i] == 'unsure') {} // skip ‘unsure’

следует читать:

if(formDataArr[i].value == 'unsure') {} // skip ‘unsure’

Сказав это, вы, вероятно, должны протестировать подобную функцию изолированно, это легко сделать в REPL-файле node.js. Но ничто не сравнится с полноценной тестовой средой мокко / чай.

...