Элементы упаковки Jquery

У меня есть некоторый вывод HTML, который мне нужно обернуть новым div (.container). Иногда за span.diary-film-name будут следовать некоторые ссылки a.film-tickets-link. Если ссылки есть, я хочу, чтобы они тоже были завернуты в div .container.

Позвольте мне уточнить, я не могу изменить вывод HTML, отсюда и такой подход.

Я могу обернуть span.diary-film-name, используя строку ниже, но я не уверен в переносе следующих ссылок, если они есть?

$( ".diary-film-name" ).wrap( "<div class='container'></div>" );

Вот что у меня есть:

<span class = "diary-film-name">
    <a href = "#">Toy Story 1</a>
</span>
<a class = "film-tickets-link" href = "#">5.20pm</a>
<a class = "film-tickets-link" href = "#">7.40pm</a>

<span class = "diary-film-name">
    <a href = "#">Toy Story 2</a>
</span>

Это то, что я хочу отобразить с помощью нового div .container:

<div class = "container">
    <span class = "diary-film-name">
        <a href = "#">Toy Story 1</a>
    </span>
    <a class = "film-tickets-link" href = "#">5.20pm</a>
    <a class = "film-tickets-link" href = "#">7.40pm</a>
</div>

<div class = "container">
    <span class = "diary-film-name">
        <a href = "#">Toy Story 2</a>
    </span>
</div>

Я делаю это, чтобы удалить контейнер, если внутри нет ссылок .film-ticket-links, т.е.

$('.container').not(':has(.film-tickets-link)').remove();

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

$('.my-page br').each(function(){
 $(this).nextUntil('.my-page br').wrapAll(document.createElement('div'));
});

Мне удалось решить это...

$(".diary-film-name").each(function(){
$(this).nextUntil(".diary-film-name").andSelf().wrapAll('<div class = "container">  </div>')
})

Ты уже не можешь завернуть? <div class = "filmContainer"><span class = "diary-film-name"> <a href = "#">Toy Story 1</a> </span> <a class = "film-tickets-link" href = "#">5.20pm</a> <a class = "film-tickets-link" href = "#">7.40pm</a></div> тогда вы можете скрыть все и использовать $("div.filmContainer").has(".film-tickets-link").show()

mplungjan 01.07.2019 10:49

Нет, потому что ссылка .film-tickets-tickets не содержится. Я не могу отобразить контейнер div из источника, поэтому мне нужно сделать это с помощью JQuery.

ultrarun 01.07.2019 10:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

РЕДАКТИРОВАТЬ Редактируется с каждым()

Поскольку вы сказали, что HTML нельзя редактировать, я добавлю чистое решение jquery: Во-первых, сделайте это, как вы делали, это создаст эту структуру:

  <div class = "container">
     <span class = "diary-film-name">
         <a href = "#">Toy Story 1</a>
     </span>
  </div>
  <a class = "film-tickets-link" href = "#">5.20pm</a>
  <a class = "film-tickets-link" href = "#">7.40pm</a>

Итак, мы оборачиваем контейнер, затем выбираем все элементы того же уровня, что и класс .film-tickets-link, затем добавляем их в конец контейнера:

 var containers = $( ".diary-film-name" ).wrap( "<div class='container'></div>" ).parent();
 containers.each(function(index, element){

  const links = $(this).nextUntil('.container');
  links.appendTo(element);

})

Проблема здесь в классе контейнера, он должен быть уникальным (если нет, он не будет работать, вы можете использовать идентификатор или какое-либо поле данных, которое заполняется из API с уникальным идентификатором) Я не "компилировал" его, так что, возможно, есть какие-то синтаксические ошибки, но с логикой все в порядке.

СТАРЫЙ

Если вы используете контейнер span

.diary-film-name

Если ссылки существуют, и вы оборачиваете их ими, ссылки ниже будут вне контейнера, мой совет, измените структуру HTML, добавьте диапазон в верхней части .diary-film-name, который будет обертывать как имя файла, так и заполнить ссылки

<div class = "container">
 <span class = "content-container">
    <span class = "diary-film-name">
        <a href = "#">Toy Story 1</a>
    </span>
    <a class = "film-tickets-link" href = "#">5.20pm</a>
    <a class = "film-tickets-link" href = "#">7.40pm</a>
 </span>
</div>

Тогда вместо

$( ".diary-film-name" ).wrap( "<div class='container'></div>" );

Делать:

$( ".content-container" ).wrap( "<div class='container'></div>" );

У меня проблемы с изменением HTML из-за системы, которую мы используем, поэтому этот подход... Мне нужно сделать какую-то проверку, т.е. начать новую обертку div перед диапазоном, проверить, есть ли ссылки ниже до следующего диапазона, а затем закрыть div после этих перегибов.

ultrarun 01.07.2019 10:50

@ultrarun, вы можете сделать то, что делаете, а затем повторить ссылки ниже, и если они существуют, переместите их внутрь контейнера, я напишу код через несколько минут, проверю его.

Josep Vidal 01.07.2019 11:29

Спасибо, но он закрывает контейнер перед ссылками jsfiddle.net/kdrysdale/6yvgutkL/1

ultrarun 01.07.2019 11:53

@ultrarun исправил это, проверьте сейчас :)

Josep Vidal 01.07.2019 11:58

Это здорово, спасибо, но если я добавлю больше диапазонов, он добавит все ссылки к диапазонам, посмотрите, что я имею в виду здесь: jsfiddle.net/kdrysdale/6yvgutkL/4 Есть ли способ ограничить добавление только ссылок непосредственно под каждым диапазоном в новый контейнер

ultrarun 01.07.2019 12:17

Кажется, div не закрывается?

ultrarun 01.07.2019 12:31

С уважением container: у вас может быть больше контейнеров, но вы не можете вкладывать их в соответствии с документацией по начальной загрузке. Итак, ваша структура html в порядке.

Более того, ваш исходный код подходит для достижения желаемых результатов, но если вы хотите иметь только один container и не можете изменить рендеринг структуры html сзади, вы можете сделать это напрямую через Jquery.

Мне удалось решить это...

$(".diary-film-name").each(function(){
$(this).nextUntil(".diary-film-name").andSelf().wrapAll('<div class = "container">  </div>')
})

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

Josep Vidal 01.07.2019 12:52

Другие вопросы по теме