PageRenderTime 49ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/1.4/api/source/base9.html

https://github.com/yiminghe/kissyteam.github.com
HTML | 350 lines | 334 code | 16 blank | 0 comment | 0 complexity | 80012cd02a4175ac8897309bea967c62 MD5 | raw file
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>The source code</title>
  6. <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
  7. <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
  8. <style type="text/css">
  9. .highlight { display: block; background-color: #ddd; }
  10. </style>
  11. <script type="text/javascript">
  12. function highlight() {
  13. document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
  14. }
  15. </script>
  16. </head>
  17. <body onload="prettyPrint(); highlight();">
  18. <pre class="prettyprint lang-js"><span id='global-property-'>/**
  19. </span> * @ignore
  20. * scroll-view control
  21. * @author yiminghe@gmail.com
  22. */
  23. KISSY.add('scroll-view/base', function (S, Node, Anim, Container, Render, undefined) {
  24. var $ = S.all,
  25. isTouchEventSupported = S.Features.isTouchEventSupported(),
  26. KeyCode = Node.KeyCode;
  27. function onElScroll() {
  28. var self = this,
  29. el = self.el,
  30. scrollTop = el.scrollTop,
  31. scrollLeft = el.scrollLeft;
  32. if (scrollTop) {
  33. self.set('scrollTop', scrollTop + self.get('scrollTop'));
  34. }
  35. if (scrollLeft) {
  36. self.set('scrollLeft', scrollLeft + self.get('scrollLeft'));
  37. }
  38. el.scrollTop = el.scrollLeft = 0;
  39. }
  40. function frame(anim, fx) {
  41. anim.scrollView.set(fx.prop, fx.val);
  42. }
  43. <span id='KISSY-ScrollView-Base'> /**
  44. </span> * Make container scrollable.
  45. * module scroll-view will be this class on non-touch device
  46. * @class KISSY.ScrollView.Base
  47. * @extend KISSY.Component.Container
  48. */
  49. return Container.extend({
  50. initializer: function () {
  51. this.scrollAnims = [];
  52. },
  53. bindUI: function () {
  54. var self = this,
  55. $el = self.$el;
  56. $el.on('mousewheel', self.handleMouseWheel, self)
  57. // textarea enter cause el to scroll
  58. // bug: left top scroll does not fire scroll event, because scrollTop is 0!
  59. .on('scroll', onElScroll, self);
  60. },
  61. handleKeyDownInternal: function (e) {
  62. // no need to process disabled (already processed by Component)
  63. var target = e.target,
  64. $target = $(target),
  65. nodeName = $target.nodeName();
  66. // editable element
  67. if (nodeName == 'input' ||
  68. nodeName == 'textarea' ||
  69. nodeName == 'select' ||
  70. $target.hasAttr('contenteditable')) {
  71. return undefined;
  72. }
  73. var self = this,
  74. keyCode = e.keyCode,
  75. scrollStep = self.getScrollStep(),
  76. ok = undefined;
  77. var allowX = self.allowScroll['left'];
  78. var allowY = self.allowScroll['top'];
  79. if (allowY) {
  80. var scrollStepY = scrollStep.top,
  81. clientHeight = self.clientHeight,
  82. scrollTop = self.get('scrollTop');
  83. if (keyCode == KeyCode.DOWN) {
  84. self.scrollToWithBounds({
  85. top: scrollTop + scrollStepY
  86. });
  87. ok = true;
  88. } else if (keyCode == KeyCode.UP) {
  89. self.scrollToWithBounds({top: scrollTop - scrollStepY});
  90. ok = true;
  91. } else if (keyCode == KeyCode.PAGE_DOWN) {
  92. self.scrollToWithBounds({top: scrollTop + clientHeight});
  93. ok = true;
  94. } else if (keyCode == KeyCode.PAGE_UP) {
  95. self.scrollToWithBounds({top: scrollTop - clientHeight});
  96. ok = true;
  97. }
  98. }
  99. if (allowX) {
  100. var scrollStepX = scrollStep.left;
  101. var scrollLeft = self.get('scrollLeft');
  102. if (keyCode == KeyCode.RIGHT) {
  103. self.scrollToWithBounds({left: scrollLeft + scrollStepX});
  104. ok = true;
  105. } else if (keyCode == KeyCode.LEFT) {
  106. self.scrollToWithBounds({left: scrollLeft - scrollStepX});
  107. ok = true;
  108. }
  109. }
  110. return ok;
  111. },
  112. getScrollStep: function () {
  113. var control = this;
  114. if (control.scrollStep) {
  115. return control.scrollStep;
  116. }
  117. var elDoc = $(this.get('el')[0].ownerDocument);
  118. var clientHeight = control.clientHeight;
  119. var clientWidth = control.clientWidth;
  120. return control.scrollStep = {
  121. top: Math.max(clientHeight * clientHeight * 0.7 / elDoc.height(), 20),
  122. left: Math.max(clientWidth * clientWidth * 0.7 / elDoc.width(), 20)
  123. };
  124. },
  125. handleMouseWheel: function (e) {
  126. if (this.get('disabled')) {
  127. return;
  128. }
  129. var max,
  130. min,
  131. self = this,
  132. scrollStep = self.getScrollStep(),
  133. deltaY,
  134. deltaX,
  135. maxScroll = self.maxScroll,
  136. minScroll = self.minScroll;
  137. if ((deltaY = e.deltaY) &amp;&amp; self.allowScroll['top']) {
  138. var scrollTop = self.get('scrollTop');
  139. max = maxScroll.top;
  140. min = minScroll.top;
  141. if (scrollTop &lt;= min &amp;&amp; deltaY &gt; 0 || scrollTop &gt;= max &amp;&amp; deltaY &lt; 0) {
  142. } else {
  143. self.scrollToWithBounds({top: scrollTop - e.deltaY * scrollStep['top']});
  144. e.preventDefault();
  145. }
  146. }
  147. if ((deltaX = e.deltaX) &amp;&amp; self.allowScroll['left']) {
  148. var scrollLeft = self.get('scrollLeft');
  149. max = maxScroll.left;
  150. min = minScroll.left;
  151. if (scrollLeft &lt;= min &amp;&amp; deltaX &gt; 0 || scrollLeft &gt;= max &amp;&amp; deltaX &lt; 0) {
  152. } else {
  153. self.scrollToWithBounds({left: scrollLeft - e.deltaX * scrollStep['left']});
  154. e.preventDefault();
  155. }
  156. }
  157. },
  158. 'isAxisEnabled': function (axis) {
  159. return this.allowScroll[axis == 'x' ? 'left' : 'top'];
  160. },
  161. stopAnimation: function () {
  162. var self = this;
  163. if (self.scrollAnims.length) {
  164. S.each(self.scrollAnims, function (scrollAnim) {
  165. scrollAnim.stop();
  166. });
  167. self.scrollAnims = [];
  168. }
  169. self.scrollToWithBounds({
  170. left: self.get('scrollLeft'),
  171. top: self.get('scrollTop')
  172. });
  173. },
  174. '_uiSetPageIndex': function (v) {
  175. this.scrollToPage(v);
  176. },
  177. _getPageIndexFromXY: function (v, allowX, direction) {
  178. var pagesOffset = this.pagesOffset.concat([]);
  179. var p2 = allowX ? 'left' : 'top';
  180. var i, offset;
  181. pagesOffset.sort(function (e1, e2) {
  182. return e1[p2] - e2[p2];
  183. });
  184. if (direction &gt; 0) {
  185. for (i = 0; i &lt; pagesOffset.length; i++) {
  186. offset = pagesOffset[i];
  187. if (offset[p2] &gt;= v) {
  188. return offset.index;
  189. }
  190. }
  191. } else {
  192. for (i = pagesOffset.length - 1; i &gt;= 0; i--) {
  193. offset = pagesOffset[i];
  194. if (offset[p2] &lt;= v) {
  195. return offset.index;
  196. }
  197. }
  198. }
  199. return undefined;
  200. },
  201. scrollToPage: function (index, animCfg) {
  202. var self = this,
  203. pageOffset;
  204. if ((pageOffset = self.pagesOffset) &amp;&amp; pageOffset[index]) {
  205. self.set('pageIndex', index);
  206. self.scrollTo(pageOffset[index], animCfg);
  207. }
  208. },
  209. scrollToWithBounds: function (cfg, anim) {
  210. var self = this;
  211. var maxScroll = self.maxScroll;
  212. var minScroll = self.minScroll;
  213. if (cfg.left) {
  214. cfg.left = Math.min(Math.max(cfg.left, minScroll.left), maxScroll.left);
  215. }
  216. if (cfg.top) {
  217. cfg.top = Math.min(Math.max(cfg.top, minScroll.top), maxScroll.top);
  218. }
  219. self.scrollTo(cfg, anim);
  220. },
  221. scrollTo: function (cfg, animCfg) {
  222. var self = this,
  223. left = cfg.left,
  224. top = cfg.top;
  225. if (animCfg) {
  226. var scrollLeft = self.get('scrollLeft'),
  227. scrollTop = self.get('scrollTop'),
  228. node = {},
  229. to = {};
  230. if (left !== undefined) {
  231. to.scrollLeft = left;
  232. node.scrollLeft = self.get('scrollLeft');
  233. }
  234. if (top !== undefined) {
  235. to.scrollTop = top;
  236. node.scrollTop = self.get('scrollTop');
  237. }
  238. animCfg.frame = frame;
  239. animCfg.node = node;
  240. animCfg.to = to;
  241. var anim;
  242. self.scrollAnims.push(anim = new Anim(animCfg));
  243. anim.scrollView = self;
  244. anim.run();
  245. } else {
  246. if (left !== undefined) {
  247. self.set('scrollLeft', left);
  248. }
  249. if (top !== undefined) {
  250. self.set('scrollTop', top);
  251. }
  252. }
  253. }
  254. }, {
  255. ATTRS: {
  256. <span id='KISSY-ScrollView-Base-property-contentEl'> /**
  257. </span> * content element of scroll view component
  258. * @property contentEl
  259. * @type {KISSY.NodeList}
  260. */
  261. <span id='global-property-contentEl'> /**
  262. </span> * @ignore
  263. */
  264. contentEl: {
  265. },
  266. <span id='KISSY-ScrollView-Base-property-scrollLeft'> /**
  267. </span> * scrollLeft of scroll view
  268. * @property scrollLeft
  269. * @type {Number}
  270. */
  271. <span id='global-property-scrollLeft'> /**
  272. </span> * @ignore
  273. */
  274. scrollLeft: {
  275. view: 1,
  276. value: 0
  277. },
  278. <span id='KISSY-ScrollView-Base-property-scrollTop'> /**
  279. </span> * scrollTop of scroll view
  280. * @property scrollTop
  281. * @type {Number}
  282. */
  283. <span id='global-property-scrollTop'> /**
  284. </span> * @ignore
  285. */
  286. scrollTop: {
  287. view: 1,
  288. value: 0
  289. },
  290. focusable: {
  291. // need process keydown
  292. value: !isTouchEventSupported
  293. },
  294. allowTextSelection: {
  295. value: true
  296. },
  297. handleMouseEvents: {
  298. value: false
  299. },
  300. <span id='KISSY-ScrollView-Base-cfg-snap'> /**
  301. </span> * whether to allow snap effect
  302. * @cfg {Boolean} snap
  303. */
  304. <span id='global-property-snap'> /**
  305. </span> * @ignore
  306. */
  307. snap: {
  308. value: false
  309. },
  310. <span id='KISSY-ScrollView-Base-property-pageIndex'> /**
  311. </span> * pageIndex, current pageIndex if allow snap
  312. * @property pageIndex
  313. * @type {Number}
  314. */
  315. <span id='global-property-pageIndex'> /**
  316. </span> * @ignore
  317. */
  318. pageIndex: {
  319. value: 0
  320. },
  321. xrender: {
  322. value: Render
  323. }
  324. },
  325. xclass: 'scroll-view'
  326. });
  327. }, {
  328. requires: ['node',
  329. 'anim',
  330. 'component/container',
  331. './base/render']
  332. });</pre>
  333. </body>
  334. </html>