2010-01-05 6 views
0

이미지 및 비디오 컨텐츠 ​​(비디오는 longtail flv 플레이어 - 라이센스 버전 5 사용)를 사용하여 AnythingSlider (http://css-tricks.com/anythingslider-jquery-plugin/)를 구현했습니다.longtail player + anythingslider + 이벤트 리스너

문제점 : 사용자가 비디오를 재생할 때 슬라이드 쇼는 이러한 현상이 발생하지 않았 음을 알기 때문에 비디오가 실행되는 동안 슬라이드 쇼가 계속 순환됩니다. 슬라이드 쇼가 실행 중입니다. 사용자는 오디오를들을 수 있지만 비디오는 계속 순환됩니다.

을 내 모습과 롱테일 플레이어가 재생 중일 때 볼 이벤트 리스너를 알아 내기 위해 노력하고있어이 상태 및 신호를 AnythingSlider에 보내야합니다.

다음은 지금까지 내가 가진 것입니다 ... 비디오 플레이어 이벤트 리스너가 작동하고 있습니다 (지금은 이벤트가 들리고 있음을 확신 할 수 있도록 알림이 표시됩니다). 플레이어가 초기화되면서 경고창이 뜨고 .. 비디오의 PLAY 버튼을 누르면 경고창이 뜨고 비디오가 멈추었을 때 경고창이 뜹니다. 하지만 ... 나는 아직 anythingslider에게 신호를 보내기 위해 적절한 문법을 ​​사용하지 못했습니다!

나는 그것이이 될 것이라고 생각 : 아래

$VUslider.startStop(false); 

내가 지금까지 ... 슬라이더를 초기화하는 코드로 시작하는 한 코드입니다. 참고로

function formatText(index, panel) { 
    return index + ""; 
    } 
$(function() { 
$('.VUslider').VUslider({ 
autoPlay: true, 
    delay: 7000, 
    startStopped: false, 
    animationTime: 200, 
    hashTags: true, 
    buildNavigation: false, 
    pauseOnHover: true, 
    navigationFormatter: formatText 
    }); 
}); 

var player = null; 
function playerReadyCallback(obj) { 
player = document.getElementsByName(obj.id)[0]; 
    alert('the videoplayer '+obj['id']+' has been instantiated'); 
    player.addModelListener('STATE',  'stateMonitor'); 
} 
function stateMonitor(obj) { 
    currentState = obj['newstate']; 
if(currentState == 'PLAYING') { 
    alert ('the videoplayer '+obj['id']+' is playing now!'); 
    $VUslider.startStop(false); // Trigger slideshow stop 
    } 
if(obj.newstate == 'COMPLETED') { 
    alert ('the videoplayer '+obj['id']+' has stopped playing now!'); 
    $VUslider.startStop(true); // Trigger slideshow start 
    } 
} 

는 ... 여기 ANYTHING 슬라이더 코드입니다.

(function($){ 

    $.VUslider = function(el, options){ 
     // To avoid scope issues, use 'base' instead of 'this' 
     // to reference this class from internal events and functions. 
     var base = this; 

     // Access to jQuery and DOM versions of element 
     base.$el = $(el); 
     base.el = el; 

     // Set up a few defaults 
     base.currentPage = 1; 
     base.timer = null; 
     base.playing = false; 

     // Add a reverse reference to the DOM object 
     base.$el.data("AnythingSlider", base); 

     base.init = function(){ 
      base.options = $.extend({},$.VUslider.defaults, options); 

      // Cache existing DOM elements for later 
      base.$wrapper = base.$el.find('> div').css('overflow', 'hidden'); 
      base.$slider = base.$wrapper.find('> ul'); 
      base.$items = base.$slider.find('> li'); 
      base.$single = base.$items.filter(':first'); 

      // Build the navigation if needed 
      if(base.options.buildNavigation) base.buildNavigation(); 

      // Get the details 
      base.singleWidth = base.$single.outerWidth(); 
      base.pages = base.$items.length; 

      // Top and tail the list with 'visible' number of items, top has the last section, and tail has the first 
      // This supports the "infinite" scrolling 
      base.$items.filter(':first').before(base.$items.filter(':last').clone().addClass('cloned')); 
      base.$items.filter(':last').after(base.$items.filter(':first').clone().addClass('cloned')); 

      // We just added two items, time to re-cache the list 
      base.$items = base.$slider.find('> li'); // reselect 

      // Setup our forward/backward navigation 
      base.buildNextBackButtons(); 

      // If autoPlay functionality is included, then initialize the settings 
      if(base.options.autoPlay) { 
       base.playing = !base.options.startStopped; // Sets the playing variable to false if startStopped is true 
       base.buildAutoPlay(); 
      }; 

      // If pauseOnHover then add hover effects 
      if(base.options.pauseOnHover) { 
       base.$el.hover(function(){ 
        base.clearTimer(); 
       }, function(){ 
        base.startStop(base.playing); 
       }); 
      } 

      // If a hash can not be used to trigger the plugin, then go to page 1 
      if((base.options.hashTags == true && !base.gotoHash()) || base.options.hashTags == false){ 
       base.setCurrentPage(1); 
      }; 
     }; 

     base.gotoPage = function(page, autoplay){ 
      // When autoplay isn't passed, we stop the timer 
      if(autoplay !== true) autoplay = false; 
      if(!autoplay) base.startStop(false); 

      if(typeof(page) == "undefined" || page == null) { 
       page = 1; 
       base.setCurrentPage(1); 
      }; 

      // Just check for bounds 
      if(page > base.pages + 1) page = base.pages; 
      if(page < 0) page = 1; 

      var dir = page < base.currentPage ? -1 : 1, 
       n = Math.abs(base.currentPage - page), 
       left = base.singleWidth * dir * n; 

      base.$wrapper.filter(':not(:animated)').animate({ 
       scrollLeft : '+=' + left 
      }, base.options.animationTime, base.options.easing, function() { 
       if (page == 0) { 
        base.$wrapper.scrollLeft(base.singleWidth * base.pages); 
        page = base.pages; 
       } else if (page > base.pages) { 
        base.$wrapper.scrollLeft(base.singleWidth); 
        // reset back to start position 
        page = 1; 
       }; 
       base.setCurrentPage(page); 

      }); 
     }; 

     base.setCurrentPage = function(page, move){ 
      // Set visual 
      if(base.options.buildNavigation){ 
       base.$nav.find('.cur').removeClass('cur'); 
       $(base.$navLinks[page - 1]).addClass('cur');  
      }; 

      // Only change left if move does not equal false 
      if(move !== false) base.$wrapper.scrollLeft(base.singleWidth * page); 

      // Update local variable 
      base.currentPage = page; 
     }; 

     base.goForward = function(autoplay){ 
      if(autoplay !== true) autoplay = false; 
      base.gotoPage(base.currentPage + 1, autoplay); 
     }; 

     base.goBack = function(){ 
      base.gotoPage(base.currentPage - 1); 
     }; 

     // This method tries to find a hash that matches panel-X 
     // If found, it tries to find a matching item 
     // If that is found as well, then that item starts visible 
     base.gotoHash = function(){ 
      if(/^#?panel-\d+$/.test(window.location.hash)){ 
       var index = parseInt(window.location.hash.substr(7)); 
       var $item = base.$items.filter(':eq(' + index + ')'); 
       if($item.length != 0){ 
        base.setCurrentPage(index); 
        return true; 
       }; 
      }; 
      return false; // A item wasn't found; 
     }; 

     // Creates the numbered navigation links 
     base.buildNavigation = function(){ 
      base.$nav = $("<div id='thumbNav'></div>").appendTo(base.$el); 
      base.$items.each(function(i,el){ 
       var index = i + 1; 
       var $a = $("<a href='#'></a>"); 

       // If a formatter function is present, use it 
       if(typeof(base.options.navigationFormatter) == "function"){ 
        $a.html(base.options.navigationFormatter(index, $(this))); 
       } else { 
        $a.text(index); 
       } 
       $a.click(function(e){ 
        base.gotoPage(index); 

        if (base.options.hashTags) 
         base.setHash('panel-' + index); 

        e.preventDefault(); 
       }); 
       base.$nav.append($a); 
      }); 
      base.$navLinks = base.$nav.find('> a'); 
     }; 


     // Creates the Forward/Backward buttons 
     base.buildNextBackButtons = function(){ 
      var $forward = $('<a class="arrow forward">></a>'), 
       $back = $('<a class="arrow back"><</a>'); 

      // Bind to the forward and back buttons 
      $back.click(function(e){ 
       base.goBack(); 
       e.preventDefault(); 
      }); 

      $forward.click(function(e){ 
       base.goForward(); 
       e.preventDefault(); 
      }); 

      // Append elements to page 
      base.$wrapper.after($back).after($forward); 
     }; 

     // Creates the Start/Stop button 
     base.buildAutoPlay = function(){ 

      base.$startStop = $("<a href='#' id='start-stop'></a>").html(base.playing ? base.options.stopText : base.options.startText); 
      base.$el.append(base.$startStop);    
      base.$startStop.click(function(e){ 
       base.startStop(!base.playing); 
       e.preventDefault(); 
      }); 

      // Use the same setting, but trigger the start; 
      base.startStop(base.playing); 
     }; 

     // Handles stopping and playing the slideshow 
     // Pass startStop(false) to stop and startStop(true) to play 
     base.startStop = function(playing){ 
      if(playing !== true) playing = false; // Default if not supplied is false 

      // Update variable 
      base.playing = playing; 

      // Toggle playing and text 
      if(base.options.autoPlay) base.$startStop.toggleClass("playing", playing).html(playing ? base.options.stopText : base.options.startText); 

      if(playing){ 
       base.clearTimer(); // Just in case this was triggered twice in a row 
       base.timer = window.setInterval(function(){ 
        base.goForward(true); 
       }, base.options.delay); 
      } else { 
       base.clearTimer(); 
      }; 
     }; 

     base.clearTimer = function(){ 
      // Clear the timer only if it is set 
      if(base.timer) window.clearInterval(base.timer); 
     }; 

     // Taken from AJAXY jquery.history Plugin 
     base.setHash = function (hash) { 
      // Write hash 
      if (typeof window.location.hash !== 'undefined') { 
       if (window.location.hash !== hash) { 
        window.location.hash = hash; 
       }; 
      } else if (location.hash !== hash) { 
       location.hash = hash; 
      }; 

      // Done 
      return hash; 
     }; 
     // <-- End AJAXY code 


     // Trigger the initialization 
     base.init(); 
    }; 


    $.VUslider.defaults = { 
     easing: "swing",    // Anything other than "linear" or "swing" requires the easing plugin 
     autoPlay: true,     // This turns off the entire FUNCTIONALY, not just if it starts running or not 
     startStopped: false,   // If autoPlay is on, this can force it to start stopped 
     delay: 3000,     // How long between slide transitions in AutoPlay mode 
     animationTime: 600,    // How long the slide transition takes 
     hashTags: true,     // Should links change the hashtag in the URL? 
     buildNavigation: true,   // If true, builds and list of anchor links to link to each slide 
     pauseOnHover: true,    // If true, and autoPlay is enabled, the show will pause on hover 
     startText: "Start",    // Start text 
     stopText: "Stop",    // Stop text 
     navigationFormatter: null  // Details at the top of the file on this use (advanced use) 
    }; 


    $.fn.VUslider = function(options){ 
     if(typeof(options) == "object"){ 
      return this.each(function(i){   
       (new $.VUslider(this, options)); 

       // This plugin supports multiple instances, but only one can support hash-tag support 
       // This disables hash-tags on all items but the first one 
       options.hashTags = false; 
      }); 
     } else if (typeof(options) == "number") { 

      return this.each(function(i){ 
       var anySlide = $(this).data('AnythingSlider'); 
       if(anySlide){ 
        anySlide.gotoPage(options); 
       } 
      }); 
     } 
    }; 


})(jQuery); 

답변

0

당신이 동일한 $ ('. VUslider')에 $의 VUslider을 설정하는 VUslider ({..}); ?

예제 코드에서는 그렇지 않습니다.

$VUslider = $('.VUslider').VUslider({ 
    autoPlay: true, 
    delay: 7000, 
    startStopped: false, 
    animationTime: 200, 
    hashTags: true, 
    buildNavigation: false, 
    pauseOnHover: true, 
    navigationFormatter: formatText 
}); 
+0

위의 게시물에 anythingslider javascript를 추가했습니다. – Lacy

+0

코드 예 – PetersenDidIt

+0

으로 나의 대답을 업데이트했습니다. - 함수를 업데이트했지만, 아직 아무 것도 없습니다. 무슨 일이 벌어지고 있는지 정확히 보여주는 베타 페이지가 있습니다. http://silverberry.org/beta/slider-longtail/ – Lacy

0

이 다소 어둠 속에서 자상하다, 그래서 난 내 추론 조금 설명하려고합니다 :

는이 같은 일을해야합니다.

당신이 이미하고있는대로 VUslider 비트를 생성 한 후, 시작이 일을 시도/슬라이더 중지합니다.

$ ('. VUslider') VUslider.startStop (거짓)를;

// this will toggle between starting and stopping but doesn't give control 
// to call start or stop specifically. 
$('#start-stop').click(); 

당신이 ('. VUslider'). VUslider ({...}) $를 호출 , 그것은 아무것도 반환하지 않기 때문에 그 시점 ($ .each (에서 VUslider에는 손잡이가 없습니다. .) 아무것도 반환하지 않습니다. 이렇게하면 스크립트와 startStop 함수에 대한 참조를 얻을 수 있습니다.

HTH

+0

시도해보세요 ... 행운을 빌어 요 ... (고맙게도 일시 중지 버튼이 녹색 재생 버튼으로 바뀌어 슬라이드 쇼가 중단되었는지 쉽게 알 수 있습니다. 불행히도,이 경우 계속해서 놀았습니다.) 스크립트의 절반을 얻으려고 당황한 것은 (이벤트 청취자) 효과가있었습니다. 실제로는 아무것도 할 수 없었습니다! – Lacy

+0

VUslider 코드를 통해 읽는 것이 많을수록 개발자는 내부 메서드 (예 : 사용자로 startStop을 호출 할 수 없음)를 노출하지 않았다고 생각합니다. startStop 함수는 내부 참조 (기본)에 연결되며 외부에 노출되지 않습니다. 원본 스크립트를 수정하는 데 신경 쓰지 않는다면이 함수를 노출하는 코드를 제공 할 수 있습니다. – Carl

+0

@Lacy, 코드 제안을 변경했습니다. 이것을 시도해보고 그것이 효과가 있는지 알려주십시오. 라이브러리로 전화를 시도하는 대신에 라이브러리가 시작/중지 링크에 놓이는 첨부 된 기능을 활용했습니다. – Carl