2016-10-30 6 views
0

Я пытаюсь выяснить, как решить эту проблему;jQuery каждый цикл удваивает найденные результаты

Вот мой HTML:

<div id="result"> 
    <div class="selectable" data-id="1"> Item 1 </div> 
    <div class="selectable" data-id="2"> Item 2 </div> 
    <div class="selectable" data-id="3"> Item 3 </div> 
    <div class="selectable" data-id="4"> Item 4 </div> 
    <div class="selectable" data-id="5"> Item 5 </div> 
</div> 

<button class="insert">Insert</button> 

<div id="master"></div> 

и здесь JS:

$(document).ready(function() { 
     $("#result").on('click', '.selectable', function() { 
      if ($(this).hasClass('active')) { 
       $(this).removeClass('active'); 
      } else { 
       $(this).addClass('active'); 
      } 
     }); 

     $(".insert").on('click', function() { 
      var html = ''; 
      $("#result .active").each(function() { 
       var id = $(this).data('id'); 
       html += '<div class="rows"> ' + id + ' </div>'; 
      }); 
      $("#master").prepend(html) 
     }); 
    }); 

Выбор и отменив ".selectable" пунктов работает отлично, но по какой-то причине, если два элемента выбран, HTML вставленный в «master» div всегда удваивается, поэтому я получаю 4 элемента вместо двух.

Я думаю, что проблема связана с каждым циклом. Если я делаю что-то вроде console.log($("#result .highlite").length); прямо перед циклом, отображается количество выбранных элементов.

+0

Я побежал фрагмент кода и, кажется, хорошо для меня, если вы хотите, чтобы стек уже «вставленных» пунктов. Однако, если вы хотите полностью заменить уже вставленные элементы, вместо использования '.prepend', попробуйте метод' .html': '$ (« # master »). Html (html)'. Это то, чего вы хотите достичь? –

+0

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

ответ

0

Кажется, вы должны заменить HTML, каждый раз, когда нажата кнопка

Попробуйте изменить»

$("#master").prepend(html) 

Для

$("#master").html(html) 
+0

Нет, на самом деле, у меня уже есть некоторые элементы внутри master div, и я хочу добавить их, а не заменять их. – Alko

+0

создать демоверсию, которая воспроизводит проблему – charlietfl

-1

вы можете попробовать ниже код JQuery:

$(document).ready(function() { 
     $("#result").on('click', '.selectable', function() { 
     $(".selectable").removeClass('active'); 
     $(this).addClass('active');   
     }); 

     $(".insert").on('click', function() { 
      var html = ''; 
      $("#result .active").each(function() { 
       var id = $(this).data('id'); 
       html += '<div class="rows"> ' + id + ' </div>'; 
      }); 
      $("#master").prepend(html) 
     }); 
    }); 

DEMO

Надеюсь, что это решит вашу проблему.

Благодаря

+0

почему отрицательный .. ?? –