【发布时间】:2013-02-19 11:16:38
【问题描述】:
昨天我决定改进我的网站加载 YouTube 视频的方式,仅在用户请求时才嵌入它们。有时,一个页面可能包含多达 30 个视频,而这需要很长时间才能加载。
这是我第一次尝试“延迟加载”任何东西的方法,我认为这很值得一问:
我可以做些什么来改进这一点?
我怎样才能让它更优雅一点?
这是否完全忽略了延迟加载的要点?
忽略样式,因为这在这里无关紧要。
其工作方式是首先在包含视频 ID 的页面上放置一个锚点:
<a href="#" data-video="FzRH3iTQPrk" class="youtube-video">
然后后面的 jQuery 循环遍历每个 a.youtube-video 并创建一个以视频缩略图作为背景的透明跨度:
$('a.youtube-video').each(function() {
var videoId = $(this).attr('data-video');
var videoThumbnail = "http://img.youtube.com/vi/" + videoId + "/0.jpg";
var videoBackground = $('<span class="youtube-thumbnail"></span>');
videoBackground.css({
background:"#fff url('"+videoThumbnail+"') no-repeat"
})
...
然后它会修改锚标记的样式(这里这样做是为了防止影响禁用 JavaScript 的浏览器):
$(this).css({
height:315,
width:460,
position:"relative",
display:"block",
textAlign:"center",
color:"#fff",
fontSize:26
});
然后它通过将跨度添加到锚点来完成循环:
$(this).text('Click to load video');
$(this).append(videoBackground);
});
在锚点点击时加载嵌入的 YouTube 视频对象:
$('a.youtube-video').click(function(e) {
e.preventDefault();
var videoId = $(this).attr('data-video');
var videoThumbnail = "http://img.youtube.com/vi/" + videoId + "/0.jpg";
var videoEmbed = $('<object> ... </object>');
...
最后通过将嵌入代码添加到锚的父级并删除锚:
$(this).parent().append(videoEmbed);
$(this).hide();
});
【问题讨论】:
-
您在点击处理程序上使用 videoThumbnail 做什么?我正在做类似的事情,我遇到的一个问题是每个视频发生的重绘数量。你的经历可能会有所不同。另外,考虑在初次点击后自动播放视频,这样用户就不必点击两次。
-
啊,我现在已经删除了。那是因为我最初只是使用小缩略图 - 点击时会扩大图像并用更大的缩略图替换它。
-
你看过 youtube 提供的用于方便嵌入视频的 API,它们有一个 jS api(developers.google.com/youtube/js_api_reference) 和一个 iframe api(developers.google.com/youtube/iframe_api_reference)
-
iFrame 的问题在于它会显示在 iFrame 本身内生成的控制台错误。但是,我不知道这里的 iFrame API 是否相同。不过,我会阅读 JS API,谢谢!
-
很确定您可以删除 href="#" 并仍然触发 onclick。将其取出将阻止您使用实际上不执行任何操作的字符污染 URL 栏中的 URL。如果需要,您可以在 CSS 中更改指针(用于“这是可点击的”指示)。
标签: jquery html lazy-loading embedding deferred