tumblr音频/视频播放器+无限滚动的砌体

时间:2012-04-15 19:52:35

标签: jquery tumblr jquery-masonry infinite-scroll

以下是测试页:http://masonry-test.tumblr.com/

我正在使用jquery Masonry在tumblr上进行无限滚动。一切都很好,除了音频播放器。它们不会加载到第二页并显示此消息[需要Flash 9来收听音频。]。

做了一点研究并找到了解决方案。一个herethis one too)和来自the jsMesh 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();
    });

});

3 个答案:

答案 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)

我注意到了一些事情,这是我建议你尝试的事情:

  1. 要使该脚本起作用,具有“audio”类的元素应该都具有带有帖子ID的“id”属性。 HTML应该是这样的:

    <div class="audio" id={PostID}>{AudioPlayerWhite}</div>
    

    Tumblr会自动使用每个帖子的ID填充{PostID}部分。我认为它对视频的作用方式相同(尚未尝试过视频)。

  2. 至于位置,我是这样做的:

    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()一次,然后每次无限滚动加载其他帖子。