2017-02-10 18 views
13

Tôi đang tải trong ajax một phương thức/popin với băng chuyền Bootstrap trong đó mỗi trang trình bày (không phải là hình ảnh như nhiều câu hỏi về tải chậm) từ oEmbed từ các mạng xã hội khác nhau (facebook, instagram, twitter, ...).Nội dung tải trọng của các trang trình bày bên trong băng chuyền (nội dung là oEmbeds/iframe)

Vấn đề là khi tôi bấm vào nút mà laods phương thức, TẤT CẢ nội dung trang trình bày được tải, đó là để nói 15 đến 20 oembeds (mỗi người trong số họ tải nội dung văn bản, hình ảnh và javascript ...).

Tôi muốn thông minh về điều đó và chỉ "tải chậm" bằng cách trượt hoặc thậm chí thông minh hơn 3 trang trình bày theo 3 trang trình bày.

Tôi cũng đang đề cập đến vì lợi ích của thông tin mà tôi đang sử dụng scrollMonitorHubspot Messenger. Nhưng tôi muốn sử dụng các sự kiện trượt Bootstrap để kích hoạt hiện tượng/tải của mỗi trang trình bày hoặc bất kỳ gợi ý nào bạn có.

Tôi đang sử dụng Ruby on Rails như ngôn ngữ back-end

Url của oEmbed lập trình thay đổi khi chúng được inputed từ một quản trị BackOffice và thay đổi theo từng Điều/trang nhưng bạn sẽ tìm thấy bên dưới một ví dụ:

page.html

//button to click to make modal appear 
<a class="btn btn-primary" onclick="loadModal()" id="socialStoryModal"> 
     load modal 
</a> 

tải Modal với Hubspot messenger trong page.js

function loadModal() { 
     var msg; 
     msg = Messenger().post({ 
     message: 'modal.html.erb',/see below the carousel 
     showCloseButton: true, 
     hideAfter: false 
     }); 
    } 

modal.html.erb = Modal với băng chuyền và nhúng xã hội (ở đây có thể lên đến 50 trong số họ)

<div id="embeds-carousel" class="carousel slide" data-ride="carousel" data-interval="false"> 

    <div class="carousel-inner" role="listbox">  

     <div class="item active" id="item1" > 
    <script> 
var url = « https://api.instagram.com/oembed?url=https://www.instagram.com/p/5456544654565/"; 
embed_request = { 
     url: url, 
     dataType: "jsonp", 
     cache: false, 
     success: function (data) { 
     try { 
      var embed_html = data.html; 
      $("div#item1").html(embed_html); 
     } catch (err) { 
      console.log(err); 
     } 
     } 
    }; 
$.ajax(embed_request); 
</script> 
</div> 

    <div class="item" id="item2" > 
    <script> 
var url = "https://publish.twitter.com/oembed?url=https://twitter.com/coca/status/546664465342324"; 

embed_request = { 
     url: url, 
     dataType: "jsonp", 
     cache: false, 
     success: function (data) { 
     try { 
      var embed_html = data.html; 
      $("div#item2").html(embed_html); 
     } catch (err) { 
      console.log(err); 
     } 
     } 
    }; 
$.ajax(embed_request); 
</script> 
</div> 

<div class="item" id="item3" > 
    <script> 
var url = "https://publish.twitter.com/oembed?url=https://twitter.com/muse/status/65353453F"; 

embed_request = { 
     url: url, 
     dataType: "jsonp", 
     cache: false, 
     success: function (data) { 
     try { 
      var embed_html = data.html; 
      $("div#item3").html(embed_html); 
     } catch (err) { 
      console.log(err); 
     } 
     } 
    }; 
$.ajax(embed_request); 
</script> 
</div> 


<div class="item" id="item4" > 
    <script> 
var url = « https://api.instagram.com/oembed?url=https://www.instagram.com/p/cftzezeker5/"; 
embed_request = { 
     url: url, 
     dataType: "jsonp", 
     cache: false, 
     success: function (data) { 
     try { 
      var embed_html = data.html; 
      $("div#item4").html(embed_html); 
     } catch (err) { 
      console.log(err); 
     } 
     } 
    }; 
$.ajax(embed_request); 
</script> 
</div> 

<div class="item" id="item5" > 
    <script> 
var url = « var url = "https://www.facebook.com/plugins/post/oembed.json/?url=https://www.facebook.com/cocacola/posts/fdgyez556Yds"; 
"; 
embed_request = { 
     url: url, 
     dataType: "jsonp", 
     cache: false, 
     success: function (data) { 
     try { 
      var embed_html = data.html; 
      $("div#item5").html(embed_html); 
     } catch (err) { 
      console.log(err); 
     } 
     } 
    }; 
$.ajax(embed_request); 
</script> 
</div> 

and so on… 
</div> 
    <!-- Controls --> 
    <a class="left carousel-control" href="#embeds-carousel" role="button" data-slide="prev"> 
    <i class="fa chevron fa-chevron-left "></i> 
    <span class="sr-only">Previous</span> 
    </a> 
    <a class="right carousel-control" href="#embeds-carousel" role="button" data-slide="next"> 
    <i class="fa chevron fa-chevron-right "></i> 
    <span class="sr-only">Next</span> 
    </a> 


</div> 

Tôi đã nhìn thấy tấn của các thư viện để tải lười biếng hình ảnh và thậm chí đôi khi kịch bản/iframes nhưng tất cả họ cần phải có trực tiếp thêm các lớp nhất định tôi n khối, đó là không giúp đỡ cho tôi như tôi sử dụng oembed ở trên và tôi không có nơi nào để đưa các lớp học lười biếng.

Tôi cần làm cho thiết bị hoạt động với các iframe có đèn lồng này.

Trả lời

7

Để tải chậm các tệp nhúng bạn cần thêm chúng vào mảng thay vì hiển thị chúng trong DOM và một khi tất cả chúng đã được tải (thành công hay không) thì bạn có thể sử dụng mảng đó để chỉ hiển thị trong DOM trang trình bày hiện tại.

Dưới đây là một ví dụ:

var oEmbedUrls = [ 
    'https://api.instagram.com/oembed?url=https://www.instagram.com/p/5456544654565/', 
    'https://publish.twitter.com/oembed?url=https://twitter.com/coca/status/546664465342324', 
    'https://publish.twitter.com/oembed?url=https://twitter.com/muse/status/65353453F', 
    'https://api.instagram.com/oembed?url=https://www.instagram.com/p/cftzezeker5/', 
    'https://www.facebook.com/plugins/post/oembed.json/?url=https://www.facebook.com/cocacola/posts/fdgyez556Yds' 
]; 

var oEmbedsHtml = []; 
var doneCount = 0; 
var currentSlideIndex; 

$.each(oEmbedUrls, function(i, url){ 
    $.ajax({ 
     url: url, 
     dataType: "jsonp", 
     cache: false, 
     success: function (data) { 
     var itemIndex = oEmbedsHtml.length; 
     oEmbedsHtml.push(data.html); 
     $('#embeds-carousel .carousel-inner').append('<div class="item" id="item' + itemIndex + '"></div>'); 
     oEmbedUrlResponded(); 
     }, 
     error: function(){ 
     console.warn('oEmbed URL could not be loaded: ', url); 
     oEmbedUrlResponded(); 
     } 
    } 
}); 

function renderEmbedSlide(index){ 
    currentSlideIndex = index; 
    $('#item' + index).html(oEmbedsHtml[index]); 
} 

function oEmbedUrlResponded(){ 
    doneCount ++; 

    // Check if all the URLs have been loaded (successfully or not) when we can now render the carousel and the first slide as well 
    if(doneCount == urls.length){ 
    renderEmbedSlide(0); // Render the first embed 
    /*** CALL HERE THE CODE TO ACTIVATE THE CAROUSEL COMPONENT ***/ 
    } 
} 

Cuối cùng, you'lll cần thêm một cái móc để thành phần băng chuyền của bạn để renderEmbedSlide(index) được gọi bất cứ khi nào trượt được thay đổi bằng băng chuyền, là chắc chắn rằng các chỉ số (zero dựa trên) của trang trình bày mới được chuyển thành tham số cho hàm.

Bạn cũng có thể cần phải thêm chiều rộng tối thiểu mặc định và chiều cao tối thiểu vào lớp .carousel-inner .item CSS để cho phép thành phần băng chuyền biết kích thước trước đó, vì các trang trình bày (nhúng) sẽ được tải sau đó.

+0

cảm ơn, nó đã hoạt động – Mathieu

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