2017-01-16 5 views
2

Мне нужно заказать каждый из элементов в галерее по алфавиту. У каждого элемента будет изображение и название.Как сортировать в алфавитном порядке часть страницы HTML (изображения и текст)

Screenshot of the working code

Код для галереи:

<section id="content"> 
<div class="main"> 
    <div class="container_24"> 
     <div class="padding-1"> 
      <div class="wrapper"> 
       <article class="grid_24"> 
        <h4 class="prev-indent-bot">Piante da interno</h4> 
          <div class="wrapper"> 
           <div class="col-3 spacing-3"> 
            <div class="border"> 
             <a class="lightbox-image" href="images/Interno/Phalaenopsis_big.jpg" data-gal="prettyPhoto[gallery2]"><img src="images/Interno/Phalaenopsis_small.jpg" width="224" height="208" alt=""></a> 
            </div> 
            <div class="bg-title"> 
             <div class="box-padding1"> 
              <h5>Phalaenopsis</h5> 
             </div> 
            </div> 
           </div> 
           <div class="col-3 spacing-3"> 
            <div class="border"> 
             <a class="lightbox-image" href="images/Interno/Capelvenere_big.jpg" data-gal="prettyPhoto[gallery2]"><img src="images/Interno/Capelvenere_small.jpg" width="224" height="208" alt=""></a> 
            </div> 
            <div class="bg-title"> 
             <div class="box-padding1"> 
              <h5>Capelvenere</h5> 
             </div> 
            </div> 
           </div> 
           <div class="col-3 spacing-3"> 
            <div class="border"> 
             <a class="lightbox-image" href="images/Interno/Kalanchoe_big.jpg" data-gal="prettyPhoto[gallery2]"><img src="images/Interno/Kalanchoe_small.jpg" width="224" height="208" alt=""></a> 
            </div> 
            <div class="bg-title"> 
             <div class="box-padding1"> 
              <h5>Kalanchoe</h5> 
             </div> 
            </div> 
           </div> 
           <div class="col-3"> 
            <div class="border"> 
             <a class="lightbox-image" href="images/Interno/Nertera_big.jpg" data-gal="prettyPhoto[gallery2]"><img src="images/Interno/Nertera_small.jpg" width="224" height="208" alt=""></a> 
            </div> 
            <div class="bg-title"> 
             <div class="box-padding1"> 
              <h5>Nertera</h5> 
             </div> 
            </div> 
           </div> 
          </div> 
         </article> 
        </div> 
       </div> 
      </div> 
     </div> 
    </section> 

Есть простое решение с использованием JavaScript или HTML?

P.S. Извините за мой английский.

+0

это не может быть сделано с использованием html, если он не будет статическим ... тогда вы можете просто вырезать и вставлять элементы вокруг, чтобы получить правильный алфавитный вид. Если вы хотите сделать это в javascript, вам нужно будет использовать jQuery, и каждый из div имеет уникальный класс, а затем выполните сортировку. Можете ли вы уточнить, должен ли этот тип быть динамическим или статическим? – lifejuggler

+0

Как генерируется html? Как упоминалось в рассказе Lifejuggler, вы можете просто отредактировать html самостоятельно для статической страницы. Если он создается с использованием кода на стороне сервера, я предлагаю сортировку на сервере. – styfle

+0

Привет, che-код является частичным, потому что у меня есть около 50+ изображений на странице, и если бы я хотел добавить изображение, мне нужно добавить его как html-код, но затем я вижу изображения в последовательности, написанные на коде. Я не хочу создавать php-страницу или файл mysql для создания базы данных. Дайте мне знать, если вы можете мне помочь! Большое спасибо. – Po1s0n

ответ

1

Вот версия, которую я проверил на сайте вы связаны между собой:

var articles = $('article.grid_24'); 
articles.each((art_idx, el)=>{ 
    var art = $(el); 
    var boxes = art.find('.wrapper .col-3'); //Get the boxes that have the image and name 

    boxes.removeClass('spacing-3'); //Trim out this, since we don't know if any given box will have this after resorting 
    boxes.detach(); //Remove the entries without losing their JS attributes 
    boxes.sort((a,b)=>{return ($(b).find('h5').text() < $(a).find('h5').text())?1:-1;}); //Sort by the name in the h5 title 

    var wrappers = art.find('.wrapper'); //Get the rows 
    var wrapper_idx = -1; //At the very first element, this will be incremented to index 0 
    boxes.each((idx, box)=>{ //For each content box 
     if(idx % 4 === 0) wrapper_idx++; //For each fourth content box, move to the next row 
     if((idx+1) % 4) $(box).addClass('spacing-3'); //If it's not the fourth box, give it back this class 
     $(box).appendTo($(wrappers[wrapper_idx])); //Add the content box into the current row 
    }); 
}); 

Edit: Я изменил это, чтобы сохранить различные элементы, упорядоченные только между их соответствующими article родителей.

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

+0

wow это работает, если вставлено после изображений! – Po1s0n

+0

Но есть еще одна страница с большим количеством изображений, и если я копирую один и тот же код в конце изображений, я вижу, что все изображения смешаны (но отлично упорядочены). [link] (http://www.ortoflorpasino.it/Ortaggi.html) – Po1s0n

+0

@ Po1s0n Это не должно быть трудно преодолеть. Вы можете сделать этот процесс для каждой статьи. Я работаю над редактированием своего ответа на аккаунт. –

1

Добавьте следующий после вашего HTML (предполагается, что у вас есть JQuery, который она появляется у вас в новой ссылке):

<script> 
    // Create a sorting function 
    function sortem(a, b){ 
    var aName = a.title.toLowerCase(); 
    var bName = b.title.toLowerCase(); 
    return ((aName < bName) ? -1 : ((aName > bName) ? 1 : 0)); 
    } 

    // Perform content sort 
    function sortContent() { 
    var divArr = $(".wrapper.p4 > .col-3") 
    var content = []; 

    // Clear your content 
    $('.wrapper.p4').remove(); 

    // Put content into an easily managed array 
    divArr.each(function(idx,el){ 
     content.push({ 
     title: $(el).find('h5').text(), 
     html: $(el) 
     }); 
    }); 

    // Call the sorting function 
    content.sort(sortem); 

    // Re-render the content 
    grid = $("<div></div>"); 
    for(var i=0;i<content.length;i++){ 

     if((i+1)%4===0){ 
     h = content[i].html.removeClass('spacing-3'); 
     }else{ 
     h = content[i].html.addClass('spacing-3'); 
     } 

     if(i%4===0){ 
     grid.append("<div class='wrapper p4'></div>"); 
     } 
     grid.find(".wrapper.p4").last().append(h); 
    } 

    $('.wrapper article.grid_24 .box-2').after(grid); 
    } 

    $(document).ready(function(){ 
    sortContent(); 
    }); 
    </script> 

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

SELECT title, image 
FROM product_table 
ORDER BY title ASC 

Это было бы гораздо более эффективным, чем сортировка с JavaScript - особенно с учетом того, что значение, которое вы хотите сортировать глубоко вложенных в HTML.

+0

Привет, извините, но код ничего не делает. – Po1s0n

+0

@ Po1s0n хорошо, что на новой ссылке, которую вы поделили, сильно отличается от фрагмента в исходном вопросе. Вместо того, чтобы иметь только четыре элемента, которые вам нужно отсортировать, у вас есть еще 50 предметов, которые повторяются в разделах, которые вы разместили выше. Я попытаюсь изменить свой ответ в соответствии с предоставленной вами ссылкой, но обратите внимание, что HTML отличается от того, что вы разместили здесь. –

+0

, тогда я удалю только другие изображения из кода. Я пробовал ваш код на странице 4 только изображений, и он не работает. – Po1s0n