2010-07-15 5 views
1

Я пытаюсь реализованным этим JQuery бегущей строки в стиле плагин из http://www.makemineatriple.com/2007/10/bbcnewstickerНУЖНА ПОМОЩЬ. Автор отказался исправить этот плагин jQuery!

Как упоминались в комментариях (около мая) есть ошибка, и автор потерял свою волю, чтобы дать исправление ошибки.

Ошибка: В браузерах Mac (Firefox, Opera и Safari, все OSX) - ссылки (href) не работают, пока каждый элемент списка не завершит прокрутку/раскрытие. В основном после загрузки этого плагина все a href перестает работать.

Вот код для плагина (http://plugins.jquery.com/project/BBCnewsTicker):

/* 
News ticker plugin (BBC news style) 
Bryan Gullan,2007-2010 
version 2.2 
updated 2010-04-04 
Documentation at http://www.makemineatriple.com/news-ticker-documentation/ 
Demo at http://www.makemineatriple.com/jquery/?newsTicker 
Use and distrubute freely with this header intact. 
*/ 

(function($) { 

    var name='newsTicker'; 

    function runTicker(settings) { 

     tickerData = $(settings.newsList).data('newsTicker'); 

     if(tickerData.currentItem > tickerData.newsItemCounter){ 
      // if we've looped to beyond the last item in the list, start over 
      tickerData.currentItem = 0; 
     } 
     else if (tickerData.currentItem < 0) { 
      // if we've looped back before the first item, move to the last one 
      tickerData.currentItem = tickerData.newsItemCounter; 
     } 

     if(tickerData.currentPosition == 0) { 
      if(tickerData.newsLinks[tickerData.currentItem].length > 0) { 
       $(tickerData.newsList).empty().append('<li><a href="'+ tickerData.newsLinks[tickerData.currentItem] +'"></a></li>'); 
      } 
      else { 
       $(tickerData.newsList).empty().append('<li></li>'); 
      } 
     } 

     //only start the ticker itself if it's defined as animating: otherwise it's paused or under manual advance 
     if (tickerData.animating) { 

      if(tickerData.currentPosition % 2 == 0) { 
        var placeHolder = tickerData.placeHolder1; 
      } 
      else { 
       var placeHolder = tickerData.placeHolder2; 
      } 

      if(tickerData.currentPosition < tickerData.newsItems[tickerData.currentItem].length) { 
       // we haven't completed ticking out the current item 

       var tickerText = tickerData.newsItems[tickerData.currentItem].substring(0,tickerData.currentPosition); 
       if(tickerData.newsLinks[tickerData.currentItem].length > 0) { 
        $(tickerData.newsList + ' li a').text(tickerText + placeHolder); 
       } 
       else { 
        $(tickerData.newsList + ' li').text(tickerText + placeHolder); 
       } 
       tickerData.currentPosition ++; 
       setTimeout(function(){runTicker(settings); settings = null;},tickerData.tickerRate); 
      } 

      else { 
       // we're on the last letter of the current item 

       if(tickerData.newsLinks[tickerData.currentItem].length > 0) { 
        $(tickerData.newsList + ' li a').text(tickerData.newsItems[tickerData.currentItem]); 
       } 
       else { 
        $(tickerData.newsList + ' li').text(tickerData.newsItems[tickerData.currentItem]); 
       } 

       setTimeout(function(){ 
        if (tickerData.animating) { 
         tickerData.currentPosition = 0; 
         tickerData.currentItem ++; 
         runTicker(settings); settings = null; 
        } 
       },tickerData.loopDelay); 

      } 
     } 

     else {// settings.animating == false 

      // display the full text of the current item 
      var tickerText = tickerData.newsItems[tickerData.currentItem]; 

      if(tickerData.newsLinks[tickerData.currentItem].length > 0) { 
       $(tickerData.newsList + ' li a').text(tickerText); 
      } 
      else { 
       $(tickerData.newsList + ' li').text(tickerText); 
      } 

     } 

    } 


    // Core plugin setup and config 
    jQuery.fn[name] = function(options) { 

     // Add or overwrite options onto defaults 
     var settings = jQuery.extend({}, jQuery.fn.newsTicker.defaults, options); 

     var newsItems = new Array(); 
     var newsLinks = new Array(); 
     var newsItemCounter = 0; 

     // Hide the static list items 
     $(settings.newsList + ' li').hide(); 

     // Store the items and links in arrays for output 
     $(settings.newsList + ' li').each(function(){ 
      if($(this).children('a').length) { 
       newsItems[newsItemCounter] = $(this).children('a').text(); 
       newsLinks[newsItemCounter] = $(this).children('a').attr('href'); 
      } 
      else { 
       newsItems[newsItemCounter] = $(this).text(); 
       newsLinks[newsItemCounter] = ''; 
      } 
      newsItemCounter ++; 
     }); 

     var tickerElement = $(settings.newsList); // for quick reference below 

     tickerElement.data(name, { 
      newsList: settings.newsList, 
      tickerRate: settings.tickerRate, 
      startDelay: settings.startDelay, 
      loopDelay: settings.loopDelay, 
      placeHolder1: settings.placeHolder1, 
      placeHolder2: settings.placeHolder2, 
      controls: settings.controls, 
      ownControls: settings.ownControls, 
      stopOnHover: settings.stopOnHover, 
      newsItems: newsItems, 
      newsLinks: newsLinks, 
      newsItemCounter: newsItemCounter - 1, // -1 because we've incremented even after the last item (above) 
      currentItem: 0, 
      currentPosition: 0, 
      firstRun:1 
     }) 
     .bind({ 
      stop: function(event) { 
       // show remainder of the current item immediately 
       tickerData = tickerElement.data(name); 
       if (tickerData.animating) { // only stop if not already stopped 
        tickerData.animating = false; 
       } 
      }, 
      play: function(event) { 
       // show 1st item with startdelay 
       tickerData = tickerElement.data(name); 
       if (!tickerData.animating) { // if already animating, don't start animating again 
        tickerData.animating = true; 
        setTimeout(function(){runTicker(tickerData); tickerData = null;},tickerData.startDelay); 
       } 
      }, 
      resume: function(event) { 
       // start from next item, with no delay 
       tickerData = tickerElement.data(name); 
       if (!tickerData.animating) { // if already animating, don't start animating again 
        tickerData.animating = true; 
        // set the character position as 0 to ensure on resume we start at the right point 
        tickerData.currentPosition = 0; 
        tickerData.currentItem ++; 
        runTicker(tickerData); // no delay when resuming. 
       } 
      }, 
      next: function(event) { 
       // show whole of next item 
       tickerData = tickerElement.data(name); 
       // stop (which sets as non-animating), and call runticker 
       $(tickerData.newsList).trigger("stop"); 
       // set the character position as 0 to ensure on resume we start at the right point 
       tickerData.currentPosition = 0; 
       tickerData.currentItem ++; 
       runTicker(tickerData); 
      }, 
      previous: function(event) { 
       // show whole of previous item 
       tickerData = tickerElement.data(name); 
       // stop (which sets as non-animating), and call runticker 
       $(tickerData.newsList).trigger("stop"); 
       // set the character position as 0 to ensure on resume we start at the right point 
       tickerData.currentPosition = 0; 
       tickerData.currentItem --; 
       runTicker(tickerData); 
      } 
     });  
     if (settings.stopOnHover) { 
      tickerElement.bind({      
       mouseover: function(event) { 
        tickerData = tickerElement.data(name); 
        if (tickerData.animating) { // stop if not already stopped 
         $(tickerData.newsList).trigger("stop"); 
         if (tickerData.controls) { // ensure that the ticker can be resumed if controls are enabled 
          $('.stop').hide(); 
          $('.resume').show(); 
         } 
        } 
       } 
      }); 
     } 

     tickerData = tickerElement.data(name); 

     // set up control buttons if the option is on 
     if (tickerData.controls || tickerData.ownControls) { 
      if (!tickerData.ownControls) { 
       $('<ul class="ticker-controls"><li class="play"><a href="#play">Play</a></li><li class="resume"><a href="#resume">Resume</a></li><li class="stop"><a href="#stop">Stop</a></li><li class="previous"><a href="#previous">Previous</a></li><li class="next"><a href="#next">Next</a></li></ul>').insertAfter($(tickerData.newsList)); 
      } 
      $('.play').hide(); 
      $('.resume').hide(); 

      $('.play').click(function(event){ 
       $(tickerData.newsList).trigger("play"); 
       $('.play').hide(); 
       $('.resume').hide(); 
       $('.stop').show(); 
       event.preventDefault(); 
      }); 
      $('.resume').click(function(event){ 
       $(tickerData.newsList).trigger("resume"); 
       $('.play').hide(); 
       $('.resume').hide(); 
       $('.stop').show(); 
       event.preventDefault(); 
      }); 
      $('.stop').click(function(event){ 
       $(tickerData.newsList).trigger("stop"); 
       $('.stop').hide(); 
       $('.resume').show(); 
       event.preventDefault(); 
      }); 
      $('.previous').click(function(event){ 
       $(tickerData.newsList).trigger("previous"); 
       $('.stop').hide(); 
       $('.resume').show(); 
       event.preventDefault(); 
      }); 
      $('.next').click(function(event){ 
       $(tickerData.newsList).trigger("next"); 
       $('.stop').hide(); 
       $('.resume').show(); 
       event.preventDefault(); 
      }); 

     }; 

     // tell it to play 
     $(tickerData.newsList).trigger("play"); 
    }; 

    // News ticker defaults 
    jQuery.fn[name].defaults = { 
     newsList: "#news", 
     tickerRate: 80, 
     startDelay: 100, 
     loopDelay: 3000, 
     placeHolder1: " |", 
     placeHolder2: "_", 
     controls: true, 
     ownControls: false, 
     stopOnHover: true 
    } 

})(jQuery); 

Любые решения? Я не программист, поэтому, если кто-то может указать, где его исправлять, это очень ценится!

ОБНОВЛЕНИЕ: кажется только ссылки с? Знак становится отключенным. Пример: http://url.com/blog/index.html?page=2

+0

Вы уже пробовали другие, более новые плагины, такие как vTicker? –

+0

Мне нужен тикер, который читает его из внешнего XML-файла. – Maca

ответ

1

Мне просто попался этот пост. Я все еще поддерживаю тикер, и с июля прошлого года было несколько релизов.

Способ устранения этой проблемы заключается в том, что теперь существует опция «остановить при наведении», которая приостанавливает тикер и завершает (сразу) отображение элемента, когда пользователь на него нависает (в том числе, конечно, Это).

Если это по-прежнему актуально для вас, если у вас все еще есть проблемы с последней версией, стоит прочитать через поток комментариев; пожалуйста, свяжитесь с нами, если у вас все еще есть проблема (если один из комментариев был вашим, и я пропустил его, а потом извините!). «Официальным» способом является публикация отчета об ошибке на сайте плагинов jQuery, который полностью отслеживает любые сообщенные проблемы, но я стараюсь отвечать всем, кто запрашивает поддержку через блог.

+0

спасибо, что вернулись к этому !! Я это проверю. – Maca

0

Если есть какие-либо элементы с идентификатором news в документе, может быть столкновение происходит ... Может ли это быть так? Я бы искал ваш html-документ для любых вхождений id="news" и исправил их, увидев, что передача правильных параметров в плагин может потребовать немного дополнительных исследований.

+0

Я не вижу никаких столкновений с элементами. – Maca

Смежные вопросы