I am trying to create a news ticker for our site. None of the examples
I've seen have everything I need. I like what Fx.Marquee has to offer,
but I also need the news
1) to come from an XML file
2) should loop, not just stop at the end of the list
3) should pause during a mouseover

Given this list I thought it would be easier to write my own
class....except that I have never written one before. So it's been a
bit aggravating.

I have an AJAX request creating a news DIV from an XML file:

var newsArray = [];
var newsContainer = $('newsContainer');

var getNews = function(){
      newsArray.erase();
      var feedUrl = '//dms/corporate/resources/xml/corpNewsFeed.xml';
      var request = new Request({url:feedUrl, method:'get',
            onSuccess : function(data, xml){
                nodes =
xml.documentElement.getElementsByTagName("newsItem");
                if (nodes.length > 0) {
                    for (i = 0; i < nodes.length; i++) {
                                var newsItem = new Element('div', {
                                        'id' : 'newsItem' + i,
                                        'class' : 'newsItem',
                                        'html' :
nodes[i].getElementsByTagName("value")[0].childNodes[0].nodeValue
                                }).inject(newsContainer);
                    };
                                newsArray = $$('div[class=newsItem]');
                                loopNews(newsArray);
                }else{newsContainer.set('html',"There are no news
items today.");}
            },
            onFailure: function(error){alert("Error: " + error);}
        }).send();
    };

(I would write this using jsfiddle, but the instructions are not clear
about how to upload my XML file which is currently local.) And I tried
to create something that would take each item in that news list and
morph it (can't get them to go across page, just fade in) and also
continue looping them:

var loopNews = function(array){
                for(k = 0; k < 999; k++){
                        newsContainer.erase();
                        for (j = 0; j < array.length; j++) {
                        var morphObject = new Fx.Morph(array[j],
{link:'chain',duration:5000});
                                morphObject.start({
                                        opacity: [0,1]
                                });
                        }
                }
        };

This is my final attempt after many changes. Since I can't get my own
version to work, I was wondering if there was any insight on how I
could extend the Fx.Marquee class afterall to do what I need? This is
a lot to ask I know. But maybe if we can  just start with the first
steps to get my brain rolling...

I figure it's something like:

var fxmq = new Fx.Marquee(newsContainer, {
        duration: 500,
        showEffect: {
                top: [0,0],
                left: [-100, 0],
                opacity: [0,1]
        },
        hideEffect: {
                top: 20
        },
        revertEffect: {
                top: [-30, 0],
                left: [0,0]
        }
});

var getNews2 = function(){
        newsArray.erase();
        var feedUrl = '//dms/corporate/resources/xml/
corpNewsFeed.xml';
        var request = new Request({url:feedUrl, method:'get',
            onSuccess : function(data, xml){
                nodes
=xml.documentElement.getElementsByTagName("newsItem");
                if (nodes.length > 0) {
                    for (i = 0; i < nodes.length; i++) {
                        //this assumes there is no starting message
within the containing DIV because it all comes from an XML file
                        fxmq.announce({
                                message:
nodes[i].getElementsByTagName("value")[0].childNodes[0].nodeValue,
                                delay: 2500,
                                revert: false
                        })
                        ....and somehow chain all these together and
continually loop them
                    };
                }else{newsContainer.set('html',"There are no news
items today.");}
            },
            onFailure: function(error){alert("Error: " + error);}
        }).send();
    };

Reply via email to