#javascript #jquery #css #masonry
#javascript #jquery #css #masonry
Вопрос:
Я пытаюсь перезагрузить свою кладку каждый раз, когда добавляю элемент в свой с помощью ajax-запроса. Однако, похоже, пересчет кладки (я имею в виду отображение каждого блока) никогда не заканчивается.
Каждый видеоблок зависает друг над другом после загрузки, как только я повторно выполняю вручную
$grid = $('#masonry').masonry({ itemSelector: ".video-box", percentPosition: true, });
Кто — нибудь видит причину этого в моем коде ?
Вызываемая функция Ajax (load() вызывается каждый раз при пересечении нижней части страницы и при загрузке первой страницы)
function load(recherche, start=0, limit=20, handlerEndPage) { console.log(start) console.log(limit) //$(document).bind("scroll", handlerEndPage); $("#loader_active").show() let form_data = new FormData(); form_data.append('recherche', recherche); form_data.append('start', start); form_data.append('limit', limit); $.ajax({ url: "http://siteurl.com/ajax/videos.php", contentType: false, dataType: "json", processData: false, cache: false, data: form_data, type: 'POST', success: function (data) { if (data.length != 0){ $grid = $('#masonry').masonry({ itemSelector: ".video-box", percentPosition: true, }); $(data).each(function(index, value) { if (value.id_video != null){ $item = $(showVideo(value, false)); $grid.append($item).masonry('appended', $item); } }) console.log("bind") setTimeout(function(){ $(document).unbind("scroll", handlerEndPage); $(document).bind("scroll", handlerEndPage); }, 300); // Scroll top items const scrollButtons = document.querySelectorAll(".scroll-btn"), searchesWrapper = document.querySelector(".searches-wrapper"); var amount = 0; scrollButtons.forEach((btn, i) =gt; btn.addEventListener("click", () =gt; { let direction = i gt; 0 ? "-" : " "; amount = eval(`${amount} ${direction} ${searchesWrapper.offsetWidth}`); searchesWrapper.style.setProperty("--scroll", amount "px"); if (amount gt;= 0) { scrollButtons[0].disabled = true; } else { scrollButtons[0].disabled = false; } if (Math.abs(amount - searchesWrapper.offsetWidth) gt;= searchesWrapper.scrollWidth) { scrollButtons[1].disabled = true; } else { scrollButtons[1].disabled = false; } })); // Videos // Masonry Layout //$('#masonry').masonry('reloadItems') //$('#masonry').masonry({ // itemSelector: ".video-box", // percentPosition: true, //}); } else { console.log("Aucune video restante.") console.log("unbind") $(document).unbind("scroll", handlerEndPage); } $("#loader_active").hide() // Evénement : Aucune vidéo retournée if ($(".bgVideo").length == 0){ console.log("Aucun resultat trouvé") $("#aucun_resultat").show() } else { console.log("Des résultats ont été trouvés") $("#aucun_resultat").hide() } $grid = $('#masonry').masonry({ itemSelector: ".video-box", percentPosition: true, }); } }) }
Страница перед вызовом ajax
lt;!DOCTYPE htmlgt; lt;html lang="fr" xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://ogp.me/ns/fb#"gt; lt;headgt; lt;titlegt;Tok Toklt;/titlegt; lt;meta charset="UTF-8" /gt; lt;meta http-equiv="X-UA-Compatible" content="IE=edge" /gt; lt;meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=0" /gt; lt;link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc NcPb1dKGj7Sk" crossorigin="anonymous" /gt; lt;link href="http://siteurl.com/css/style.css" rel="stylesheet" /gt; lt;link href="http://siteurl.com/css/style-toktok.css" rel="stylesheet" /gt; lt;link rel="preconnect" href="https://fonts.gstatic.com" /gt; lt;link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@500;600;700amp;display=swap" rel="stylesheet" /gt; lt;link href="https://fonts.googleapis.com/icon?family=Material Icons" rel="stylesheet" /gt; lt;link rel="shortcut icon" href="http://siteurl.com/favicon.ico" type="image/x-icon" /gt; lt;link rel="apple-touch-icon" href="http://siteurl.com/image/grey_grenouille.png" /gt; lt;link rel="icon" href="http://siteurl.com/favicon.ico" type="image/x-icon" /gt; lt;script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"gt;lt;/scriptgt; lt;script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704 h835Lr 6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"gt;lt;/scriptgt; lt;script src="https://kit.fontawesome.com/566683bca0.js" crossorigin="anonymous"gt;lt;/scriptgt; lt;script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"gt;lt;/scriptgt; lt;/headgt; lt;script src="http://siteurl.com/js/showVideo.js"gt;lt;/scriptgt; lt;script src="http://siteurl.com/js/load.js"gt;lt;/scriptgt; lt;bodygt; lt;headergt; lt;div class="wrapper"gt; lt;form class="search-box"gt; lt;input type="search" name="search" id="search" placeholder="Rechercher ..." /gt; lt;button id="search-btn"gt; lt;span id="clear" onclick='$("#search").val("");' class="material-icons"gt;searchlt;/spangt; lt;/buttongt; lt;/formgt; lt;button type="button" id="upload-btn"gt; lt;span class="material-icons"gt;video_calllt;/spangt; lt;spangt;Uploadlt;/spangt; lt;/buttongt; lt;button type="button" id="sign-in-btn"gt; lt;span class="material-icons"gt;account_circlelt;/spangt; lt;spangt;Sign inlt;/spangt; lt;/buttongt; lt;nav id="menu" aria-hidden="true"gt; lt;div class="list"gt; lt;p class="list-title"gt;List 1lt;/pgt; lt;ulgt; lt;ligt;lt;a href="#"gt;Item 1lt;/agt;lt;/ligt; lt;ligt;lt;a href="#"gt;Item 2lt;/agt;lt;/ligt; lt;ligt;lt;a href="#"gt;Item 3lt;/agt;lt;/ligt; lt;ligt;lt;a href="#"gt;Item 4lt;/agt;lt;/ligt; lt;/ulgt; lt;/divgt; lt;div class="list"gt; lt;p class="list-title"gt;List 2lt;/pgt; lt;ulgt; lt;ligt;lt;a href="#"gt;Item 1lt;/agt;lt;/ligt; lt;ligt;lt;a href="#"gt;Item 2lt;/agt;lt;/ligt; lt;ligt;lt;a href="#"gt;Item 3lt;/agt;lt;/ligt; lt;ligt;lt;a href="#"gt;Item 4lt;/agt;lt;/ligt; lt;/ulgt; lt;/divgt; lt;div class="list"gt; lt;p class="list-title"gt;List 3lt;/pgt; lt;ulgt; lt;ligt;lt;a href="#"gt;Item 1lt;/agt;lt;/ligt; lt;ligt;lt;a href="#"gt;Item 2lt;/agt;lt;/ligt; lt;ligt;lt;a href="#"gt;Item 3lt;/agt;lt;/ligt; lt;ligt;lt;a href="#"gt;Item 4lt;/agt;lt;/ligt; lt;/ulgt; lt;/divgt; lt;div class="list"gt; lt;p class="list-title"gt;List 4lt;/pgt; lt;ulgt; lt;ligt;lt;a href="#"gt;Item 1lt;/agt;lt;/ligt; lt;ligt;lt;a href="#"gt;Item 2lt;/agt;lt;/ligt; lt;ligt;lt;a href="#"gt;Item 3lt;/agt;lt;/ligt; lt;ligt;lt;a href="#"gt;Item 4lt;/agt;lt;/ligt; lt;/ulgt; lt;/divgt; lt;/navgt; lt;button type="button" id="menu-btn"gt; lt;span class="material-icons"gt;menult;/spangt; lt;span class="material-icons"gt;closelt;/spangt; lt;/buttongt; lt;/divgt; lt;/headergt; lt;section id="searches"gt; lt;div class="wrapper"gt; lt;div class="searches-top"gt; lt;h1 class="section-title"gt;Trending Searcheslt;/h1gt; lt;div class="scroll-buttons"gt; lt;button type="button" class="scroll-btn" disabledgt; lt;span class="material-icons"gt;chevron_leftlt;/spangt; lt;/buttongt; lt;button type="button" class="scroll-btn"gt; lt;span class="material-icons"gt;chevron_rightlt;/spangt; lt;/buttongt; lt;/divgt; lt;/divgt; lt;div class="searches-container"gt; lt;div class="searches-wrapper"gt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/511.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/510.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/505.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/506.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/507.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/508.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/492.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/493.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/494.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/495.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/496.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/497.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/498.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;a href="#" class="search-box"gt; lt;video src="http://siteurl.com/videos/499.mp4" preload="metadata"gt;lt;/videogt; lt;p class="search-title"gt;Search taglt;/pgt; lt;/agt; lt;/divgt; lt;/divgt; lt;/divgt; lt;/sectiongt; lt;section id="trending"gt; lt;div class="wrapper"gt; lt;h1 class="section-title"gt;Dernières vidéoslt;/h1gt; lt;div id="masonry" class="trending-container"gt;lt;/divgt; lt;/divgt; lt;/sectiongt; lt;/bodygt; lt;script src="http://siteurl.com/js/script.js"gt;lt;/scriptgt; lt;scriptgt; let start = 0; let limit = 30; // Gestion infinite scroll var handlerEndPage = function () { var deviceAgent = navigator.userAgent.toLowerCase(); var agentID = deviceAgent.match(/(iphone|ipod|ipad)/); if ($(window).scrollTop() $(window).height() gt; $(document).height() - 100 || (agentID amp;amp; $(window).scrollTop() $(window).height() 200 gt; $(document).height())) { load($("#search").val(), start, limit, handlerEndPage); start = limit; console.log("Fin de page détectée -gt; Chargement enclenché"); } }; $(document).bind("scroll", handlerEndPage); load("", start, limit, handlerEndPage); start = limit; // Gestion de la barre de recherche let old_search = ""; let search = ""; $("#clear").on("click", function () { setTimeout(function () { $("#videos").empty(); $("#loader_active").show(); search = $("#search").val(); console.log("rechargement"); start = 0; limit = 30; load(search, start, limit, handlerEndPage); start = limit; }, 100); }); $("#search").on("keyup paste", function () { setTimeout(function () { $("#videos").empty(); $("#loader_active").show(); search = $("#search").val(); console.log("rechargement"); start = 0; limit = 30; load(search, start, limit, handlerEndPage); start = limit; }, 100); }); // Gestion des Play/Pause de chaque vidéo $(document).on("click", ".video-box", function () { console.log("ok detected"); if (this.children[0].paused) { console.log(this.children[0]); $(this).children("#video_tag").removeClass("pause"); $(this).children("#video_tag").addClass("play"); let playPromise = this.children[0].play(); if (playPromise !== undefined) { playPromise .then((_) =gt; { // Automatic playback started! // Show playing UI. }) .catch((error) =gt; { // Auto-play was prevented // Show paused UI. }); } } else { this.children[0].pause(); $(this).children("#video_tag").removeClass("play"); $(this).children("#video_tag").addClass("pause"); } }); lt;/scriptgt; lt;/htmlgt;
ShowVideo function:
function showVideo(videoData, autoplay=false) { // VIDEO BOX let videoBox = $("lt;div/gt;", { class: "video-box", id: "append" }); let video = $('lt;video /gt;', { src: "http://siteurl.com/videos/" videoData.lien, preload: "none", controls: false, autoplay: false, poster: "http://siteurl.com/thumbnails/" videoData.id_video ".jpg", id : "video_tag" }); let vidElements = $("lt;div/gt;", { class: "vid-elements" }); // ICONS let stateIcon = $("lt;div/gt;", { class: "state-icon" }); let playArrow = $("lt;span/gt;", { class: "material-icons" }); playArrow = playArrow.html('play_arrow'); let pause = $("lt;span/gt;", { class: "material-icons" }); pause = pause.html('pause'); stateIcon = stateIcon.append(playArrow) stateIcon = stateIcon.append(pause) vidElements = vidElements.append(stateIcon) //lt;div className="bottom-elements"gt; // lt;p className="vid-title"gt;Meme titlelt;/pgt; // lt;button type="button" className="favorite"gt; // lt;span className="material-icons"gt;favoritelt;/spangt; // lt;/buttongt; // lt;/divgt; let bottomElements = $("lt;div/gt;", { class: "bottom-elements" }); let buttonFavorite = $("lt;button/gt;", { class: "favorite", type: "button" }); let memeTitle = $("lt;p/gt;", { class: "vid-title" }); memeTitle = memeTitle.html(videoData.titre) let favorite = $("lt;span/gt;", { class: "material-icons" }); favorite = favorite.html("favorite") buttonFavorite = buttonFavorite.append(favorite) bottomElements = bottomElements.append(memeTitle) bottomElements = bottomElements.append(buttonFavorite) vidElements = vidElements.append(bottomElements) videoBox = videoBox.append(video) videoBox = videoBox.append(vidElements) return videoBox }
Example of result after ajax call (videos are crossing hover each other once I execute: