Как увеличить значение последнего диапазона, созданного с помощью jQuery? - PullRequest
0 голосов
/ 10 декабря 2018

Я искал много решений, но никогда (пока) не нашел решения.Я хотел бы увеличить значение последнего диапазона, созданного щелчком в созданном теге li, который, конечно, находится внутри неупорядоченного списка.

Вот HTML

<input type="button" id="btn1" value="Add an Item">
<div id="cntn">
  <ul class="tabs">
    <li>Item<span class="listAdd">1</span></li>
    <li>Item <span class="listAdd">2</span></li>
    <li>Item <span class="listAdd">3</span></li>
    <li>Item <span class="listAdd">4</span></li>
    <li>Item <span class="listAdd">5</span></li>
  </ul>
</div>

и iQuery

$(document).on('click','#btn1', function() {
  $("#cntn ul").append('<li>Item <span class="listAdd"></span></li>');
  $('.listAdd').append(Number($('.listAdd').text())+ 1);
});

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

Ответы [ 2 ]

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

Самый простой метод, в зависимости от назначения элементов <span>, состоит в том, чтобы избежать явного присвоения им номеров и вместо этого использовать сгенерированный CSS контент:

// caching a reference to the <button> element:
let button = document.querySelector('#btn1');

// binding the anonymous method of as the 'click' event-handler:
button.addEventListener('click', function() {

  // creating an <li> and a <span> element:
  let li = document.createElement('li'),
      span = document.createElement('span');

  // setting the text of the <li>:
  li.textContent = 'Item ';
  
  // appending the <span> to the <li>:
  li.appendChild(span);

  // adding the 'listAdd' class to the <span>:
  span.classList.add('listAdd');

  // finding the first (if any) 'ul.tabs' element, and appending
  // the <li> (along with its content) to that element:
  document.querySelector('ul.tabs').appendChild(li);
});
ul.tabs {
  counter-reset: spanCount;
}

.tabs li {
  counter-increment: spanCount;
}

li span.listAdd::before {
  content: counter(spanCount);
}
<input type="button" id="btn1" value="Add an Item">
<div id="cntn">
  <ul class="tabs">
    <li>Item <span class="listAdd"></span></li>
    <li>Item <span class="listAdd"></span></li>
    <li>Item <span class="listAdd"></span></li>
    <li>Item <span class="listAdd"></span></li>
    <li>Item <span class="listAdd"></span></li>
  </ul>
</div>

Очевидно, что вышеприведенное также можно переписать, если <span> предназначен только для представления / стиля чисел, чтобы применить сгенерированный контент к<li> элементов вместо:

// caching a reference to the <button> element:
let button = document.querySelector('#btn1');

// binding the anonymous method of as the 'click' event-handler:
button.addEventListener('click', function() {

  // creating an <li> and a <span> element:
  let li = document.createElement('li');

  // setting the text of the <li>:
  li.textContent = 'Item ';

  // finding the first (if any) 'ul.tabs' element, and appending
  // the <li> to that element:
  document.querySelector('ul.tabs').appendChild(li);
});
ul.tabs {
  counter-reset: spanCount;
}

.tabs li {
  counter-increment: spanCount;
}

/* using ::after, instead of ::before, in order to
   correctly place the generated content: */
li::after {
  /* note the addition of an empty space to separate
     the counter from the text: */
  content: ' ' counter(spanCount);
}
<input type="button" id="btn1" value="Add an Item">
<div id="cntn">
  <ul class="tabs">
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
  </ul>
</div>

Контент, сгенерированный CSS, отсутствует в DOM, поэтому, если пользователь должен иметь возможность взаимодействовать со счетчиком / номером (выбор,копирование и т. д.), тогда одна из следующих опций:

// binding the anonymous function as the 'click' event-handler
// of the '#btn1' element:
$('#btn1').on('click', function() {

  // creating an <li> element:
  $('<li>', {
    // setting its text to the supplied string:
    'text': 'Item '

  // appending a new element to the created <li>:
  }).append(

    // creating a <span> element:
    $('<span>', {

      // setting its class:
      'class': 'listAdd',

      // setting the text of the <span> to be equal to
      // the current number of '.listAdd' elements, plus 1:
      'text': $('.listAdd').length + 1
    })

  // appending the created <li> - along with its created child -
  // to the '.tabs' element:
  ).appendTo('.tabs');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="button" id="btn1" value="Add an Item">
<div id="cntn">
  <ul class="tabs">
    <li>Item <span class="listAdd">1</span></li>
    <li>Item <span class="listAdd">2</span></li>
    <li>Item <span class="listAdd">3</span></li>
    <li>Item <span class="listAdd">4</span></li>
    <li>Item <span class="listAdd">5</span></li>
  </ul>
</div>

Вышеприведенное, конечно, можно переписать простым JavaScript:

// finding the first (if any) '#btn1' element:
document.querySelector('#btn1')

  // binding the anonymous function as the event-handler of
  // the 'click' event:
  .addEventListener('click', function() {
  
    // creating an <li> element and a <span> element:
    let li = document.createElement('li'),
        span = document.createElement('span'),
    // finding the first (if any) element matching the CSS Selector:
        list = document.querySelector('.tabs');

    // setting the text content of the <li> element:
    li.textContent = 'Item ';
    // appending the <span> element to the <li> element:
    li.appendChild(span);

    // adding the 'listAdd' class ot the created <span>:
    span.classList.add('listAdd');
    
    // setting the text content of the created <span> to be equal to
    // the current number of 'span.listAdd' elements found within the
    // list element, and adding 1 to that number:
    span.textContent = list.querySelectorAll('span.listAdd').length + 1;

    // appending the created <li> (and children) to the list element:
    list.appendChild(li);
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="button" id="btn1" value="Add an Item">
<div id="cntn">
  <ul class="tabs">
    <li>Item <span class="listAdd">1</span></li>
    <li>Item <span class="listAdd">2</span></li>
    <li>Item <span class="listAdd">3</span></li>
    <li>Item <span class="listAdd">4</span></li>
    <li>Item <span class="listAdd">5</span></li>
  </ul>
</div>
0 голосов
/ 10 декабря 2018

https://jsfiddle.net/k57zecqd/

Вы не определяете, какой элемент добавить тоже, поэтому вы добавляете их всех.Определите .last (), чтобы просто учесть последний элемент этого типа.Оттуда я пошел и получил последнее значение элементов и добавил к нему 1 - ожидая, что оно будет целым числом во всех случаях.

После этого я добавляю последний элемент, значение которого было вычислено ранее.Делать это раньше означает, что я добавляю 1 к NaN, что означает, что я не получаю значения для позиции.Обратите внимание: последняя строка кода не должна быть добавлением, поскольку это скорее всего то, что нужно вставить в элемент, ради завершения кода и стандартов, но это будет работать и поможет вам в этом.

$(document).on('click','#btn1', function(){
var val = parseInt($('.listAdd').last().text())+1;
$("#cntn ul").append('<li>Item <span class="listAdd"></span></li>');
$('.listAdd').last().append(val);
});
...