По каким причинам отключенные поля в HTML-форме все равно передаются?

Итак, у меня есть эта исправленная структура HTML, на которую я не могу повлиять. Структура обеспечивается инструментом, в который вы добавляете поля выбора/ввода/и т. д. с помощью перетаскивания.

Например. обычное текстовое поле получает этот HTML-код:

<div id="d_001" class="field  text ">
    <label for="f_001" id="l_001">Shortdescription</label>
        <input id="f_001" name="id1" value=""     />
</div>

И текстовая область получит этот код:

<div id="d_002" class="field  area ">
    <label for="f_002" id="l_002">Description</label>
        <textarea id="f_002" name="id2" cols="45" rows="5" ></textarea>
</div>

У меня также есть список выбора, который на основе выбранного элемента показывает/скрывает дополнительные информационные поля. Допустим, например, что список выбора содержит разную одежду. При выборе «брюки» становятся видимыми два поля ввода «длина» и «ширина». Когда вы выбираете "бюстгальтер", два поля ввода "размер чашки" и "обхват груди" становятся видимыми.

Итак, вот в чем дело: при выборе "брюки" в настоящее время система отправляет следующую информацию:

Short Descritption: Pants
Description: I would like to by black skinny jeans
Length: 32
Width: 32
Cup Size:
Underbust:

Немного погуглив, я узнал, что отключение невыбранных полей должно помочь. Но это не так. Он явно отключает поля, так как они серые и недоступны для редактирования, но они все равно передаются при отправке формы.

Основываясь на приведенных выше фрагментах HTML, я попытался отключить через

document.getElementsByTagName('input').disabled = true;

--> который отключает все поля ввода «ввод», но по-прежнему отправляет метку без содержимого. Хотя я не уверен, что он не отправляет контент или все еще отправляет пустой контент.
(да, это не включает списки выбора, текстовые области и т. д., но это второстепенная проблема, которую можно решить, выполнив то же самое для всех типов тегов)

Поэтому я подумал, что, возможно, мне нужно отключить все элементы в элементе div, что означает, что мне нужно также «отключить» метки через

documents.getElementsByTagName('label').disabled = true;

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

Редактировать:

По запросу я хочу добавить точный цикл, который отключает указанные поля ввода:

// list with links to make the items clickable
      <ul id="myUL">
          <li><a id="li1" title="pants" href="javascript:void(0)" onclick="returncontent(this);showpants();">Pants</a></li>
          <li><a id="li2" title="bra" href="javascript:void(0)" onclick="returncontent(this);showbra();">Bra></li>
          <li><a id="li3" title="tshirt" href="javascript:void(0)" onclick="returncontent(this);showtshirt();">T-Shirt</a></li>
          <li><a id="li4" title="socks" href="javascript:void(0)" onclick="returncontent(this);showsocks();">Socks</a></li>
      </ul>

// a var array containing the available class attributes
var elemente = ["pants","bra","tshirt","socks"];

// defining the functions triggered by the list
function showpants(){
    howtocode(0);
}
function showbra(){
    howtocode(1);
}
function showtshirt(){
    howtocode(2);
    wosOSD();
}
function showsocks(){
    howtocode(3);

// have the function do different things depending on the selected list item
function howtocode(value){
    var arrayLength = elemente.length;
    for (var i = 0; i < arrayLength; i++) {
    var classEle = document.getElementsByClassName(elemente[i]);
    if (elemente[i] === elemente[value]){
      changeStyle(elemente[i],classEle,"block");
      setRequired(elemente[i],classEle);
    }
    else{
      changeStyle(elemente[i],classEle,"block");
      disableFields(elemente[i],classEle);
      emptyFields(elemente[i],classEle);
    }

  }
}
function disableFields(ele, classEle){
    for (var n = 0; n < classEle.length; n++) {
        var inputfields3 = classEle[n].getElementsByTagName('input');
        var textfield3 = classEle[n].getElementsByTagName('textarea');
        for (var o = 0; o < inputfields3.length; o++){
            inputfields3[o].disabled = true;
        }
        for (var p = 0; p < textfield3.length; p++){
            textfield3[p].disabled = true;
        }
    }
}

а другие функции делают следующее:
- changeStyle() [устанавливает элемент div в значение "block" или "none"
- setRequired() [надеюсь, понятно сам по себе]
- emptyFields() [ сбрасывает все поля ввода, если выбранный элемент изменяется]

Я знаю, что в настоящее время это не работает. Я работаю над созданием скрипки.

Редактировать 2:

Итак, я нашел следующий код где-то в системных файлах JS/jQuery. Может ли это иметь какое-то отношение к этому? Пока я еще не понял, что он делает.

    var data = elements.inject({ }, function(result, element) {
      if (!element.disabled && element.name) {
        key = element.name; value = $(element).getValue();
        if (value != null && (element.type != 'submit' || (!submitted &&
            submit !== false && (!submit || key == submit) && (submitted = true)))) {
          if (key in result) {
            // a key is already present; construct an array of values
            if (!Object.isArray(result[key])) result[key] = [result[key]];
            result[key].push(value);
          }
          else result[key] = value;
        }
      }
      return result;
    });

person tsfiddlesticks    schedule 16.01.2020    source источник
comment
Вы говорите, что он отправляет эти данные, но откуда вы знаете, что он отправляет? Вы уверены, что не просматриваете результаты анализа с добавлением отключенных полей? Какие данные отправляются в необработанном формате?   -  person Ashley    schedule 16.01.2020
comment
Какой механизм вы используете для отправки данных? Был бы полезен минимальный воспроизводимый пример.   -  person Turnip    schedule 16.01.2020
comment
@Turnip, ну вот куда дело. Дело в том, что я говорю об инструменте для создания билетов, который предоставляет возможность создавать веб-тикеты, чтобы пользователь мог создать билет через веб-форму в указанном инструменте. Весь механизм трансмиссии представляет собой черный ящик. Я могу найти код jQuery при просмотре кода в браузере, но это буквально просто бесчисленные строки неформатированного кода. Но я постараюсь получить некоторую полезную информацию.   -  person tsfiddlesticks    schedule 16.01.2020
comment
«document.getElementsByTagName('input').disabled = true; отключает все поля ввода» - нет, не отключает. getElementsByTagName возвращает список узлов, и вы просто устанавливаете для свойства disabled этого списка узлов значение true - который ничего не достигает. Вам нужно перебрать элементы, содержащиеся в этом списке, и установить отключенный атрибут для каждого из них по отдельности.   -  person 04FS    schedule 16.01.2020
comment
@Ashley, в этот момент я чувствую себя обязанным упомянуть о своем путешествии по JS, которое началось несколько недель назад. И, боюсь, понятия не имею, как найти ответы на ваши вопросы. Что вы подразумеваете под необработанным форматом?   -  person tsfiddlesticks    schedule 16.01.2020
comment
@04FS правда. Я забыл упомянуть, что у меня есть цикл for, который выбирает отдельные элементы из списка узлов. Но поскольку это большой цикл, выполняющий несколько действий, я решил упростить его таким образом. Но, как я упоминал в посте: я вполне уверен, что цикл выполняет свою работу, так как поля ввода серые и недоступны для редактирования.   -  person tsfiddlesticks    schedule 16.01.2020
comment
Предоставьте правильный минимальный воспроизводимый пример, который показывает поведение, о котором вы говорите. С фрагментами кода, которые даже не являются реальными, мы вряд ли сможем вам помочь.   -  person 04FS    schedule 16.01.2020
comment
Просто для ясности — мы говорим о форме, которая отправляется «обычным» способом? Или это то, где данные формы собираются и подготавливаются для отправки каким-то сценарием?   -  person 04FS    schedule 16.01.2020
comment
@tsfiddlesticks Ничего страшного, когда-то мы все были новичками! Обычно, когда кто-то отправляет форму, она либо отправляется обычным способом, как указано другим пользователем (developer.mozilla.org/en-US/docs/Learn/Forms/), либо данные собираются, обрабатываются и отправляются куда-то особым образом. Я подозреваю, что если бы это было нормальным способом, ваша форма работала бы так, как ожидалось, и отключенные поля не были бы отправлены. Если данные отправляются нестандартным способом и представляют собой черный ящик, как вы говорите, вы не сможете изменить его поведение.   -  person Ashley    schedule 16.01.2020
comment
@ 04FS ну, я не включил его, потому что я чувствовал, что это ненужная информация. Но я включил сокращенную версию того, что я сделал, адаптированную к примеру, который я использовал в описании.   -  person tsfiddlesticks    schedule 16.01.2020
comment
Я не могу создать что-то, что на самом деле исчерпает эти разрозненные фрагменты, когда я пытаюсь скопировать и вставить их в jsfiddle. Пожалуйста, предоставьте что-нибудь, где мы можем посмотреть на это на самом деле вживую и работать, не вызывая ошибок, потому что в разных местах чего-то не хватает.   -  person 04FS    schedule 16.01.2020
comment
@ Эшли, хорошо, понял. Вроде очевидно! Помогает ли вообще следующая информация? Я попытаюсь найти еще какую-нибудь полезную информацию... ‹form target=ResultWindow action=/cgi-bin/bin/ticket enctype=multipart/form-data method=post name=form1 id=form1›   -  person tsfiddlesticks    schedule 16.01.2020
comment
@tsfiddlesticks Похоже, ваша форма может отправляться обычным способом. Вы можете использовать что-то вроде инструментов разработчика Chrome для сбора необработанных данных, которые публикуются вашей формой. Я предлагаю вам сделать это, чтобы увидеть, что на самом деле отправляется. Вот как это сделать: datawookie. netlify.com/blog/2016/09/   -  person Ashley    schedule 16.01.2020
comment
@ Эшли, поэтому я работаю над получением информации о необработанных данных. Но сначала мне нужно понять предложение инструмента. Тем временем я нашел фрагмент кода в системных файлах и добавил их в исходный пост как Edit 2. Может ли это быть связано?   -  person tsfiddlesticks    schedule 16.01.2020


Ответы (1)