panlippt
Version:
运行在浏览器中的ppt 演示框架
1,144 lines (1,026 loc) • 37.1 kB
JavaScript
(function($win, $doc, $B, loadJS, loadCSS, undefined) {
//用于单页ppt预加载资源
var preloadFn = {
loadJS: loadJS,
loadCSS: loadCSS
};
var $body = $doc.body;
var emptyFn = function() {};
var emptyArr = [];
var touchDX = 0; //touch事件x数据
var touchDY = 0; //touch事件y数据
var touchStartX = 0;
var touchStartY = 0;
var ISSYNC = false;
var ctrlType = 'bind';
var doHash = true;
var lockSlide = false;
var slideWidth; //单页宽度
var slideHeight;
var curIndex = 0; //当前幻灯片索引
var pastIndex = 0; //上一个幻灯片索引
var $progress; //进度条
var $container; //幻灯片容器
var $slides; //幻灯片集合
var $drawBoard; //画板
var $slideTip;
var slideCount; //幻灯片总页数-1
var slideJump = ''; //幻灯片跳转
var QUERY = queryToJson(location.search);
function queryToJson(url) {
url = !!url ? decodeURIComponent(url) : '';
var locse = url.split('?'),
search = locse[1] ? locse[1] : locse[0],
pairs = search.split('&'),
result = {};
pairs.forEach(function(pair) {
pair = pair.split('=');
if (pair[0].length > 0) {
result[pair[0]] = pair[1] || '';
}
});
return result;
}
function dispatchEvent($dom, name, data) {
var event = document.createEvent('Event');
event.initEvent('ppt' + name, true, true);
event.stopped = false;
event.stop = function() {
event.preventDefault();
event.stopPropagation();
event.stopped = true;
};
if (data) {
for (var i in data) {
if (data.hasOwnProperty(i)) {
event[i] = data[i];
}
}
}
$dom.dispatchEvent(event);
return event;
}
//设置底部进度条
function setProgress() {
//添加dataset
Slide.current = curIndex + 1;
if ($progress) {
$progress.style.width = ((curIndex + 1) / (slideCount + 1)) * 100 + '%';
}
}
//泛数组转换为数组
function toArray(arrayLike) {
return emptyArr.slice.call(arrayLike);
}
//封装选择器
function $(selector, context) {
context = (context && context.nodeType === 1) ? context : $doc;
return context.querySelectorAll(selector);
}
//getID方法
function $$(id) {
return $doc.getElementById(id);
}
//上一页
function prevSlide(isControl) {
if (buildPrevItem()) {
Slide.curItem--;
return;
}
Slide.curItem = 0;
slideOutCallBack($slides[curIndex]);
pastIndex = curIndex;
--curIndex < 0 && (curIndex = 0);
doSlide('prev', isControl ? false : true);
}
//下一页
function nextSlide(isControl) {
if (buildNextItem()) {
Slide.curItem++;
return;
}
Slide.curItem = 0;
slideOutCallBack($slides[curIndex]);
pastIndex = curIndex;
++curIndex > slideCount && (curIndex = slideCount);
doSlide('next', isControl ? false : true);
//预加载
preload($slides[curIndex])($slides[curIndex + 1]);
}
//slide切入回调incallback
//<slide data-incallback=""
var slideInTimer;
function slideInCallBack() {
if (slideInTimer) {
clearTimeout(slideInTimer);
}
slideInTimer = setTimeout(slideInCallBack_, 1500);
}
function slideInCallBack_() {
var $cur = $slides[curIndex];
if (!$cur || ($cur && $cur.nodeType !== 1)) {
return;
}
var dataset = $cur.dataset;
var cb = dataset.incallback || dataset.onEnter;
//如果有data-incallback那么就执行callback
cb && typeof $win[cb] === 'function' && proxyFn(cb);
//事件:keypress接管,build接管
['Keypress', 'Build'].forEach(function(v) {
var callback = dataset['on' + v];
if (callback && typeof $win[callback] === 'function') {
$cur.addEventListener('ppt' + v, $win[callback], true);
}
});
//检测iframe
var $iframe = toArray($('iframe[data-src]', $cur));
if ($iframe.length) {
$iframe.forEach(function(v) {
var src = v.dataset.src;
v.src = src;
});
}
}
//slide切出回调outcallback
//<slide data-outcallback=""
var slideOutTimer;
function slideOutCallBack(prev) {
if (!prev || (prev && prev.nodeType !== 1)) {
return;
}
if (slideOutTimer) {
clearTimeout(slideOutTimer);
}
slideOutTimer = setTimeout(function() {
slideOutCallBack_(prev);
}, 1500);
}
function slideOutCallBack_(prev) {
var dataset = prev.dataset;
var cb = dataset.outcallback || dataset.onLeave;
//如果有data-outcallback那么就执行callback
cb && typeof $win[cb] === 'function' && proxyFn(cb);
//解绑事件:keypress,build
['Keypress', 'Build'].forEach(function(v) {
var callback = dataset['on' + v];
if (callback && typeof $win[callback] === 'function') {
prev.removeEventListener('ppt' + v, $win[callback], true);
}
});
}
//预加载资源
//<preload data-type="js||css" data-url="">
function preload(node) {
var self = arguments.callee;
if (node && node.nodeType === 1) {
var $preload = $('preload', node),
len = $preload.length;
while (len--) {
var tmpNode = $preload[len],
dataset = tmpNode.dataset,
type = dataset.type,
url = dataset.url;
var fn = preloadFn['load' + type.toUpperCase()];
typeof fn === 'function' && fn(url, function(tmpNode) {
return function() {
//将该标签删除,释放内存
tmpNode.parentNode && tmpNode.parentNode.removeChild(tmpNode);
tmpNode = null;
};
}(tmpNode));
}
}
return self;
}
//单行前进
function buildNextItem(iscontrol) {
if ($body.classList.contains('overview')) {
return false;
}
$curSlide = $slides[curIndex];
//自定义事件,直接返回
var event = dispatchEvent($curSlide, 'Build', {
direction: 'next'
});
if (event.stopped) {
return event.stopped;
}
var subBuilded = toArray($('.building'), $curSlide);
var list;
if (subBuilded.length) {
while (list = subBuilded.shift()) {
list = list.classList
list.remove('building');
list.add('builded');
}
}
var toBuild = $('.tobuild', $curSlide);
if (!toBuild.length) {
return false;
}
var item = toBuild.item(0);
list = item.classList;
list.remove('tobuild');
if (list.contains('subSlide')) {
toArray($('.subSlide.builded', $curSlide)).forEach(function($item) {
$item.classList.add('subBuilded');
});
}
list.add('building');
return true;
}
//单条往后走
function buildPrevItem(iscontrol) {
if ($body.classList.contains('overview')) {
return false;
}
$curSlide = $slides[curIndex];
//自定义事件,直接返回
var event = dispatchEvent($curSlide, 'Build', {
direction: 'prev'
});
if (event.stopped) {
return event.stopped;
}
var subBuilded = toArray($('.building'), $curSlide);
var list;
var buildingLen = subBuilded.length;
var curList;
if (buildingLen) {
while (list = subBuilded.shift()) {
var clist = list.classList
clist.remove('building');
clist.add('tobuild');
curList = list;
if (clist.contains('subSlide')) {
var $item = toArray($('.subSlide.builded.subBuilded', $curSlide)).pop();
$item && $item.classList.remove('subBuilded');
}
}
}
var builded = toArray($('.builded', $curSlide));
if (!builded.length && !buildingLen) {
return false;
}
var item = builded.pop();
if (item) {
if (!curList) {
curList = item;
}
list = item.classList;
list.remove('builded');
if (buildingLen === 0) {
list.add('tobuild');
item = builded.pop();
item.classList.remove('builded');
item.classList.add('building');
} else {
list.add('building');
}
}
return true;
}
//设置单行页面添加
function makeBuildLists() {
var i = slideCount;
var slide;
var transition = defaultOptions.transition;
var buildClass = '.build > *,.fadeIn > *,.rollIn > *,.moveIn > *,.bounceIn > *,.zoomIn > *,.fade > *,.subSlide';
while (slide = $slides[i--]) {
var $items = toArray($(buildClass, slide));
var dataset = slide.dataset;
$items.forEach(function($v, i) {
$v.classList.add('tobuild');
if (!('index' in $v.dataset)) {
$v.dataset.index = i;
}
});
if (!dataset.transition) {
dataset.transition = transition;
}
}
}
//切换动画
function doSlide() {
// $container.style.marginLeft = -(slideID * slideWidth) + 'px';
updateSlideClass();
setProgress();
if (doHash) {
lockSlide = true;
$win.location.hash = "#" + curIndex;
}
slideInCallBack();
removePaint();
if ($doc.body.classList.contains('overview')) {
focusOverview_();
return;
} else if (!$doc.body.classList.contains('popup')) {
$doc.body.classList.remove('with-notes');
}
}
function updateSlideClass() {
var curSlide = curIndex;
var pageClass = 'pagedown';
if (pastIndex === curIndex) {
$cur = $slides[curIndex];
if ($cur.classList.contains('pageup')) {
return;
}
}
if (pastIndex > curIndex) {
//往前翻页
pageClass = 'pageup';
} else {
//往后翻页
}
for (var i = 0, len = $slides.length; i < len; ++i) {
switch (i) {
case curSlide - 2:
updateSlideClass_(i, 'far-past', pageClass);
break;
case curSlide - 1:
updateSlideClass_(i, 'past', pageClass);
break;
case curSlide:
updateSlideClass_(i, 'current', pageClass);
break;
case curSlide + 1:
updateSlideClass_(i, 'next', pageClass);
break;
case curSlide + 2:
updateSlideClass_(i, 'far-next', pageClass);
break;
default:
updateSlideClass_(i);
break;
}
}
$B.fire('slide.update', curIndex, 0, pageClass);
}
function overview(isFromControl) {
$body.classList.toggle('overview');
focusOverview_();
if (!isFromControl) {
$B.fire('overview');
}
}
function focusOverview_() {
var isOV = $doc.body.classList.contains('overview');
for (var i = 0, slide; slide = $slides[i]; i++) {
slide.style.transform = slide.style.webkitTransform = slide.style.msTransform = slide.style.mozTransform = isOV ?
'translateZ(-2500px) translate(' + ((i - curIndex) * 105) +
'%, 0%)' : '';
slide.style.animation = slide.style.webkitAnimation = slide.style.msAnimation = slide.style.mozAnimation = isOV ?
'none' : '';
Slide.fire(isOV ? 'overviewshown' : 'overviewhidden');
}
}
function updateSlideClass_(slideNo, className, pageClass) {
var el = $slides[slideNo];
if (!el) {
return;
}
if (className) {
el.classList.add(className);
}
if (pageClass && location.href.indexOf('_multiscreen=control') === -1 && location.href.indexOf('iscontroller=1') === -1) {
el.classList.add(pageClass);
}
var arr = ['next', 'past', 'far-next', 'far-past', 'current', 'pagedown', 'pageup'];
arr.forEach(function(v) {
if (className !== v && pageClass !== v) {
el.classList.remove(v);
}
});
}
//显示tips
function showTips(msg) {
if (!$slideTip) {
return;
}
$slideTip.innerHTML = msg;
$slideTip.style.display = 'block';
setTimeout(function() {
$slideTip.style.display = 'none';
}, 3E3);
}
/*************************events***************/
//pc键盘翻页事件逻辑
function evtkeydown(e) {
try {
e.preventDefault(); //j防止按键盘后,页面走位
} catch (err) {
console.log(err);
}
return false;
}
function evtDocUp(e) {
var key = e.keyCode;
var target = e.target;
//防止input和textarea,和可以编辑tag
if (/^(input|textarea)$/i.test(target.nodeName) || target.isContentEditable) {
return;
}
if (!e.isFromControl) {
$B.fire('nodepptEvent:eventKeyup', e);
}
$B.fire('slide.keyup', e);
var $curSlide = $slides[curIndex];
var event = dispatchEvent($curSlide, 'Keypress', {
keyCode: key,
orgiTarget: target,
});
if (event.stopped) {
return event.stopped;
}
switch (key) {
case 13:
// Enter
if ($doc.body.classList.contains('overview')) {
overview(e.isFromControl);
} else {
//j 幻灯片跳转
var slideJumpIndex = parseInt(slideJump) - 1;
if (slideJumpIndex >= 0 && slideJumpIndex <= slideCount) {
jumpSlide(slideJumpIndex);
}
}
slideJump = '';
break;
case 72:
// H: Toggle code highlighting
$doc.body.classList.toggle('highlight-code');
setTimeout(function() {
$doc.body.classList.toggle('highlight-code');
}, 2000);
break;
// 下掉宽屏模式,默认width:100%
case 87:
// W: Toggle widescreen
// Only respect 'w' on body. Don't want to capture keys from an <input>.
if (!(e.shiftKey && e.metaKey)) {
if (!$body.classList.contains('popup'))
$container.classList.toggle('layout-widescreen');
}
break;
case 79:
// O: Toggle overview
overview(e.isFromControl);
break;
case 78:
// N
if (!$body.classList.contains('popup'))
$doc.body.classList.toggle('with-notes');
break;
case 80:
//P
if (!$body.classList.contains('popup')) {
showPaint(e.isFromControl);
}
break;
case 66:
//b
if ($drawBoard.context) {
$drawBoard.context.strokeStyle = 'rgba(0,0,255,0.5)'; //j pen_blue
break;
}
case 89:
//y
if ($drawBoard.context) {
$drawBoard.context.strokeStyle = 'rgba(255,255,0,0.5)'; //pen_yellow
break;
}
case 82:
//r
if ($drawBoard.context) {
$drawBoard.context.strokeStyle = 'rgba(255,0,0,0.5)'; //pen_red
break;
}
case 71:
//g
if ($drawBoard.context) {
$drawBoard.context.strokeStyle = 'rgba(0,255,0,0.5)'; //pen_green
break;
}
case 77:
//m
if ($drawBoard.context) {
$drawBoard.context.strokeStyle = 'rgba(255,0,255,0.5)'; //pen_magenta
break;
}
case 49:
//1
slideJump = slideJump + '1';
if ($drawBoard.context) {
$drawBoard.context.lineWidth = 3;
}
break;
case 50:
//2
slideJump = slideJump + '2';
if ($drawBoard.context) {
$drawBoard.context.lineWidth = 7;
}
break;
case 51:
//3
slideJump = slideJump + '3';
if ($drawBoard.context) {
$drawBoard.context.lineWidth = 11;
}
break;
case 52:
//4
slideJump = slideJump + '4';
if ($drawBoard.context) {
$drawBoard.context.lineWidth = 15; //j 笔粗细
}
break;
case 48:
slideJump = slideJump + '0';
break;
case 53:
slideJump = slideJump + '5';
break;
case 54:
slideJump = slideJump + '6';
break;
case 55:
slideJump = slideJump + '7';
break;
case 56:
slideJump = slideJump + '8';
break;
case 57:
slideJump = slideJump + '9'; //j 幻灯片跳转
break;
case 67:
//c
if (!$body.classList.contains('popup')) {
removePaint(e.isFromControl);
}
break;
//上一页
case 33:
// pg up
case 37:
// left
case 38:
// up
prevSlide();
break;
//下一页
case 32:
// space
case 34:
// pg down
case 39:
// right
case 40:
// down
nextSlide()
break;
}
}
/******************************** Touch events *********************/
var isStopTouchEvent = false;
function evtTouchStart(event) {
if (!isStopTouchEvent && event.touches.length === 1) {
touchDX = 0;
touchDY = 0;
var touch = event.touches[0];
touchStartX = touch.pageX;
touchStartY = touch.pageY;
//捕获,尽早发现事件
$body.addEventListener('touchmove', evtTouchMove, true);
$body.addEventListener('touchend', evtTouchEnd, true);
}
}
//touch事件
function evtTouchMove(event) {
if (event.touches.length > 1) {
cancelTouch();
} else {
var touch = event.touches[0];
touchDX = touch.pageX - touchStartX;
touchDY = touch.pageY - touchStartY;
}
try {
event.preventDefault();
} catch (err) {
console.log(err);
}
}
//touchend事件
function evtTouchEnd(event) {
var dx = Math.abs(touchDX);
var dy = Math.abs(touchDY);
if ((dx > 15) && (dy < (dx * 2 / 3))) {
if (touchDX > 0) {
cancelTouch();
return createKeyEvent(38);
// prevSlide();
} else {
// nextSlide();
}
}
createKeyEvent(39);
cancelTouch();
}
function createKeyEvent(keyCode) {
var evt = document.createEvent('Event');
evt.initEvent('keyup', true, true);
evt.keyCode = keyCode;
document.dispatchEvent(evt);
}
//取消绑定
function cancelTouch() {
$body.removeEventListener('touchmove', evtTouchMove, true);
$body.removeEventListener('touchend', evtTouchEnd, true);
}
//绑定事件
function bindEvent() {
$doc.addEventListener('keyup', evtDocUp, false);
// $doc.addEventListener('keydown', evtkeydown, false); //j 防止页面走位
// $doc.addEventListener('keypress', evtkeydown, false); //j 防止页面走位
$body.addEventListener('touchstart', evtTouchStart, false);
$$('_btn-bar').addEventListener('click', function() {
var isOpen = false;
return function() {
if (!isOpen) {
this.classList.remove('fa-bars');
this.classList.add('fa-close');
$$('_btn-box').style.display = 'inline-block';
} else {
this.classList.remove('fa-close');
this.classList.add('fa-bars');
$$('_btn-box').style.display = 'none';
}
isOpen = !isOpen;
};
}(), false);
$$('_btn-prev').addEventListener('click', function() {
createKeyEvent(38);
}, false);
$$('_btn-next').addEventListener('click', function() {
createKeyEvent(39);
}, false);
$$('_btn-overview').addEventListener('click', function() {
var isOpen = false;
return function() {
if (isOpen) {
this.classList.add('fa-compress');
this.classList.remove('fa-expand');
} else {
this.classList.add('fa-expand');
this.classList.remove('fa-compress');
}
overview();
isOpen = !isOpen;
};
}(), false);
$$('_btn-brush').addEventListener('click', function() {
var isOpen = false;
return function() {
if (isOpen) {
this.classList.add('fa-paint-brush');
this.classList.remove('fa-eraser');
removePaint();
} else {
showPaint();
this.classList.add('fa-eraser');
this.classList.remove('fa-paint-brush');
}
isOpen = !isOpen;
}
}(), false);
$win.addEventListener('hashchange', function() {
if (location.hash && !lockSlide) {
doHash = false;
slideOutCallBack($slides[curIndex]);
pastIndex = curIndex;
curIndex = location.hash.substr(1) | 0;
doSlide();
doHash = true;
}
lockSlide = false;
}, true);
}
/***********画图部分事件处理函数************/
//画图前准备
function drawCanvasReady() {
$drawBoard.context = $drawBoard.getContext('2d');
var context = $drawBoard.context;
context.lineWidth = 3;
// context.lineCap = 'square'; //'round';
context.lineJoin = 'round'; //'bevel';
context.strokeStyle = 'rgba(255,0,0,0.5)'; //"red";
}
//显示画板
var isControl = 0;
function showPaint(isFromControl) {
if (!$drawBoard) {
return;
}
//1、将翻页停止
isStopTouchEvent = true;
//2、将管理模式去掉
if ($body.classList.contains('with-notes')) {
isControl = 1;
$body.classList.remove('with-notes');
$body.classList.remove('popup');
}
$drawBoard.width = $body.clientWidth;
$drawBoard.height = $body.clientHeight;
drawCanvasReady();
$drawBoard.style.display = '';
$container.style.overflow = 'hidden';
$drawBoard.addEventListener('mousedown', pMouseDown, true);
$drawBoard.addEventListener('mouseup', pMouseUp, true);
$drawBoard.addEventListener('mousemove', pMouseMove, true);
//滑动
$drawBoard.addEventListener('touchmove', pMouseMove, true);
$drawBoard.addEventListener('touchend', pMouseUp, true);
$drawBoard.addEventListener('touchcancel', pMouseUp, true);
$drawBoard.addEventListener('touchstart', pMouseDown, true);
$doc.addEventListener('selectstart', stopSelect, true);
if (!isFromControl) {
$B.fire('nodepptEvent:show paint');
}
}
//禁止选中
function stopSelect() {
return false;
}
//清除画板内容
function clearPaint() {
$container.style.overflow = '';
$drawBoard.context && $drawBoard.context.clearRect(0, 0, slideWidth, slideHeight);
$drawBoard.style.display = 'none';
}
//删除画板
var removePaint = function(isFromControl) {
clearPaint();
slideJump = ''; //j 幻灯片跳转
if (isControl) {
$body.classList.add('with-notes');
$body.classList.add('popup');
}
isStopTouchEvent = false;
$drawBoard.removeEventListener('mousedown', pMouseDown);
$drawBoard.removeEventListener('mouseup', pMouseUp);
$drawBoard.removeEventListener('mousemove', pMouseMove);
//滑动
$drawBoard.removeEventListener('touchstart', pMouseDown);
$drawBoard.removeEventListener('touchmove', pMouseMove);
$drawBoard.removeEventListener('touchend', pMouseUp);
$drawBoard.removeEventListener('touchcancel', pMouseUp);
$doc.removeEventListener('selectstart', stopSelect, true);
if (!isFromControl) {
$B.fire('nodepptEvent:remove paint');
}
};
var pMouseDown = function(e) {
$drawBoard.isMouseDown = true;
try { //j 触屏画笔
var touch = e.targetTouches[0];
e = touch;
} catch (err) {}
// $drawBoard.iLastX = e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft);
// $drawBoard.iLastY = e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop);
var x = $drawBoard.iLastX = e.layerX || e.offsetX || (e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft));
var y = $drawBoard.iLastY = e.layerY || e.offsetY || (e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop));
pPoints.push({
x: x,
y: y
});
return false; //j 触屏画笔
};
var pPoints = [];
var pMouseUp = function(e) {
$drawBoard.isMouseDown = false;
$drawBoard.iLastX = -1;
$drawBoard.iLastY = -1;
if (!e.isFromControl) {
$B.fire('nodepptEvent:paint points', pPoints);
}
pPoints.length = 0;
};
$B.on('controlEvent:paint points', function(data) {
var points = data.points;
//远程来的屏幕
var wh = data.screen;
var tOX = wh.width / 2,
tOY = wh.height / 2;
var width = $body.offsetWidth;
var height = $body.offsetHeight;
var cOX = width / 2,
cOY = height / 2;
var iw = width / wh.width;
var ih = height / wh.height;
var context = $drawBoard.context;
if (!context) {
return;
}
context.beginPath();
var startX = cOX - (tOX - points[0].x) * iw;
var startY = cOY - (tOY - points[0].y) * ih;
// console.log(startX, points[0].x, startY, iw, wh);
context.moveTo(startX, startY);
for (var i = 0, len = points.length; i < len; i++) {
context.lineTo(cOX - (tOX - points[i].x) * iw, cOY - (tOY - points[i].y) * ih);
}
context.stroke();
});
var pMouseMove = function(e) {
var ee = e;
if ($drawBoard.isMouseDown) {
try { //j 触屏画笔
var touch = e.targetTouches[0];
e = touch;
} catch (err) {
console.log(err);
}
// var iX = e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft);
// var iY = e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop);
var iX = e.layerX || e.offsetX || (e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft));
var iY = e.layerY || e.offsetY || (e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop));
var context = $drawBoard.context;
context.beginPath();
context.moveTo($drawBoard.iLastX, $drawBoard.iLastY);
context.lineTo(iX, iY);
context.stroke();
$drawBoard.iLastX = iX;
$drawBoard.iLastY = iY;
pPoints.push({
x: iX,
y: iY
});
try {
ee.preventDefault();
} catch (err) {
console.log(err);
}
return false; //j 触屏画笔
}
}
//代理函数,用于函数控制
function proxyFn(fnName, args) {
$win[fnName](args);
}
/**
* 默认配置
* @type {Object}
*/
var defaultOptions = {
containerID: 'container',
isControlDevice: false,
drawBoardID: 'drawBoard',
slideClass: '.slide',
buildClass: '.build',
progressID: 'progress',
transition: '',
tipID: 'tip',
webSocketHost: '',
width: 900,
dir: './',
height: 700,
control: false
};
//初始化变量
function initVar() {
$slideTip = $$(defaultOptions.tipID);
$container = $$(defaultOptions.containerID);
slideWidth = defaultOptions.width;
slideHeight = defaultOptions.height;
$progress = $$(defaultOptions.progressID);
Slide.$slides = $slides = toArray($(defaultOptions.slideClass, $container));
slideCount = $slides.length; //幻灯片总页数-1
Slide.count = slideCount;
// $container.style.width = slideCount*slideWidth + 'px';//设置容器总宽度
slideCount--;
$drawBoard = $$(defaultOptions.drawBoardID);
if ($drawBoard) {
$drawBoard.style.display = 'none';
}
}
function fullImg() {
loadJS(defaultOptions.dir + 'img.screenfull.js', function() {
//图片处理
var $imgs = toArray($(defaultOptions.slideClass + ' img', $container));
screenfull($imgs);
});
}
function loadTheme() {
if (defaultOptions.theme) {
loadCSS('/css/theme.' + defaultOptions.theme + '.css')
}
}
//如果是print则需要修改
function iPrint() {
if (QUERY && QUERY.print) {
toArray($('iframe[data-src]')).forEach(function(v) {
if (v.src.indexOf('about:blank') === 0 && v.dataset.src) {
v.src = v.dataset.src;
}
});
}
}
//初始化
function init(options) {
options = options || {};
for (var key in defaultOptions) {
if (!!(key in options)) {
defaultOptions[key] = options[key];
}
}
['theme', 'transition'].forEach(function(v) {
if (QUERY && QUERY[v]) {
defaultOptions[v] = QUERY[v];
}
});
Slide.dir = defaultOptions.dir;
if (defaultOptions.control) {
var control = defaultOptions.control;
loadJS(defaultOptions.dir + 'nodeppt.control.js', function() {
Slide.Control.load(control.type, control.args);
});
}
initVar(); //初始化变量
loadTheme();
makeBuildLists();
fullImg(); //图片全屏
bindEvent();
pastIndex = curIndex;
if (QUERY && QUERY.print) {
iPrint(); //打印
} else {
if (location.hash && (curIndex = (location.hash.substr(1) | 0))) {
doSlide();
} else {
updateSlideClass();
setProgress();
slideInCallBack();
}
preload($slides[curIndex])($slides[curIndex + 1]);
}
$body.style.opacity = 1;
}
var Slide = {
current: 0,
curItem: 0,
init: init,
setIndex: function(i, item) {
i--;
if (i < 0) {
i = 0;
}
jumpSlide(i);
if (item > 0) {
buildItem();
}
function buildItem() {
if (item-- <= 0) {
return;
} else {
buildNextItem();
}
setTimeout(buildItem, 300);
}
// this.curItem = item;
},
next: nextSlide,
prev: prevSlide,
doSlide: doSlide,
proxyFn: proxyFn,
showPaint: showPaint,
removePaint: removePaint,
buildNextItem: buildNextItem,
buildPrevItem: buildPrevItem
};
['on', 'un', 'fire'].forEach(function(v) {
Slide[v] = function() {
var args = toArray(arguments);
args[0] = 'slide.' + args[0];
$B[v].apply(null, args);
};
});
function getcurIndex() { //j外部控制跳转
return curIndex;
}
function jumpSlide(gotoIndex) { //j外部控制跳转
pastIndex = gotoIndex - 1;
pastIndex = pastIndex < 0 ? 0 : pastIndex;
curIndex = gotoIndex;
doSlide();
}
$win.Slide = Slide;
$win.jumpSlide = jumpSlide; //j外部控制跳转
$win.getcurIndex = getcurIndex; //j外部控制跳转
try {
if (window.console && window.console.log) {
console.log('Powered By panliPPT, %c https://github.com/ipanli/panliPPT', 'color:red');
console.log('Install panliPPT: %c npm install -g panliPPT', 'color:red');
}
} catch (e) {}
}(window, document, MixJS.event.broadcast, MixJS.loadJS, MixJS.loadCSS));