|
50 | 50 | }
|
51 | 51 |
|
52 | 52 | function dispatchEvent($dom, name, data) {
|
| 53 | + if (!$dom || typeof $dom.dispatchEvent !== 'function') { |
| 54 | + data = name; |
| 55 | + name = $dom; |
| 56 | + $dom = null; |
| 57 | + } |
53 | 58 | var event = document.createEvent('Event');
|
54 | 59 | event.initEvent('ppt' + name, true, true);
|
55 | 60 | event.stopped = false;
|
|
65 | 70 | }
|
66 | 71 | }
|
67 | 72 | }
|
68 |
| - $dom.dispatchEvent(event); |
| 73 | + $dom && $dom.dispatchEvent && $dom.dispatchEvent(event); |
69 | 74 | return event;
|
70 | 75 | }
|
71 | 76 | //设置底部进度条
|
|
131 | 136 | if (slideInTimer) {
|
132 | 137 | clearTimeout(slideInTimer);
|
133 | 138 | }
|
134 |
| - slideInTimer = setTimeout(slideInCallBack_, 1500); |
| 139 | + //休息休息一下~ |
| 140 | + slideInTimer = setTimeout(slideInCallBack_, 800); |
| 141 | + } |
| 142 | + |
| 143 | + function getCallbackFuncFromName(cbNames) { |
| 144 | + if (!cbNames) { |
| 145 | + return cbNames; |
| 146 | + } |
| 147 | + cbNames = cbNames.split('.'); |
| 148 | + var cb = window; |
| 149 | + for (var i = 0, len = cbNames.length; i < len; i++) { |
| 150 | + var type = typeof cb[cbNames[i]]; |
| 151 | + if (type === 'object' || type === 'function') { |
| 152 | + cb = cb[cbNames[i]]; |
| 153 | + } else { |
| 154 | + break; |
| 155 | + } |
| 156 | + } |
| 157 | + if (typeof cb === 'function') { |
| 158 | + return cb; |
| 159 | + } |
| 160 | + return null; |
135 | 161 | }
|
136 | 162 |
|
137 | 163 | function slideInCallBack_() {
|
|
140 | 166 | return;
|
141 | 167 | }
|
142 | 168 | var dataset = $cur.dataset;
|
143 |
| - var cb = dataset.incallback || dataset.onEnter; |
| 169 | + var cbNames = dataset.incallback || dataset.onEnter; |
| 170 | + var cb = getCallbackFuncFromName(cbNames); |
| 171 | + var event = dispatchEvent('Enter', { |
| 172 | + container: $cur |
| 173 | + }); |
144 | 174 | //如果有data-incallback那么就执行callback
|
145 |
| - cb && typeof $win[cb] === 'function' && proxyFn(cb); |
| 175 | + cb && typeof cb === 'function' && proxyFn(cbNames, event); |
146 | 176 |
|
147 | 177 |
|
148 | 178 | //事件:keypress接管,build接管
|
149 | 179 | ['Keypress', 'Build'].forEach(function(v) {
|
150 | 180 | var callback = dataset['on' + v];
|
151 |
| - if (callback && typeof $win[callback] === 'function') { |
152 |
| - $cur.addEventListener('ppt' + v, $win[callback], true); |
| 181 | + callback = getCallbackFuncFromName(callback); |
| 182 | + if (callback && typeof callback === 'function') { |
| 183 | + $cur.addEventListener('ppt' + v, callback, true); |
153 | 184 | }
|
154 | 185 | });
|
155 | 186 |
|
|
182 | 213 |
|
183 | 214 | function slideOutCallBack_(prev) {
|
184 | 215 | var dataset = prev.dataset;
|
185 |
| - var cb = dataset.outcallback || dataset.onLeave; |
| 216 | + var cbNames = dataset.outcallback || dataset.onLeave; |
| 217 | + var cb = getCallbackFuncFromName(cbNames); |
| 218 | + var event = dispatchEvent('Leave', { |
| 219 | + container: prev |
| 220 | + }); |
186 | 221 | //如果有data-outcallback那么就执行callback
|
187 |
| - cb && typeof $win[cb] === 'function' && proxyFn(cb); |
| 222 | + cb && typeof cb === 'function' && proxyFn(cbNames, event); |
188 | 223 |
|
189 | 224 | //解绑事件:keypress,build
|
190 | 225 | ['Keypress', 'Build'].forEach(function(v) {
|
191 | 226 | var callback = dataset['on' + v];
|
192 |
| - if (callback && typeof $win[callback] === 'function') { |
193 |
| - prev.removeEventListener('ppt' + v, $win[callback], true); |
| 227 | + callback = getCallbackFuncFromName(callback); |
| 228 | + if (callback && typeof callback === 'function') { |
| 229 | + prev.removeEventListener('ppt' + v, callback, true); |
194 | 230 | }
|
195 | 231 | });
|
196 | 232 | }
|
|
229 | 265 | $curSlide = $slides[curIndex];
|
230 | 266 | //自定义事件,直接返回
|
231 | 267 | var event = dispatchEvent($curSlide, 'Build', {
|
232 |
| - direction: 'next' |
| 268 | + direction: 'next', |
| 269 | + container: $curSlide |
233 | 270 | });
|
234 | 271 | if (event.stopped) {
|
235 | 272 | return event.stopped;
|
|
275 | 312 |
|
276 | 313 | //自定义事件,直接返回
|
277 | 314 | var event = dispatchEvent($curSlide, 'Build', {
|
278 |
| - direction: 'prev' |
| 315 | + direction: 'prev', |
| 316 | + container: $curSlide |
279 | 317 | });
|
280 | 318 | if (event.stopped) {
|
281 | 319 | return event.stopped;
|
|
347 | 385 | }
|
348 | 386 |
|
349 | 387 | //切换动画
|
350 |
| - function doSlide() { |
| 388 | + function doSlide(direction) { |
351 | 389 | // $container.style.marginLeft = -(slideID * slideWidth) + 'px';
|
352 | 390 | updateSlideClass();
|
353 | 391 | setProgress();
|
354 | 392 | if (doHash) {
|
355 | 393 | lockSlide = true;
|
356 | 394 | $win.location.hash = "#" + curIndex;
|
357 | 395 | }
|
358 |
| - slideInCallBack(); |
| 396 | + slideInCallBack(direction); |
359 | 397 | removePaint();
|
360 | 398 |
|
361 | 399 | if ($doc.body.classList.contains('overview')) {
|
|
385 | 423 | for (var i = 0, len = $slides.length; i < len; ++i) {
|
386 | 424 | switch (i) {
|
387 | 425 | case curSlide - 2:
|
388 |
| - updateSlideClass_(i, 'far-past', pageClass); |
| 426 | + updateSlideClass_($slides[i], 'far-past', pageClass); |
389 | 427 | break;
|
390 | 428 | case curSlide - 1:
|
391 |
| - updateSlideClass_(i, 'past', pageClass); |
| 429 | + updateSlideClass_($slides[i], 'past', pageClass); |
392 | 430 | break;
|
393 | 431 | case curSlide:
|
394 |
| - updateSlideClass_(i, 'current', pageClass); |
| 432 | + updateSlideClass_($slides[i], 'current', pageClass); |
395 | 433 | break;
|
396 | 434 | case curSlide + 1:
|
397 |
| - updateSlideClass_(i, 'next', pageClass); |
| 435 | + updateSlideClass_($slides[i], 'next', pageClass); |
398 | 436 | break;
|
399 | 437 | case curSlide + 2:
|
400 |
| - updateSlideClass_(i, 'far-next', pageClass); |
| 438 | + updateSlideClass_($slides[i], 'far-next', pageClass); |
401 | 439 | break;
|
402 | 440 | default:
|
403 |
| - updateSlideClass_(i); |
| 441 | + updateSlideClass_($slides[i]); |
404 | 442 | break;
|
405 | 443 | }
|
406 | 444 | }
|
|
428 | 466 | }
|
429 | 467 | }
|
430 | 468 |
|
431 |
| - function updateSlideClass_(slideNo, className, pageClass) { |
432 |
| - var el = $slides[slideNo]; |
| 469 | + function updateSlideClass_(el, className, pageClass) { |
| 470 | + // var el = $slides[slideNo]; |
433 | 471 |
|
434 | 472 | if (!el) {
|
435 | 473 | return;
|
|
491 | 529 | var event = dispatchEvent($curSlide, 'Keypress', {
|
492 | 530 | keyCode: key,
|
493 | 531 | orgiTarget: target,
|
| 532 | + container: $curSlide |
494 | 533 | });
|
495 | 534 | if (event.stopped) {
|
496 | 535 | return event.stopped;
|
|
642 | 681 | // right
|
643 | 682 | case 40:
|
644 | 683 | // down
|
645 |
| - nextSlide() |
| 684 | + nextSlide(); |
646 | 685 | break;
|
647 | 686 | }
|
648 | 687 |
|
|
771 | 810 | this.classList.remove('fa-paint-brush');
|
772 | 811 | }
|
773 | 812 | isOpen = !isOpen;
|
774 |
| - } |
| 813 | + }; |
775 | 814 | }(), false);
|
776 | 815 |
|
777 | 816 | $win.addEventListener('hashchange', function() {
|
|
961 | 1000 | }
|
962 | 1001 | return false; //j 触屏画笔
|
963 | 1002 | }
|
964 |
| - } |
| 1003 | + }; |
965 | 1004 |
|
966 | 1005 | //代理函数,用于函数控制
|
967 | 1006 | function proxyFn(fnName, args) {
|
968 |
| - $win[fnName](args); |
| 1007 | + var cb = getCallbackFuncFromName(fnName); |
| 1008 | + cb(args); |
969 | 1009 | }
|
970 | 1010 |
|
971 | 1011 | /**
|
|
1018 | 1058 |
|
1019 | 1059 | function loadTheme() {
|
1020 | 1060 | if (defaultOptions.theme) {
|
1021 |
| - loadCSS('/css/theme.' + defaultOptions.theme + '.css') |
| 1061 | + loadCSS('/css/theme.' + defaultOptions.theme + '.css'); |
1022 | 1062 | }
|
1023 | 1063 | }
|
1024 | 1064 |
|
|
1057 | 1097 | });
|
1058 | 1098 | }
|
1059 | 1099 |
|
1060 |
| - |
1061 | 1100 | initVar(); //初始化变量
|
1062 | 1101 | loadTheme();
|
1063 | 1102 | makeBuildLists();
|
|
1080 | 1119 | $body.style.opacity = 1;
|
1081 | 1120 | }
|
1082 | 1121 |
|
| 1122 | + function magic(e) { |
| 1123 | + var $cur = $('magic', e.container); |
| 1124 | + if ($cur.length) { |
| 1125 | + $cur = $cur[0]; |
| 1126 | + } else { |
| 1127 | + return; |
| 1128 | + } |
| 1129 | + var index = ($cur.dataset.index || 0) | 0; |
| 1130 | + |
| 1131 | + var pageClass = 'pagedown'; |
| 1132 | + |
| 1133 | + if (e.direction === 'prev') { |
| 1134 | + //往前翻页 |
| 1135 | + pageClass = 'pageup'; |
| 1136 | + } |
| 1137 | + var $slides = toArray($('.magicItem', $cur)); |
| 1138 | + var len = $slides.length; |
| 1139 | + |
| 1140 | + if (!e.firstKiss) { |
| 1141 | + if (e.direction === 'prev') { |
| 1142 | + index--; |
| 1143 | + if (index < 0) { |
| 1144 | + index = 0; |
| 1145 | + $cur.dataset.index = index; |
| 1146 | + //标示状态 |
| 1147 | + $cur.dataset.status = 'wait'; |
| 1148 | + return; |
| 1149 | + } else { |
| 1150 | + e.stop(); |
| 1151 | + } |
| 1152 | + } else { |
| 1153 | + index++; |
| 1154 | + if (index === len) { |
| 1155 | + index = len - 1; |
| 1156 | + $cur.dataset.index = index; |
| 1157 | + //标示状态 |
| 1158 | + $cur.dataset.status = 'done'; |
| 1159 | + return; |
| 1160 | + } else { |
| 1161 | + e.stop(); |
| 1162 | + } |
| 1163 | + } |
| 1164 | + $cur.dataset.index = index; |
| 1165 | + } |
| 1166 | + |
| 1167 | + // debugger |
| 1168 | + for (var i = 0; i < len; ++i) { |
| 1169 | + switch (i) { |
| 1170 | + case index - 2: |
| 1171 | + updateSlideClass_($slides[i], 'far-past', pageClass); |
| 1172 | + break; |
| 1173 | + case index - 1: |
| 1174 | + updateSlideClass_($slides[i], 'past', pageClass); |
| 1175 | + break; |
| 1176 | + case index: |
| 1177 | + updateSlideClass_($slides[i], 'current', pageClass); |
| 1178 | + break; |
| 1179 | + case index + 1: |
| 1180 | + updateSlideClass_($slides[i], 'next', pageClass); |
| 1181 | + break; |
| 1182 | + case index + 2: |
| 1183 | + updateSlideClass_($slides[i], 'far-next', pageClass); |
| 1184 | + break; |
| 1185 | + default: |
| 1186 | + updateSlideClass_($slides[i]); |
| 1187 | + break; |
| 1188 | + } |
| 1189 | + } |
| 1190 | + |
| 1191 | + } |
| 1192 | + magic.init = function(e) { |
| 1193 | + var $cur = $('magic', e.container); |
| 1194 | + if ($cur.length) { |
| 1195 | + $cur = $cur[0]; |
| 1196 | + } else { |
| 1197 | + return; |
| 1198 | + } |
| 1199 | + |
| 1200 | + var index = $cur.dataset.index || 0; |
| 1201 | + switch ($cur.dataset.status) { |
| 1202 | + case 'done': |
| 1203 | + //说明从完成的地方往前翻页 |
| 1204 | + $cur.dataset.index = index; |
| 1205 | + |
| 1206 | + index--; |
| 1207 | + case 'wait': |
| 1208 | + //说明已经到了第一页了 |
| 1209 | + break; |
| 1210 | + default: |
| 1211 | + //第一次进入 |
| 1212 | + e.firstKiss = true; |
| 1213 | + magic(e); |
| 1214 | + } |
| 1215 | + console.log('init:', index); |
| 1216 | + |
| 1217 | + }; |
1083 | 1218 | var Slide = {
|
1084 | 1219 | current: 0,
|
1085 | 1220 | curItem: 0,
|
|
1111 | 1246 | showPaint: showPaint,
|
1112 | 1247 | removePaint: removePaint,
|
1113 | 1248 | buildNextItem: buildNextItem,
|
1114 |
| - buildPrevItem: buildPrevItem |
| 1249 | + buildPrevItem: buildPrevItem, |
| 1250 | + magic: magic |
1115 | 1251 | };
|
1116 | 1252 | ['on', 'un', 'fire'].forEach(function(v) {
|
1117 | 1253 | Slide[v] = function() {
|
|
0 commit comments