2011-09-29 63 views
15

我有一个显示多个(通常是10个)嵌入式视频的页面。这些视频使用youtube的新IFRAME嵌入代码,显然,对于每个IFRAME,加载页面时都会有一个单独的请求。有没有办法延迟加载页面加载后加载视频,所以它们不会减慢页面加载的速度?加载多个嵌入式Youtube视频时,页面加载性能更好吗?

回答

10

那么,我写了一个javascript thingy(叫做“LYTE”),它会为每个具有特定类(“lyte”)和id的div创建一个“虚拟播放器”(看起来&感觉像一个普通的YouTube嵌入)与YouTube的身份证。只有当点击“虚拟”播放器时,才会加载实际的YouTube iframe,这对嵌入YouTube视频的网页的效果确实产生了重要影响。你可以看到它在行动on my blog

LYTE目前并非真正独立使用,只是作为WP-YouTube-Lyte, the WordPress plugin I wrote的一部分,但只需很少的更改,您应该能够从插件中提取所有相关代码。

你基本上必须在你的HTML中创建这样的东西;

<div class="lyte" id="7nuiOe8M6bw" style="width:640px;height:385px;"> 
<script type="text/javascript"><!-- 
var nT='newtube-';var bU='http://static.blog.futtta.be/wp-content/plugins/wp-youtube-lyte/lyte/'; 
var d=document;if(d.addEventListener){d.addEventListener('DOMContentLoaded', insert, false)}else{window.onload=insert} 
function insert(){if(!d.getElementById('lytescr')){lytescr=d.createElement('script');lytescr.async=true;lytescr.id='lytescr';lytescr.src='http://static.blog.futtta.be/wp-content/plugins/wp-youtube-lyte/lyte/lyte-min.js';h=d.getElementsByTagName('script')[0];h.parentNode.insertBefore(lytescr, h)}}; 
--></script></div> 

该块将加载LYTE-min.js,这将填补在div与伪播放器的所有图形元素(图像,播放按钮,控制杆,标题),并且将一个事件监听添加到的div当点击时将触发真正的嵌入式播放器替换div。

你可以找到插件here并看看代码here(wp-youtube-lyte.php创建div,lyte/lyte.js是实际的javascript ... thingy)。

+0

很不错的,虽然这个你必须写与督脉自己的帖子MMY玩家,不是吗?因此,如果您已有数百个包含嵌入式YouTube视频的帖子使用iframe,那么这不是现有帖子的解决方案。 – Tom

+0

事实上,尽管我猜应该可以应用一些javascript-magic来“捕捉”YouTube内联框架并将其替换为dymmy播放器? – futtta

+0

我不知道,但它发生在我身上,我在我的网站上运行我自己的代码,所以当从数据库中读取HTML时,用dummy实现来替换帖子中的youtube iframe并不难。 – Tom

0

自动,要求降低,解决

在WordPress插件形式

这里是一个WordPress插件,您可以手动下载和通过WordPress插件库安装。我今天创建这个只是为了处理这种情况。不需要对内容进行任何更改,只要在任何和所有内联框架上激活,就会自动运行。

https://wordpress.org/plugins/lowermedia-iframes-on-demand/

2

这是一个jsfiddle demo

HTML

<div class="youtube-container"> 
    <div class="youtube-player" data-id="1y6smkh6c-0"></div> 
</div> 

的Javascript

(function() { 
    var v = document.getElementsByClassName("youtube-player"); 
    for (var n = 0; n < v.length; n++) { 
     var p = document.createElement("div"); 
     p.innerHTML = labnolThumb(v[n].dataset.id); 
     p.onclick = labnolIframe; 
     v[n].appendChild(p); 
    } 
})(); 

function labnolThumb(id) { 
    return '<img class="youtube-thumb" src="//i.ytimg.com/vi/' + id + '/hqdefault.jpg"><div class="play-button"></div>'; 
} 

function labnolIframe() { 
    var iframe = document.createElement("iframe"); 
    iframe.setAttribute("src", "//www.youtube.com/embed/" + this.parentNode.dataset.id + "?autoplay=1&autohide=2&border=0&wmode=opaque&enablejsapi=1&controls=0&showinfo=0"); 
    iframe.setAttribute("frameborder", "0"); 
    iframe.setAttribute("id", "youtube-iframe"); 
    this.parentNode.replaceChild(iframe, this); 
} 

CSS

<style> 
.youtube-container { display: block; margin: 20px auto; width: 100%; max-width: 600px; } 
.youtube-player { display: block; width: 100%; /* assuming that the video has a 16:9 ratio */ padding-bottom: 56.25%; overflow: hidden; position: relative; width: 100%; height: 100%; cursor: hand; cursor: pointer; display: block; } 
img.youtube-thumb { bottom: 0; display: block; left: 0; margin: auto; max-width: 100%; width: 100%; position: absolute; right: 0; top: 0; height: auto } 
div.play-button { height: 72px; width: 72px; left: 50%; top: 50%; margin-left: -36px; margin-top: -36px; position: absolute; background: url("http://i.imgur.com/TxzC70f.png") no-repeat; } 
#youtube-iframe { width: 100%; height: 100%; position: absolute; top: 0; left: 0; } 
</style>