Почему текст не добавляется? jquery парсит исходную разметку?

164
17 ноября 2020, 06:00

Есть скрипт.

Он добавляет текст из селектов в теги блока Special Price (span curr, span numb). При вводе цифр добавляется новый аналогичный блок. Необходимо добавить точно такой же блок, как и предыдущий. Но текст из тегов <span> (numb, curr) не добавляется.

Я так понимаю, что этот скрипт анализирует только исходную разметку HTML?

online ide

(function() { 
  $(document).ready(function() { 
    //Добавление текста в теги span. Работает верно 
    $('.field.inline.specially > span.curr').text( 
      $('#id_lot_currency > option:selected').eq(0).text() 
    ); 
    $('.field.inline.specially > span.numb').text( 
      $('#id_lot_type > option:selected').eq(0).text() 
    ); 
    $(document).on('change','#id_lot_currency',function () { 
      $('.field.inline.specially span').eq(3).text($('option:selected',this).text()) 
    }) 
    $(document).on('change','#id_lot_type',function () { 
      $('.field.inline.specially span').eq(1).text($('option:selected',this).text()) 
    }); 
  }) 
   
  //Добавление аналогичных блоков. Почему-то не видит текст, добавленный предыдущим кодом. 
  var copy = document.querySelector('.field.inline.specially').cloneNode(true); 
  document.querySelector('html').addEventListener('input', function(e) { 
    if (e.target.classList.contains('event') && e.target.tagName == 'INPUT') { 
      var error = 0; 
      for (var evt of document.querySelectorAll('.field.inline.specially input.event')) { 
        evt.value = evt.value.replace(/[^\d]/, ''); 
        if (!evt.value || +evt.value < 1) error++; 
      } 
      if (!error) { 
        var last = document.querySelectorAll('.field.inline.specially'); 
        last[last.length - 1].insertAdjacentHTML('afterEnd', copy.outerHTML); 
      } 
    } 
  }); 
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<div class="field inline" id="lot_minimum"> 
  <label for="id_lot_minimum" class="subhead">Lot minimum:</label> 
  <input type="number" name="lot_minimum" required id="id_lot_minimum" /> 
  <select name="lot_type" style="width: 100px" class="select2" id="id_lot_type"> 
    <option value="1">kg</option> 
    <option value="2">foot</option> 
  </select> 
</div> 
<div class="field inline" id='lot'> 
  <label for="id_lot_cost" class="subhead">Cost:</label> 
  <input type="number" name="lot_cost" step="0.01" required id="id_lot_cost" /> 
  <select name="lot_currency" style="width: 100px" class="select2" id="id_lot_currency"> 
    <option value="1">usd</option> 
    <option value="3">blg</option> 
    <option value="2">uah</option> 
  </select> 
</div> 
 
<div class="field inline specially"> 
  <label for="specially" class="subhead">Special price</label> 
  <span class="id_specially_price"><input type="text" name="adittional_specially_price" style="width: 165px" class="event" id="" /></span> 
  <span class='numb'></span> 
  <span class="id_specially_number"><input type="text" name="adittional_specially_number" style="width: 100px" class="event" id="" /></span> 
  <span class='curr'></span> 
</div>

То есть, в добавленных блоках нет текста со span curr, span numb (usd, kg, например)

Answer 1

Вы это имеете в виду?

(function() { 
  $(document).ready(function() { 
    //Добавление текста в теги span. Работает верно 
    $('.field.inline.specially > span.curr').text( 
      $('#id_lot_currency > option:selected').eq(0).text() 
    ); 
    $('.field.inline.specially > span.numb').text( 
      $('#id_lot_type > option:selected').eq(0).text() 
    ); 
    $(document).on('change','#id_lot_currency',function () { 
      $('.field.inline.specially span.curr').text($('option:selected',this).text()) 
    }) 
    $(document).on('change','#id_lot_type',function () { 
      $('.field.inline.specially span.numb').text($('option:selected',this).text()) 
    }); 
  }) 
   
  //Добавление аналогичных блоков. Почему-то не видит текст, добавленный предыдущим кодом. 
 
  document.querySelector('html').addEventListener('input', function(e) { 
    var copy = document.querySelector('.field.inline.specially').cloneNode(true); 
    if (e.target.classList.contains('event') && e.target.tagName == 'INPUT') { 
      var error = 0; 
      for (var evt of document.querySelectorAll('.field.inline.specially input.event')) { 
        evt.value = evt.value.replace(/[^\d]/, ''); 
        if (!evt.value || +evt.value < 1) error++; 
      } 
      if (!error) { 
        var last = document.querySelectorAll('.field.inline.specially'); 
        last[last.length - 1].insertAdjacentHTML('afterEnd', copy.outerHTML); 
      } 
    } 
  }); 
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<div class="field inline" id="lot_minimum"> 
  <label for="id_lot_minimum" class="subhead">Lot minimum:</label> 
  <input type="number" name="lot_minimum" required id="id_lot_minimum" /> 
  <select name="lot_type" style="width: 100px" class="select2" id="id_lot_type"> 
    <option value="1">kg</option> 
    <option value="2">foot</option> 
  </select> 
</div> 
<div class="field inline" id='lot'> 
  <label for="id_lot_cost" class="subhead">Cost:</label> 
  <input type="number" name="lot_cost" step="0.01" required id="id_lot_cost" /> 
  <select name="lot_currency" style="width: 100px" class="select2" id="id_lot_currency"> 
    <option value="1">usd</option> 
    <option value="3">blg</option> 
    <option value="2">uah</option> 
  </select> 
</div> 
 
<div class="field inline specially"> 
  <label for="specially" class="subhead">Special price</label> 
  <span class="id_specially_price"><input type="text" name="adittional_specially_price" style="width: 165px" class="event" id="" /></span> 
  <span class='numb'></span> 
  <span class="id_specially_number"><input type="text" name="adittional_specially_number" style="width: 100px" class="event" id="" /></span> 
  <span class='curr'></span> 
</div>

я переместил

var copy = document.querySelector('.field.inline.specially').cloneNode(true);

внутрь слушателя

document.querySelector('html').addEventListener('input', function(e) {

В вашем варианте получается так, что Вы клонировали элемент еще без текста внутри элементов...

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

READ ALSO
Проблема с JS/jQuery и Brackets

Проблема с JS/jQuery и Brackets

Вот такая проблема JS/jQuery

131
Почему ajax запрос завершается с ошибкой?

Почему ajax запрос завершается с ошибкой?

У меня есть REST контроллер, который может удалять/вставлять/редактировать данные из бд, отображаю на jsp странице таблицу с соответствующими...

109
Почему не открывается модальное окно?

Почему не открывается модальное окно?

Сделал модальное окно с помощью jqueryВесь html код располагается на jsp странице, также использую spring-boot, tomcat

133
Поиск в ширину с кратчайшем путем java

Поиск в ширину с кратчайшем путем java

Вопрос по существующей задаче Построение алгоритма, с чего подступиться? @Nero Вопрос такой, чем заменить конструкцию yield return для реализации...

126