Если значение поля формы пусто, я хочу скрыть это от сгенерированного отчета, если он оставлен пустым - PullRequest
1 голос
/ 11 февраля 2020

В основном я пытаюсь создать форму, которая после создания полей формирует отчет. До сих пор мне удавалось заставить его делать все, что я хочу, за исключением того, что поле формы пустое, чтобы скрыть раздел в сгенерированном отчете div ниже. Я потратил довольно много времени на эту форму, и я не уверен, что мне нужно включить, чтобы вы могли мне помочь, поэтому я прошу прощения за скриншот ниже. Обратите внимание, что я удалил URL веб-сайта отсюда, но он все еще в моем коде.

<script>
function check() {
  document.getElementById("text1").innerHTML = document.myform.Topic.value;
  document.getElementById("text2").innerHTML = document.myform.Info.value;
  document.getElementById("text3").innerHTML = document.myform.Summary.value;
  document.getElementById("text4").innerHTML = document.myform.Room.value;
  document.getElementById("text5").innerHTML = document.myform.PM.value;
  document.getElementById("text7").innerHTML = document.myform.PM.value;
  document.getElementById("text6").innerHTML = document.myform.Room2.value;
}

$(document).ready(function() {
 $("#generated").hide(); 
  $("#btn").click(function() {
     $("#generated").show();
  });
});

$(document).ready(function() {
 $("#p3").hide(); 
  $("#btn").click(function() {
     $("#p3").show();
  });
});

$(document).ready(function() {
 $("#cbtn").hide(); 
  $("#btn").click(function() {
     $("#cbtn").show();
  });
});

$(document).ready(function() {
 $("#textbox").hide(); 
  $("#btn2").click(function() {
     $("#textbox").show();
  });
});

function myFunction() {
   var element = document.getElementById("form2");
   element.classList.toggle("darkmode");
   var element = document.getElementById("texta");
   element.classList.toggle("darkmode1");
   var element = document.getElementById("textb");
   element.classList.toggle("darkmode1");
   var element = document.getElementById("textc");
   element.classList.toggle("darkmode1");
   var element = document.getElementById("textd");
   element.classList.toggle("darkmode1");
   var element = document.getElementById("texte");
   element.classList.toggle("darkmode1");
   var element = document.getElementById("textf");
   element.classList.toggle("darkmode1");
   var element = document.getElementById("generated");
   element.classList.toggle("darkmode2");
}

function copyRedirect() {
  copyClipboard(); // calling function copyClipboard()
  myFunction1(); // calling function myFunction1()
}
function copyClipboard() {
  var elm = document.getElementById("generated");
  // for Internet Explorer

  if(document.body.createTextRange) {
    var range = document.body.createTextRange();
    range.moveToElementText(elm);
    range.select();
    document.execCommand("Copy");
  }
  else if(window.getSelection) {
    // other browsers

    var selection = window.getSelection();
    var range = document.createRange();
    range.selectNodeContents(elm);
    selection.removeAllRanges();
    selection.addRange(range);
    document.execCommand("Copy");

  }
}

function myFunction1() {
  if(confirm("Your report has been copied to your clipboard, would you like to proceed to the forums?")) document.location = 'https://*******';
  }
</script>
<html>

<body>
  <br>
  <div class="buttonPlace">
    <button id="darkbtn" onclick="myFunction()">Switch Mode</button>
  </div>
  <div id="form2" class='form1'>
    <form name='myform'>
      <h1> Report Generator</h1>
      <br>
      <p id='p1' style="margin-left:30px;">Topic</p>
      <textarea id="texta" name='Topic' cols="110" rows="2" value="" placeholder="Name, Infraction, Action Taken"></textarea>
      <p id='p1' style="margin-left:30px;"> Info</p>
      <textarea id="textb" name='Info' cols="110" rows="6" value="" placeholder="Chatter Information"></textarea>
      <p id='p1' style="margin-left:30px;"> Summary</p>
      <textarea id="textc" name='Summary' cols="110" rows="6" value="" placeholder="Report Summary"></textarea>
      <p id='p1' style="margin-left:30px;"> #Room</p>
      <textarea id="textd" name='Depression' cols="110" rows="6" value="" placeholder="Logs from #Room (if applicable)"></textarea>
      <p id='p1' style="margin-left:30px;">PM</p>
      <textarea id="texte" name='PM' cols="110" rows="6" value="" placeholder="PM Logs (if applicable)"></textarea>
      <button id="btn2" onclick="check(); return false">Add PM</button>
      <div id='textbox'>
        <p id='p1' style="margin-left:30px;">PM</p>
        <textarea id="textg" name='PM' cols="110" rows="6" value="" placeholder="PM Logs (if applicable)"></textarea>
      </div>
      <p id='p1' style="margin-left:30px;">#Room2</p>
      <textarea id="textf" name='RA' cols="110" rows="6" value="" placeholder="Logs from #Room2 (if applicable)"></textarea>
      <div class="btn-block">
        <p><button id='btn' type='submit' onclick='check(); return false'>Generate Report</button></p>
      </div>
    </form>
  </div>
  <br>
  <br>
  <div id="head1" class="Div1">
    <h1 id='p3'>Report</h1>
    <div id="generated" class="generatedReport">
      <p class="gen">Topic:</p>
      <p id='text1'></p>
      <p class="gen">[b][size=150]Info[/size][/b]</p>
      <p id='text2'></p>
      <p class="gen">[b][size=150]Summary[/size][/b]</p>
      <p id='text3'></p>
      <p class="gen">[b][size=150]#Room[/size][/b]</p>
      <p id='text4'></p>
      <p class="gen">[b][size=150]PM[/size][/b]</p>
      <p id='text5'></p>
      <p class="gen">[b][size=150]PM[/size][/b]</p>
      <p id='text7'></p>
      <p class="gen">[b][size=150]#Room2[/size][/b]</p>
      <p id='text6'></p>
    </div>
    <button id='cbtn' onclick="copyRedirect()">Copy Report</button>
  </div>
  <br>
  <br>
  <br>
</body>

</html>

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Добавьте следующие строки в нижнюю часть функции check():

$('.gen').each(function() {
    $(this).next('p').addBack().toggle($(this).next('p').text() !== '');
});

Кроме того:

  1. Вы должны подключить обработчики событий в Javascript / jQuery, а не HTML атрибутов. Таким образом, вы избежите необходимости использования функций в глобальном пространстве имен.
  2. В jQuery можно сделать гораздо больше, чтобы упростить код и сделать его более читабельным / обслуживаемым.

Объяснение

$('.gen').each(...) проходит по элементам <p class="gen">...</p> отчета (Topi c, Info et c).

Для каждого из этих элементов выражение $(this).next('p').addBack() создает коллекцию jQuery, содержащую сам элемент и непосредственно следующий за ним элемент <p>...</p>. Затем для этой коллекции вызывается .toggle(). Метод collection.toggle() *1027*

* 10 * * имеет несколько вариантов, в данном случае collection.toggle(display), где display - логическое значение. true вызывает отображение collection, а false приводит к скрытию collection.

Здесь выражение $(this).next('p').text() !== '' возвращает true, если следующий элемент <p>...</p> пуст или false если не пусто.

Таким образом, результатом передачи вычисленного логического значения в .toggle() является отображение / скрытие исходного <p class="gen">...</p> и его следующего элемента <p>...</p>, в зависимости от того, является ли элемент <p>...</p> пустым или не пустым .

Вы могли бы также написать ...

$('.gen').each(function() {
    var gen_and_next_p_element = $(this).next('p').addBack();
    var next_p_text = $(this).next('p').text();
    if(next_p_text !== '') {
        gen_and_next_p_element.show();
    } else {
        gen_and_next_p_element.hide();
    }
});

... что, возможно, легче понять, но также довольно скучно.

0 голосов
/ 11 февраля 2020

Я предлагаю вам изменить свой подход. Вместо того, чтобы показывать и скрывать определенные элементы в вашем отчете, вы могли бы динамически генерировать эти элементы в JavaScript. Тогда вы можете добавлять элементы только после их заполнения, чтобы у вас были только соответствующие данные. Таким образом, вам не нужно искать каждое поле, если оно заполнено, и находить соответствующий абзац в отчете, чтобы показать или скрыть его.

Я также позволил себе продемонстрировать функцию, которая динамически добавляет новые Поля Room и PM, если нажать кнопку. Как и в случае с отчетом, новые поля создаются и добавляются в документ.

Информация из формы собирается с FormData. Этот API делает для вас тяжелую работу и может извлечь каждую пару name-value (читай: каждый элемент textarea с его именем и значением) и сохранить его в объекте. Это сохраняет вашу форму динамической c и позволяет вам добавлять и удалять любые поля input или textarea, которые вы хотите, без необходимости изменять JavaScript. Он просто получает все ваши данные, представленные в форме.

Было несколько других вещей, касающихся вашего HTML. Поля

input, select и textarea могут иметь элемент label. Этот элемент является описательным именем или названием вашего поля. Используйте это для маркировки элементов формы. Атрибуты

id должны быть уникальными. Если в вашем HTML имеется более одного id с одним и тем же значением, чем каждый идентификатор, кроме первого, то это значение недопустимо. Классы больше подходят для присвоения вашим элементам с общими стилями или свойствами идентификатора.

Диапазон заголовков от h1 до h6. Технически вы можете иметь только один h1 на своей странице. Существуют исключения, например, при использовании article, но попробуйте сделать так, чтобы заголовки имели иерархию. Как и у книги, у вас есть заголовок (h1) и главы (h2), а может быть, есть небольшие главы (h3) и т. Д.

И небольшая заметка на JavaScript.

Я предлагаю вам покопаться в петлях. Циклы позволяют вам делать одно и то же время столько раз, сколько вы хотите, записывая его только один раз. Как выбор нескольких элементов и переключение класса для каждого из этих элементов.

for (const textarea of document.querySelectorAll('textarea') {
  textarea.classList.toggle('darkmode');
} 

В приведенном выше примере используется for...of l oop. Который может l oop через каждый повторяемый объект , массивоподобный объект или массивы.

Я понимаю, что вы изучаете, поэтому я имею в виду все в конструктивном манера. Ты прекрасно справляешься. Так держать!

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

Обязательно ознакомьтесь с приведенным ниже примером.

const form = document.querySelector('.js-form');
const pmContainer = document.querySelector('.js-pm-container');
const pmButton = document.querySelector('.js-add-pm');
const report = document.querySelector('.js-report');
const clearButton = document.querySelector('.js-clear-report');
const copyButton = document.querySelector('.js-copy-button');

// Clear the report
function clearReport() {
  while (report.firstElementChild) {
    report.firstElementChild.remove();
  }
}

// Clear report on clear button click.
clearButton.addEventListener('click', clearReport);

// Generate report based on values in the form.
function generateReport(formData) {

  // Create a list.
  const list = document.createElement('ul');

  // Loop over all name - value pairs in the form.
  // Each input has a name and a value associated with it.
  for (const [name, value] of formData) {
  
    // Don't do anything if the value is empty.
    if (value !== '') {

      // Create a list and two paragraphs.
      const listItem = document.createElement('li');
      const namePar = document.createElement('p');
      const valuePar = document.createElement('p');

      // Set the class and textContent.
      listItem.classList.add('gen');
      namePar.textContent = name;
      valuePar.textContent = value;

      // Append paragraphs to the list item
      // and the list item to the list.
      listItem.append(namePar);
      listItem.append(valuePar);
      list.append(listItem);

    }
  }

  // Add the list to the report div.
  report.append(list);
}

// On submit extract the values from the form
// and pass them to the generateReport function.
form.addEventListener('submit', function(event) {

  // Collect the data in formData.
  const formData = new FormData(event.target);
  
  // Clear the report.
  clearReport();
  
  // Generate a report with the given FormData.
  generateReport(formData);
  
  // Prevent form from actually submitting.
  event.preventDefault();
});

// Generate new Room and PM fields and add
// them to the pm-container div.
pmButton.addEventListener('click', function(event) {
  const html = `
    <label>
      <span>#Room</span>
      <textarea name='Room' cols="110" rows="6" value="" placeholder="Logs from #Room (if applicable)"></textarea>
    </label>
    <label>
      <span>PM</span>
      <textarea name='PM' cols="110" rows="6" value="" placeholder="PM Logs (if applicable)"></textarea>
    </label>
   `;
  pmContainer.insertAdjacentHTML('beforeend', html);
});

function copyRedirect() {
  copyClipboard(); // calling function copyClipboard()
  myFunction1(); // calling function myFunction1()
}

function copyClipboard() {

  // for Internet Explorer
  if (document.body.createTextRange) {
    var range = document.body.createTextRange();
    range.moveToElementText(report);
    range.select();
    document.execCommand("Copy");
  }

  // other browsers
  else if (window.getSelection) {

    var selection = window.getSelection();
    var range = document.createRange();
    range.selectNodeContents(report);
    selection.removeAllRanges();
    selection.addRange(range);
    document.execCommand("Copy");

  }
}

copyButton.addEventListener('click', copyClipboard);

function myFunction1() {
  if (confirm("Your report has been copied to your clipboard, would you like to proceed to the forums?")) document.location = 'https://*******';
}
label {
  display: flex;
  flex-direction: column
}
<form name='myform' class="js-form">
  <h2> Report Generator</h2>

  <label>
  <span>Topic</span>
    <textarea name='Topic' cols="110" rows="2" value="" placeholder="Name, Infraction, Action Taken"></textarea>
    </label>

  <label>
  <span>Info</span>
    <textarea name='Info' cols="110" rows="6" value="" placeholder="Chatter Information"></textarea>
    </label>

  <label>
  <span>Summary</span>
    <textarea name='Summary' cols="110" rows="6" value="" placeholder="Report Summary"></textarea>
    </label>

  <div class="js-pm-container">

    <label>
    <span>#Room</span>
    <textarea name='Room' cols="110" rows="6" value="" placeholder="Logs from #Room (if applicable)"></textarea>
    </label>

    <label for="pm">
    <span>PM</span>
    <textarea id="pm" name='PM' cols="110" rows="6" value="" placeholder="PM Logs (if applicable)"></textarea>
    </label>

  </div>

  <button type="button" class="js-add-pm">Add PM</button>
  <button type='submit'>Generate Report</button>
  <button type="button" class="js-clear-report">Clear Report</button>
  
</form>

<div class="report">
  <h2>Generated report</h2>
  <div id="generated" class="generatedReport js-report">


  </div>
</div>

<button class="js-copy-button">Copy Report</button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...