2017-11-22 13 views
14

Tôi đang sử dụng mã sau tôi tìm thấy từ CodePen ... Im khủng khiếp ở JS và tôi đã hy vọng ai đó có thể giúp tôi.Javascript lặp qua các mục và hoán đổi các mục thành HTML

  1. Làm cách nào để làm cho các mục không lặp lại, tại thời điểm này, chúng cuộn vĩnh viễn bằng 20 đến 'trang' trước khi cuộn vô hạn đá vào, điều tôi muốn là nếu có 50 hình ảnh trong mảng, sau đó hiển thị những hình ảnh đó, 20 đến một trang và sau đó dừng lại.
  2. Tôi muốn đặt JS trong một tệp riêng biệt và sau đó sử dụng PHP để lặp qua một số kết quả và xuất hình ảnh, có thể bằng cách nào đó di chuyển div đó là hiển thị hình ảnh ra khỏi hàm javascript không? để tôi có thể đặt chúng trong thực tế trong khối trong html?

Đây là mã tôi có trong phần HTML

<div id="SlideMiddle"> 
    <div id="grid"> 
     <div id="grid-content"></div> 
    </div> 
</div> 

và đây là javascript

<script> 
    var Imgs = [ 
     'https://tympanus.net/Development/GridLoadingEffects/images/1.jpg', 
     'https://tympanus.net/Development/GridLoadingEffects/images/3.jpg', 
     'https://d13yacurqjgara.cloudfront.net/users/64706/screenshots/1167254/attachments/152315/SUGARSKULL-01.png', 
     'https://tympanus.net/Development/GridLoadingEffects/images/8.jpg', 
     'https://tympanus.net/Development/GridLoadingEffects/images/10.png', 
     'https://tympanus.net/Development/GridLoadingEffects/images/14.png', 
     'https://tympanus.net/Development/GridLoadingEffects/images/9.jpg', 
     'https://tympanus.net/Development/GridLoadingEffects/images/13.png', 
     'https://tympanus.net/Development/GridLoadingEffects/images/12.png', 
     'https://tympanus.net/Development/GridLoadingEffects/images/4.jpg', 
     'http://www.thedrum.com/uploads/news/172673/DzrMPF_DeezerPoster_MusicSoundBetterWithYou_03.jpg' 
    ]; 

    $(document).ready(function(){ 
     $grid = $('#grid-content'); 

     $.fn.revealItems = function($items){ 

      var iso = this.data('isotope'); 
      var itemSelector = iso.options.itemSelector; 
      $items.hide(); 
      $(this).append($items); 
      $items.imagesLoaded().progress(function(imgLoad, image){ 
       var $item = $(image.img).parents(itemSelector); 
       $item.show(); 
       iso.appended($item); 
      }); 

      return this; 
     } 
     $grid.isotope({ 
      containerStyle: null, 
      masonry:{ 
       columnWidth: 300, 
       gutter: 15 
      }, 
      itemSelector: '.grid-item', 
      filter : '*', 
      transitionDuration: '0.4s' 
     }); 


     $grid.imagesLoaded().progress(function(){ 
      $grid.isotope(); 
     }) 

     function GenerateItems(){ 
      var items = ''; 
      for(var i=0; i < 20; i++){ 
       items += '<div class="grid-item c'+(i%9)+' wow fadeInUp" ><a href=""><img src="'+Imgs[i%Imgs.length]+'" /></a></div>'; 
      } 
      return $(items); 
     } 

     // SimpleInfiniteScroll 
     function Infinite(e){ 
      if((e.type == 'scroll') || e.type == 'click'){ 
       var doc = document.documentElement; 
       var top = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0); 
       var bottom = top + $(window).height(); 
       var docBottom = $(document).height(); 

       if(bottom + 50 >= docBottom){ 
        $grid.revealItems(GenerateItems()); 
       } 
      } 
     } 

     $grid.revealItems(GenerateItems()); 

     $(window).resize(function(){ 
      var margin=40; 
      var padding=15; 
      var columns=0; 
      var cWidth=300; 
      var windowWidth = $(window).width(); 

      var overflow = false; 
      while(!overflow){ 
       columns++; 
       var WidthTheory = ((cWidth*columns)+((columns+1)*padding)+margin); 
       if(WidthTheory > windowWidth) 
        overflow = true; 
      } 
      if(columns > 1) 
       columns--; 

      var GridWidth = ((cWidth*columns)+((columns+1)*padding)+margin); 

      if(GridWidth != $('#grid').width()){ 
       $('#grid').width(GridWidth); 
      } 
     }); 
     $(window).scroll(Infinite); 
     new WOW().init(); 

    }) 
</script> 

Trả lời

0
  1. Đối với câu hỏi đầu tiên tôi sẽ thay đổi thủ tục GenerateItems

    function GenerateItems(){ 
        var items = ''; 
        var limit = Imgs.length > 20 ? 20 : Imgs.length; 
        for(var i=0; i < limit; i++){ 
         items += '<div class="grid-item c'+(i%9)+' wow fadeInUp" ><a href=""><img src="'+Imgs[i%Imgs.length]+'" /></a></div>'; 
        } 
        return $(items); 
    } 
    

Nhưng bạn có thể cung cấp plunter hoặc Codepen với ví dụ về kiểu dáng không?

  1. Nếu tôi hiểu chính xác bạn cần phải chọn bộ chọn ở đó bạn muốn hình ảnh được tạo?

a) chức năng Sau đó chỉ cần định nghĩa từ tập tin JS:

function infiniteList(selector){ 
    $grid = $(selector); 

..... }

b) đính kèm tập tin JS trong tiêu đề index.html

c) chức năng gọi với bộ chọn cần thiết trong $ (tài liệu) .ready trong phần index.html script (đặt nó trước khi đóng thẻ).

var selector = ...//some calculation to get selector 
$(document).ready(infiniteList(selector)); 
+0

https://codepen.io/anon/pen/WXgvjR đây là codepen tôi đã tạo ... Những gì tôi muốn làm là di chuyển việc tạo div từ bên trong JS, để liệt kê chúng theo cách thủ công trong html, bên trong div nội dung lưới, theo cách đó tôi có thể sử dụng một số phân trang với PHP và cũng có thể thêm các thẻ động. Tôi cũng muốn họ hiển thị theo thứ tự thay vì ngẫu nhiên – BigJobbies

4

hình ảnh lặp lại

Có hai điều góp phần thúc đẩy hành vi lặp đi lặp lại hình ảnh. Đầu tiên, như được chỉ ra trong một câu trả lời khác, bộ đếm vòng lặp được mã hóa cứng đến 20. Vì vậy, nếu bạn chuyển qua năm hình ảnh, mỗi hình ảnh sẽ lặp lại bốn lần. Thay đổi 20 thành độ dài của mảng Imgs sẽ ngăn chặn điều này.

Thứ hai, hàm GenerateItems() luôn trả về kết quả.

nếu có 50 hình ảnh trong mảng, sau đó hiển thị những hình ảnh, từ 20 đến một trang và sau đó dừng

này ngụ ý rằng GenerateItems() sẽ cần phải trả lại một tập rỗng (hoặc không được gọi) sau khi tất cả 50 hình ảnh đã được hiển thị. Một cách tiếp cận ngây thơ có thể liên quan đến một biến đếm trang toàn cục.In this codepen, tôi đã thêm một biến như vậy để hạn chế số trang, như vậy:

var pagesServed = 0; 

$(document).ready(function(){ 
    $grid = $('#grid-content'); 
..... 
function GenerateItems(){ 
    console.log("generating items"); 
    var items = ''; 
    if (++pagesServed > 2) { 
     return items; 
    } 
    for(var i=0; i < Imgs.length; i++){ 
     .... 

Server side render

Trong một trường hợp sử dụng thực tế cuộc sống, có lẽ bạn đang lấy danh sách các liên kết hình ảnh từ máy chủ của bạn, liên kết với phần thứ hai của câu hỏi của bạn.

Bạn có thể dễ dàng hiển thị các div này ở phía máy chủ thay thế. Hàm GenerateItems() sẽ thực hiện cuộc gọi AJAX đến đầu cuối của bạn để lấy các div, thay vì xây dựng chúng trong javascript. Đó mã PHP có thể trông như thế này:

<?php 
require_once __DIR__.'/vendor/autoload.php'; 

session_start(); 

$Imgs = [ 
    'https://tympanus.net/Development/GridLoadingEffects/images/1.jpg', 
    'https://tympanus.net/Development/GridLoadingEffects/images/3.jpg', 
    'https://d13yacurqjgara.cloudfront.net/users/64706/screenshots/1167254/attachments/152315/SUGARSKULL-01.png', 
    'https://tympanus.net/Development/GridLoadingEffects/images/8.jpg', 
    'https://tympanus.net/Development/GridLoadingEffects/images/10.png', 
    'https://tympanus.net/Development/GridLoadingEffects/images/14.png', 
    'https://tympanus.net/Development/GridLoadingEffects/images/9.jpg', 
    'https://tympanus.net/Development/GridLoadingEffects/images/13.png', 
    'https://tympanus.net/Development/GridLoadingEffects/images/12.png', 
    'https://tympanus.net/Development/GridLoadingEffects/images/4.jpg', 
    'http://www.thedrum.com/uploads/news/172673/DzrMPF_DeezerPoster_MusicSoundBetterWithYou_03.jpg' 
]; 

$items = ''; 

for ($i=0; $i < 20; $i++){ 
    $items .= '<div class="grid-item c' . ($i % 9) . ' wow fadeInUp" ><a href=""><img src="' . $Imgs[$i % count($Imgs)] . '" /></a></div>'; 
} 
header('Access-Control-Allow-Origin: *'); 
printf($items); 

Sau đó GenerateItems() sẽ trông gần như thế này:

function GenerateItems(){ 
     console.log("generating items"); 
     var fetched = fetch('http://localhost:8000').then(function(data) { 
      return data.text(); 
     }); 

     return fetched; 
    } 

revealItems được sửa đổi để đối phó với lời hứa:

$.fn.revealItems = function($items){ 
    var self = this; 
    var iso = this.data('isotope'); 
    var itemSelector = iso.options.itemSelector; 
    $items.then(function($fetcheditems) { 
     console.log($fetcheditems); 
     $($fetcheditems).hide(); 
     $(self).append($fetcheditems); 
     $($fetcheditems).imagesLoaded().progress(function(imgLoad, image){ 
      var $item = $(image.img).parents(itemSelector); 
      $item.show(); 
      iso.appended($item); 
     }); 
    }); 
    return this; 
} 

tôi đặt ví dụ hiển thị các div này ở phía máy chủ on GitHub. Tuyên bố từ chối - Đó là một ví dụ tối thiểu - Tôi không bận tâm khi tạo kiểu dáng WOW để hoạt động và hỗ trợ CORS tối thiểu (ví dụ: không có tiêu đề Access-Control-Allow-Credentials được đặt).

Bạn cần triển khai logic bên máy chủ của riêng mình để quyết định hình ảnh nào sẽ trả về trên mỗi cuộc gọi. Ví dụ: bạn có thể sử dụng phiên để theo dõi những phiên bản nào đã được phân phát hoặc bạn có thể chấp nhận tham số chuỗi truy vấn xác định phạm vi hình ảnh được yêu cầu.

+0

https://codepen.io/anon/pen/WXgvjR đây là codepen tôi đã tạo ... Những gì tôi muốn làm là di chuyển việc tạo div từ bên trong JS, để tự liệt kê chúng trong html, bên trong div nội dung lưới, theo cách đó tôi có thể sử dụng một số phân trang với PHP và cũng thêm các thẻ động. Tôi cũng muốn chúng hiển thị theo thứ tự thay vì ngẫu nhiên – BigJobbies

0

Đối với câu hỏi đầu tiên, tôi nghĩ bạn chỉ muốn loại bỏ cuộn vô hạn. Kiểm tra tại đây- https://codepen.io/anon/pen/mqawpy Chỉ cần nhận xét dòng số. 117 cây bút của bạn.

//$(window).scroll(Infinite); 

Và thứ hai, bạn có thể sử dụng thẻ để chèn nội dung HTML tức là "..." của HTML bằng cách sử dụng PHP. kiểm tra tại đây- How to write html code inside <?php ?>

Các vấn đề liên quan