#javascript #jquery
#javascript #jquery
Вопрос:
У меня есть следующий HTML:
<div class="page">
<div class="somecontent_1">...</div>
<div class="somecontent_2">...</div>
<div class="somecontent_3">...</div>
<div class="somecontent_4">...</div>
</div>
Теперь я хотел бы отделить содержимое отдельной страницей, чтобы оно выглядело примерно так:
<div class="page">
<div class="somecontent">...</div>
<div class="somecontent">...</div>
</div>
<div class="newpage">
<div class="somecontent">...</div>
<div class="somecontent">...</div>
</div>
Функция проверяет высоту каждого класса somecontent
, и если она превышает определенное значение, мне нужно переместить содержимое на новую страницу.
Я предполагаю, что мне нужно будет создать пустой div (newpage), а затем извлечь элементы после превышения высоты и переместить их на пустую newpage и продолжить итерацию таким образом.
Мой вопрос заключается в том, как я мог бы получить все содержимое, которое находится после последнего элемента, достигшего высоты, чтобы я мог переместить его на новую пустую страницу, которую я бы создал. Другие решения приветствуются, если есть лучший способ сделать это!
Код, который я придумал, выглядит следующим образом:
var page = $('.page');
var pageHeight = 0;
$.each(page.find('.somecontent'), function() {
if (pageHeight > 1000) {
page.next('<div class="newpage"></div>');
/* Somehow get all elements to add to the newly created page */
page.next('.newpage').append(<NEXT_ELEMENTS>);
pageHeight = 0;
}
pageHeight = pageHeight $(this).height();
});
Комментарии:
1. Что означает перенос содержимого под ним в виде новой страницы ? «Страница» как в HTML-документе?
2. Извините, страница, на которую я ссылаюсь, — это составленная страница формата А4 для пользователя, а не HTML-документ 🙂 Например, как страница Google doc формата А4.
Ответ №1:
Когда вы дойдете page
до того, что соответствует критерию высоты, используйте .nextAll
функцию, чтобы получить все ее последующие аналоги, а затем используйте .wrapAll
, чтобы обернуть их своим newpage div
.
Вот соответствующая документация nextAll и wrapAll, в ней есть все, что вам нужно для вашего сценария.
Ответ №2:
Смотрите Комментарии в строке ниже.
// Instead of the $.each() utiility function
// Just loop over each content area that needs
// examination
$('.somecontent').each(function(index, item) {
// Check if the height of the item is greater than the target (20px for this example)
if (parseInt(getComputedStyle(item).height,10) > 20) {
// Make a new div after the div that the item is currently in
// if one doesn't already exist
if($(".newpage").length === 0){
$(item.closest(".page")).after('<div class="newpage"></div>');
}
// Move the item into the new div
$(item.closest(".page")).next('.newpage').append(item);
}
});
//console.log(document.body.innerHTML); // shows resulting HTML
div.page {border:1px solid red; }
div.newpage {border:1px solid green; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="page">
<div class="somecontent">This<br>is<br>some<br>content</div>
<div class="somecontent">This is some content</div>
<div class="somecontent">
<ul>
<li>This</li>
<li>is</li>
<li>some</li>
<li>content</li>
</ul>
</div>
<div class="somecontent">Other</div>
</div>