【问题标题】:tumblr audio/video players + Masonry with infinite scrolltumblr 音频/视频播放器 + 无限滚动的 Masonry
【发布时间】:2012-04-15 19:52:34
【问题描述】:

这是一个测试页面:http://masonry-test.tumblr.com/

我在 tumblr 上使用带有无限滚动的 jquery Masonry。一切都很好,除了音频播放器。它们不会加载到第二页而是显示此消息[需要 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();
    });

});

【问题讨论】:

    标签: jquery tumblr jquery-masonry infinite-scroll


    【解决方案1】:

    默认情况下,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找到了以上信息。

    【讨论】:

      【解决方案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!
        
        }
        

      【讨论】:

      【解决方案3】:

      当我需要在我创建的模板中实现相同的功能时,我想出了一个解决方案。

      在您的 HTML 中,在 cmets 之间包含您的 AudioPlayer Tumblr 标签。这是为了防止调用加载的脚本。还要添加一个“unloaded”类来跟踪我们是否已经为这篇文章加载了音频播放器。

      ...
      {block:AudioPlayer}
          <div class="audio-player unloaded">
              <!--{AudioPlayerBlack}-->
          </div>
      {/block:AudioPlayer}
      ...
      

      如果您在页面加载后查看注释代码,您会注意到一个嵌入标签被传递给 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() 一次,然后每次无限滚动加载其他帖子时。

      【讨论】:

      • 丹尼尔,我正在使用具有最低要求配置的无限滚动.com。我应该在哪里拨打电话?
      • @SanDiago 尝试在 infscr_loadcallback() 内的 switch/case 之后的第 371 行调用函数。这在文件js/front-end/jquery.infinitescroll.dev.js 中。祝你好运!
      • Daniel,我无法让它工作,但感谢您花时间研究代码和帮助 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 2022-08-23
      • 2014-06-06
      • 1970-01-01
      相关资源
      最近更新 更多