/** * 本組件提供了x新聞滾動的功能。 可以根據用戶傳入的滾動速度、滾動距離,等參數,將新聞列表生成到指定的容器上,並讓新聞列表中的新聞進行滾動。 */ Ext.ns("com.trs.ScrollNews"); (function() { //緩沖新產生的對象,以便可以執行銷毀 var cache = {}; /** * * @this {String} container: 滾動新聞將渲染在id為domId的容器中
* @this {String}direction: 新聞滾動方向 * @this {String}speed: 新聞滾動的速度(值越大滾動的越慢) * @this {String}space: 新聞每次滾動的像素(值越大新聞滾動一次移動的距離越大) */ com.trs.ScrollNews = function(cfg) { cache[cfg.container] = this; Ext.apply(this,cfg); this.speed = parseInt(this.speed, 10) || 50; this.space = parseInt(this.space, 10) || 2; this.content = $(this.container).innerHTML; } /** * */ com.trs.ScrollNews.get = function(container){ return cache[container]; } com.trs.ScrollNews.prototype = { /** * 根據傳入的配置信息,將滾動新聞列表渲染在指定的容器內 * */ render : function() { var container = $(this.container); if (!container) { return; } // 產生一個比較長的容器,從而使內部的新聞在一行(或者同一列)顯示,不出現折行 var bigDiv = document.createElement("div"); Element.addClassName(bigDiv,"ScrollNews"+this.direction+"Cls"); bigDiv.style.zoom = 1;// 解決ie6下可能存在的不能正確顯示的bug /* * 創建兩個相同的子div容器,每個div裡面包含了所有的新聞 * 為什麼創建兩個相同的div,是為了解決新聞列表滾動到最尾部的時候再切換 到最初位置時的閃動現象 */ this.div1 = document.createElement("div"); this.div1.innerHTML = this.content; this.div2 = document.createElement("div"); this.div2.innerHTML = this.div1.innerHTML; Element.addClassName(this.div1, "div1Cls"); Element.addClassName(this.div2, "div2Cls"); // 將創建的大的div添加到指定的容器內 bigDiv.appendChild(this.div1); bigDiv.appendChild(this.div2); container.innerHTML = ''; container.appendChild(bigDiv); if(this.direction =="vertical"){ container.style.height = (this.rollingHeight||20)+"px"; } var context = this; container.onmouseover = function() { context.stop(); }; container.onmouseout = function() { context.play(); }; this.play(); }, // private play : function() { var context = this; clearInterval(this.intervalHandler); this.intervalHandler = setInterval(function() { context.scrollNext(); }, this.speed); }, // private stop : function() { clearInterval(this.intervalHandler); }, // private scrollNext : function() { var container = $(this.container); try { if(this.direction == "vertical"){ container.scrollTop += this.space; // 如果第一個新聞列表已經滾到容器外面,說明需要重新初始化第一個新聞列表的位置 if (container.scrollTop > this.div1.scrollHeight) { container.scrollTop = container.scrollTop - this.div1.scrollHeight; } } else{ container.scrollLeft += this.space; // 如果第一個新聞列表已經滾到容器外面,說明需要重新初始化第一個新聞列表的位置 if (container.scrollLeft > this.div1.scrollWidth) { container.scrollLeft = container.scrollLeft - this.div1.scrollWidth; }; } } catch (e) { this.stop(); return; } }, /** * 清除掉滾動新聞綁定的關聯事件 */ destroy : function() { this.stop(); var container = $(this.container); container.onmouseover = null; container.onmouseout = null; delete this.div1; delete this.div2; } }; })();