UNPKG

dojox

Version:

Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.

165 lines (148 loc) 4.86 kB
// This module is modified from dojox/mobile/_ScrollableMixin and dojox/mobile/ScrollableView define([ "dojo/_base/declare", "dojo/_base/lang", "dojo/_base/array", "dojo/_base/window", "dojo/dom-class", "dijit/registry", "dojo/dom", "dojo/dom-construct", "dojox/mobile/scrollable"], function(declare, lang, array, win, domClass, registry, dom, domConstruct, Scrollable){ // module: // dojox/mobile/_ScrollableMixin // summary: // Mixin for widgets to have a touch scrolling capability. return declare("dojox.app.widgets._ScrollableMixin", Scrollable, { // summary: // Mixin for widgets to have a touch scrolling capability. // description: // Actual implementation is in dojox/mobile/scrollable.js. // scrollable.js is not a dojo class, but just a collection // of functions. This module makes scrollable.js a dojo class. // scrollableParams: Object // Parameters for dojox/mobile/scrollable.init(). scrollableParams: null, // appBars: Boolean // Enables the search for application-specific bars (header or footer). appBars: true, // allowNestedScrolls: Boolean // e.g. Allow ScrollableView in a SwapView. allowNestedScrolls: true, constructor: function(){ this.scrollableParams = {noResize: true}; // set noResize to true to match the way it was done in app/widgets/scrollable.js }, destroy: function(){ this.cleanup(); this.inherited(arguments); }, startup: function(){ if(this._started){ return; } this.findAppBars(); var node, params = this.scrollableParams; if(this.fixedHeader){ node = dom.byId(this.fixedHeader); if(node.parentNode == this.domNode){ // local footer this.isLocalHeader = true; } params.fixedHeaderHeight = node.offsetHeight; } if(this.fixedFooter){ node = dom.byId(this.fixedFooter); if(node){ if(node.parentNode == this.domNode){ // local footer this.isLocalFooter = true; node.style.bottom = "0px"; } params.fixedFooterHeight = node.offsetHeight; } } this.init(params); this.inherited(arguments); this.reparent(); }, // build scrollable container domNode. This method from dojox/mobile/ScrollableView buildRendering: function(){ this.inherited(arguments); domClass.add(this.domNode, "mblScrollableView"); this.domNode.style.overflow = "hidden"; this.domNode.style.top = "0px"; this.containerNode = domConstruct.create("div", {className:"mblScrollableViewContainer"}, this.domNode); this.containerNode.style.position = "absolute"; this.containerNode.style.top = "0px"; // view bar is relative if(this.scrollDir === "v"){ this.containerNode.style.width = "100%"; } }, // This method from dojox/mobile/ScrollableView reparent: function(){ // summary: // Moves all the children to containerNode. var i, idx, len, c; for(i = 0, idx = 0, len = this.domNode.childNodes.length; i < len; i++){ c = this.domNode.childNodes[idx]; // search for view-specific header or footer // if(c === this.containerNode){ if(c === this.containerNode || this.checkFixedBar(c, true)){ idx++; continue; } this.containerNode.appendChild(this.domNode.removeChild(c)); } }, // This method from dojox/mobile/ScrollableView resize: function(){ // summary: // Calls resize() of each child widget. this.inherited(arguments); // scrollable#resize() will be called array.forEach(this.getChildren(), function(child){ if(child.resize){ child.resize(); } }); }, findAppBars: function(){ // summary: // Search for application-specific header or footer. if(!this.appBars){ return; } var i, len, c; for(i = 0, len = win.body().childNodes.length; i < len; i++){ c = win.body().childNodes[i]; this.checkFixedBar(c, false); } if(this.domNode.parentNode){ for(i = 0, len = this.domNode.parentNode.childNodes.length; i < len; i++){ c = this.domNode.parentNode.childNodes[i]; this.checkFixedBar(c, false); } } this.fixedFooterHeight = this.fixedFooter ? this.fixedFooter.offsetHeight : 0; }, checkFixedBar: function(/*DomNode*/node, /*Boolean*/local){ // summary: // Checks if the given node is a fixed bar or not. if(node.nodeType === 1){ var fixed = node.getAttribute("data-app-constraint") || (registry.byNode(node) && registry.byNode(node)["data-app-constraint"]); /* if(fixed === "top"){ domClass.add(node, "mblFixedHeaderBar"); if(local){ node.style.top = "0px"; this.fixedHeader = node; } return fixed; }else */ if(fixed === "bottom"){ domClass.add(node, "mblFixedBottomBar"); if(local){ this.fixedFooter = node; }else{ this._fixedAppFooter = node; } return fixed; } } return null; } }); });