以下是测试页:http://masonry-test.tumblr.com/
我正在使用jquery Masonry在tumblr上进行无限滚动。一切都很好,除了音频播放器。它们不会加载到第二页并显示此消息[需要Flash 9来收听音频。]。
做了一点研究并找到了解决方案。一个here(this one too)和来自the js的Mesh theme成功完成(第35行)。
问题是我不知道在我的代码中在何处以及如何实现它。我试过的一切都不起作用,或者在砖石砌块周围留下了一小块空隙。我的代码:
$(document).ready(function () {
var $container = $('.row');
$container.imagesLoaded(function () {
$container.masonry({
itemSelector: '.post',
columnWidth: 1
});
});
$container.infinitescroll({
navSelector: '#page-nav',
nextSelector: '#page-nav a',
itemSelector: '.post',
loading: {
finishedMsg: "No more entries to load.",
img: "http://static.tumblr.com/7wtblbo/hsDlw78hw/transparent-box.png",
msgText: "Loading..."
},
debug: true,
bufferPx: 5000,
errorCallback: function () {
$('#infscr-loading').animate({
opacity: 0.8
}, 2000).fadeOut('normal');
}
},
function (newElements) {
//tried this but doesn't work
/* repair video players*/
$('.video').each(function(){
var audioID = $(this).attr("id");
var $videoPost = $(this);
$.ajax({
url: '/api/read/json?id=' + audioID,
dataType: 'jsonp',
timeout: 50000,
success: function(data){
$videoPost.append('\x3cdiv class=\x22video_player_label\x22\x3e' + data.posts[0]['video-player'] +'\x3c/div\x3e');
}
}
});
});
/* repair audio players*/
$('.audio').each(function(){
var audioID = $(this).attr("id");
var $audioPost = $(this);
$.ajax({
url: '/api/read/json?id=' + audioID,
dataType: 'jsonp',
timeout: 50000,
success: function(data){
$audioPost.append('\x3cdiv class=\x22audio_player\x22\x3e' + data.posts[0]['audio-player'] +'\x3c/div\x3e');
}
}
});
});
var $newElems = $(newElements).css({
opacity: 0
});
$newElems.imagesLoaded(function () {
$newElems.animate({
opacity: 1
});
$container.masonry('appended', $newElems, true);
});
});
$(window).resize(function () {
$('.row').masonry();
});
});
答案 0 :(得分:3)
默认情况下,API会返回白色音频播放器。 你可以通过使用jQuery方法分别用黑色或白色播放器替换flash播放器来改变它。
.replace("audio_player.swf", "audio_player_black.swf")
或只是改变颜色本身
.replace("color=FFFFFF", "color=EA9D23");
示例:
$('.audio').each(function(){
var audioID = $(this).attr("id");
var $audioPost = $(this);
$.ajax({
url: '/api/read/json?id=' + audioID,
dataType: 'jsonp',
timeout: 50000,
success: function(data){
$audioPost.append('\x3cdiv class=\x22audio_player\x22\x3e' + data.posts[0]['audio-player'].replace("audio_player.swf","audio_player_black.swf") +'\x3c/div\x3e');
}
}
});
我遇到了很多麻烦,希望能帮到别人。我在Change Tumblr audio player color with Javascript找到了上述信息。
答案 1 :(得分:2)
我注意到了一些事情,这是我建议你尝试的事情:
要使该脚本起作用,具有“audio”类的元素应该都具有带有帖子ID的“id”属性。 HTML应该是这样的:
<div class="audio" id={PostID}>{AudioPlayerWhite}</div>
Tumblr会自动使用每个帖子的ID填充{PostID}部分。我认为它对视频的作用方式相同(尚未尝试过视频)。
至于位置,我是这样做的:
function (newElements) {
....
$newElems.imagesLoaded(function () {
....
});
//audio repair goes here!
}
答案 2 :(得分:1)
当我需要在我正在创建的模板中实现相同的功能时,我提出了一个解决方案。
在HTML中,在评论之间添加AudioPlayer Tumblr标记。这是为了防止调用加载的脚本。还要添加一个“已卸载”类,以跟踪我们是否已为此帖添加了音频播放器。
...
{block:AudioPlayer}
<div class="audio-player unloaded">
<!--{AudioPlayerBlack}-->
</div>
{/block:AudioPlayer}
...
如果在加载页面后查看注释代码,您会注意到一个embed标记被传递给其中一个Tumblr javascript函数。由于我们对它进行了评论,因此不会执行。相反,我们想要提取此字符串并用它替换div内容。
创建一个javascript函数来执行此操作。这可以使用常规的javascript来完成,但为了节省时间,我将使用jQuery,因为这是我为我的模板做的:
function loadAudioPosts() {
// For each div with classes "audio-player" and "unloaded"
$(".audio-player.unloaded").each(function() {
// Extract the <embed> element from the commented {AudioPlayer...} tag.
var new_html = $(this).html().substring(
$(this).html().indexOf("<e"), // Start at "<e", for "<embed ..."
$(this).html().indexOf("d>")+2 // End at "d>", for "...</embed>"
);
// Replace the commented HTML with our new HTML
$(this).html(new_html);
// Remove the "unloaded" class, to avoid reprocessing
$(this).removeClass("unloaded");
});
}
在页面加载时调用loadAudioPosts()
一次,然后每次无限滚动加载其他帖子。