Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
pic-reader
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
龙菲
pic-reader
Commits
72882efa
提交
72882efa
authored
6月 24, 2025
作者:
gzcnkilys_admin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1、分析翻页导致的异常,实际为vue主动翻页与原始逻辑冲突。
上级
d455186f
显示空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
366 行增加
和
582 行删除
+366
-582
turn.js
src/assets/js/turn.js
+357
-573
index.vue
src/components/BookReader/index.vue
+9
-9
没有找到文件。
src/assets/js/turn.js
浏览文件 @
72882efa
import
$
from
'jquery'
;
/*
* 🐛 BUG FIX: Event Listener Rebinding Issue
*
* PROBLEM:
* - When dragging outside corner zones, page flips occur without intermediate animation
* - After such flips, the _released function stops being called
* - This causes subsequent drags to position page curl at corners instead of mouse release position
*
* ROOT CAUSE:
* - In _movePages method, when pages are moved/reassigned, the flip options are updated
* - However, event listeners (pressed, released, start, end, flip) were NOT rebound
* - This caused the _released event handler to be lost
*
* SOLUTION:
* - Modified _movePages method to properly rebind all event listeners after page reassignment
* - Added unbind() call to clear old listeners before rebinding new ones
* - Added comprehensive logging to track event binding and triggering
*
* AFFECTED METHODS:
* - _movePages: Fixed event listener rebinding
* - _makeFlip: Added logging for event binding tracking
* - _eventStart: Added logging for event triggering tracking
*
* 🔧 The fix ensures that event listeners remain properly bound after any page operations
*/
var
has3d
,
vendor
=
''
,
vendor
=
''
,
PI
=
Math
.
PI
,
A90
=
PI
/
2
,
A90
=
PI
/
2
,
isTouch
=
'ontouchstart'
in
window
,
events
=
(
isTouch
)
?
{
start
:
'touchstart'
,
move
:
'touchmove'
,
end
:
'touchend'
}
:
{
start
:
'mousedown'
,
move
:
'mousemove'
,
end
:
'mouseup'
},
events
=
(
isTouch
)
?
{
start
:
'touchstart'
,
move
:
'touchmove'
,
end
:
'touchend'
}
:
{
start
:
'mousedown'
,
move
:
'mousemove'
,
end
:
'mouseup'
},
// Contansts used for each corner
// tl * tr
...
...
@@ -96,7 +70,7 @@ var has3d,
// Size of the active zone of each corner
cornerSize
:
10
0
,
cornerSize
:
15
0
,
// Enables gradients
...
...
@@ -115,16 +89,13 @@ var has3d,
pagesInDOM
=
6
,
pagePosition
=
{
0
:
{
top
:
0
,
left
:
0
,
right
:
'auto'
,
bottom
:
'auto'
},
1
:
{
top
:
0
,
right
:
0
,
left
:
'auto'
,
bottom
:
'auto'
}
},
pagePosition
=
{
0
:
{
top
:
0
,
left
:
0
,
right
:
'auto'
,
bottom
:
'auto'
},
1
:
{
top
:
0
,
right
:
0
,
left
:
'auto'
,
bottom
:
'auto'
}},
// Gets basic attributes for a layer
divAtt
=
function
(
top
,
left
,
zIndex
,
overf
)
{
return
{
'css'
:
{
divAtt
=
function
(
top
,
left
,
zIndex
,
overf
)
{
return
{
'css'
:
{
position
:
'absolute'
,
top
:
top
,
left
:
left
,
...
...
@@ -136,122 +107,122 @@ var has3d,
// Gets a 2D point from a bezier curve of four points
bezier
=
function
(
p1
,
p2
,
p3
,
p4
,
t
)
{
bezier
=
function
(
p1
,
p2
,
p3
,
p4
,
t
)
{
var
mum1
=
1
-
t
,
mum13
=
mum1
*
mum1
*
mum1
,
mu3
=
t
*
t
*
t
;
return
point2D
(
Math
.
round
(
mum13
*
p1
.
x
+
3
*
t
*
mum1
*
mum1
*
p2
.
x
+
3
*
t
*
t
*
mum1
*
p3
.
x
+
mu3
*
p4
.
x
),
Math
.
round
(
mum13
*
p1
.
y
+
3
*
t
*
mum1
*
mum1
*
p2
.
y
+
3
*
t
*
t
*
mum1
*
p3
.
y
+
mu3
*
p4
.
y
));
return
point2D
(
Math
.
round
(
mum13
*
p1
.
x
+
3
*
t
*
mum1
*
mum1
*
p2
.
x
+
3
*
t
*
t
*
mum1
*
p3
.
x
+
mu3
*
p4
.
x
),
Math
.
round
(
mum13
*
p1
.
y
+
3
*
t
*
mum1
*
mum1
*
p2
.
y
+
3
*
t
*
t
*
mum1
*
p3
.
y
+
mu3
*
p4
.
y
));
},
// Converts an angle from degrees to radians
rad
=
function
(
degrees
)
{
return
degrees
/
180
*
PI
;
rad
=
function
(
degrees
)
{
return
degrees
/
180
*
PI
;
},
// Converts an angle from radians to degrees
deg
=
function
(
radians
)
{
return
radians
/
PI
*
180
;
deg
=
function
(
radians
)
{
return
radians
/
PI
*
180
;
},
// Gets a 2D point
point2D
=
function
(
x
,
y
)
{
return
{
x
:
x
,
y
:
y
};
point2D
=
function
(
x
,
y
)
{
return
{
x
:
x
,
y
:
y
};
},
// Returns the traslate value
translate
=
function
(
x
,
y
,
use3d
)
{
translate
=
function
(
x
,
y
,
use3d
)
{
return
(
has3d
&&
use3d
)
?
' translate3d('
+
x
+
'px,'
+
y
+
'px, 0px) '
:
' translate('
+
x
+
'px, '
+
y
+
'px) '
;
},
// Returns the rotation value
rotate
=
function
(
degrees
)
{
rotate
=
function
(
degrees
)
{
return
' rotate('
+
degrees
+
'deg) '
;
},
// Checks if a property belongs to an object
has
=
function
(
property
,
object
)
{
has
=
function
(
property
,
object
)
{
return
Object
.
prototype
.
hasOwnProperty
.
call
(
object
,
property
);
},
// Gets the CSS3 vendor prefix
getPrefix
=
function
()
{
var
vendorPrefixes
=
[
'Moz'
,
'Webkit'
,
'Khtml'
,
'O'
,
'ms'
],
getPrefix
=
function
()
{
var
vendorPrefixes
=
[
'Moz'
,
'Webkit'
,
'Khtml'
,
'O'
,
'ms'
],
len
=
vendorPrefixes
.
length
,
vendor
=
''
;
while
(
len
--
)
if
((
vendorPrefixes
[
len
]
+
'Transform'
)
in
document
.
body
.
style
)
vendor
=
'-'
+
vendorPrefixes
[
len
].
toLowerCase
()
+
'-'
;
vendor
=
'-'
+
vendorPrefixes
[
len
].
toLowerCase
()
+
'-'
;
return
vendor
;
},
// Adds gradients
gradient
=
function
(
obj
,
p0
,
p1
,
colors
,
numColors
)
{
gradient
=
function
(
obj
,
p0
,
p1
,
colors
,
numColors
)
{
var
j
,
cols
=
[];
if
(
vendor
==
'-webkit-'
)
{
if
(
vendor
==
'-webkit-'
)
{
for
(
j
=
0
;
j
<
numColors
;
j
++
)
cols
.
push
(
'color-stop('
+
colors
[
j
][
0
]
+
', '
+
colors
[
j
][
1
]
+
')'
);
for
(
j
=
0
;
j
<
numColors
;
j
++
)
cols
.
push
(
'color-stop('
+
colors
[
j
][
0
]
+
', '
+
colors
[
j
][
1
]
+
')'
);
obj
.
css
({
'background-image'
:
'-webkit-gradient(linear, '
+
p0
.
x
+
'% '
+
p0
.
y
+
'%, '
+
p1
.
x
+
'% '
+
p1
.
y
+
'%, '
+
cols
.
join
(
','
)
+
' )'
});
obj
.
css
({
'background-image'
:
'-webkit-gradient(linear, '
+
p0
.
x
+
'% '
+
p0
.
y
+
'%, '
+
p1
.
x
+
'% '
+
p1
.
y
+
'%, '
+
cols
.
join
(
','
)
+
' )'
});
}
else
{
// This procedure makes the gradients for non-webkit browsers
// It will be reduced to one unique way for gradients in next versions
p0
=
{
x
:
p0
.
x
/
100
*
obj
.
width
(),
y
:
p0
.
y
/
100
*
obj
.
height
()
};
p1
=
{
x
:
p1
.
x
/
100
*
obj
.
width
(),
y
:
p1
.
y
/
100
*
obj
.
height
()
};
p0
=
{
x
:
p0
.
x
/
100
*
obj
.
width
(),
y
:
p0
.
y
/
100
*
obj
.
height
()
};
p1
=
{
x
:
p1
.
x
/
100
*
obj
.
width
(),
y
:
p1
.
y
/
100
*
obj
.
height
()
};
var
dx
=
p1
.
x
-
p0
.
x
,
dy
=
p1
.
y
-
p0
.
y
,
var
dx
=
p1
.
x
-
p0
.
x
,
dy
=
p1
.
y
-
p0
.
y
,
angle
=
Math
.
atan2
(
dy
,
dx
),
angle2
=
angle
-
Math
.
PI
/
2
,
diagonal
=
Math
.
abs
(
obj
.
width
()
*
Math
.
sin
(
angle2
))
+
Math
.
abs
(
obj
.
height
()
*
Math
.
cos
(
angle2
)),
gradientDiagonal
=
Math
.
sqrt
(
dy
*
dy
+
dx
*
dx
),
corner
=
point2D
((
p1
.
x
<
p0
.
x
)
?
obj
.
width
()
:
0
,
(
p1
.
y
<
p0
.
y
)
?
obj
.
height
()
:
0
),
angle2
=
angle
-
Math
.
PI
/
2
,
diagonal
=
Math
.
abs
(
obj
.
width
()
*
Math
.
sin
(
angle2
))
+
Math
.
abs
(
obj
.
height
()
*
Math
.
cos
(
angle2
)),
gradientDiagonal
=
Math
.
sqrt
(
dy
*
dy
+
dx
*
dx
),
corner
=
point2D
((
p1
.
x
<
p0
.
x
)
?
obj
.
width
()
:
0
,
(
p1
.
y
<
p0
.
y
)
?
obj
.
height
()
:
0
),
slope
=
Math
.
tan
(
angle
),
inverse
=
-
1
/
slope
,
x
=
(
inverse
*
corner
.
x
-
corner
.
y
-
slope
*
p0
.
x
+
p0
.
y
)
/
(
inverse
-
slope
),
c
=
{
x
:
x
,
y
:
inverse
*
x
-
inverse
*
corner
.
x
+
corner
.
y
},
segA
=
(
Math
.
sqrt
(
Math
.
pow
(
c
.
x
-
p0
.
x
,
2
)
+
Math
.
pow
(
c
.
y
-
p0
.
y
,
2
)));
inverse
=
-
1
/
slope
,
x
=
(
inverse
*
corner
.
x
-
corner
.
y
-
slope
*
p0
.
x
+
p0
.
y
)
/
(
inverse
-
slope
),
c
=
{
x
:
x
,
y
:
inverse
*
x
-
inverse
*
corner
.
x
+
corner
.
y
},
segA
=
(
Math
.
sqrt
(
Math
.
pow
(
c
.
x
-
p0
.
x
,
2
)
+
Math
.
pow
(
c
.
y
-
p0
.
y
,
2
)));
for
(
j
=
0
;
j
<
numColors
;
j
++
)
cols
.
push
(
' '
+
colors
[
j
][
1
]
+
' '
+
((
segA
+
gradientDiagonal
*
colors
[
j
][
0
])
*
100
/
diagonal
)
+
'%'
);
for
(
j
=
0
;
j
<
numColors
;
j
++
)
cols
.
push
(
' '
+
colors
[
j
][
1
]
+
' '
+
((
segA
+
gradientDiagonal
*
colors
[
j
][
0
]
)
*
100
/
diagonal
)
+
'%'
);
obj
.
css
({
'background-image'
:
vendor
+
'linear-gradient('
+
(
-
angle
)
+
'rad,'
+
cols
.
join
(
','
)
+
')'
});
obj
.
css
({
'background-image'
:
vendor
+
'linear-gradient('
+
(
-
angle
)
+
'rad,'
+
cols
.
join
(
','
)
+
')'
});
}
},
turnMethods
=
{
turnMethods
=
{
// Singleton constructor
// $('#selector').turn([options]);
init
:
function
(
opts
)
{
init
:
function
(
opts
)
{
// Define constants
if
(
has3d
===
undefined
)
{
if
(
has3d
===
undefined
)
{
has3d
=
'WebKitCSSMatrix'
in
window
||
'MozPerspective'
in
document
.
body
.
style
;
vendor
=
getPrefix
();
}
var
i
,
data
=
this
.
data
(),
ch
=
this
.
children
();
opts
=
$
.
extend
({
width
:
this
.
width
(),
height
:
this
.
height
()
},
turnOptions
,
opts
);
opts
=
$
.
extend
({
width
:
this
.
width
(),
height
:
this
.
height
()
},
turnOptions
,
opts
);
data
.
opts
=
opts
;
data
.
pageObjs
=
{};
data
.
pages
=
{};
...
...
@@ -266,15 +237,15 @@ var has3d,
this
.
bind
(
i
,
opts
.
when
[
i
]);
this
.
css
({
position
:
'relative'
,
width
:
opts
.
width
,
height
:
opts
.
height
});
this
.
css
({
position
:
'relative'
,
width
:
opts
.
width
,
height
:
opts
.
height
});
this
.
turn
(
'display'
,
opts
.
display
);
if
(
has3d
&&
!
isTouch
&&
opts
.
acceleration
)
this
.
transform
(
translate
(
0
,
0
,
true
));
for
(
i
=
0
;
i
<
ch
.
length
;
i
++
)
this
.
turn
(
'addPage'
,
ch
[
i
],
i
+
1
);
for
(
i
=
0
;
i
<
ch
.
length
;
i
++
)
this
.
turn
(
'addPage'
,
ch
[
i
],
i
+
1
);
this
.
turn
(
'page'
,
opts
.
page
);
...
...
@@ -283,18 +254,18 @@ var has3d,
// Event listeners
$
(
this
).
bind
(
events
.
start
,
function
(
e
)
{
$
(
this
).
bind
(
events
.
start
,
function
(
e
)
{
for
(
var
page
in
data
.
pages
)
if
(
has
(
page
,
data
.
pages
)
&&
flipMethods
.
_eventStart
.
call
(
data
.
pages
[
page
],
e
)
===
false
)
if
(
has
(
page
,
data
.
pages
)
&&
flipMethods
.
_eventStart
.
call
(
data
.
pages
[
page
],
e
)
===
false
)
return
false
;
});
$
(
document
).
bind
(
events
.
move
,
function
(
e
)
{
$
(
document
).
bind
(
events
.
move
,
function
(
e
)
{
for
(
var
page
in
data
.
pages
)
if
(
has
(
page
,
data
.
pages
))
flipMethods
.
_eventMove
.
call
(
data
.
pages
[
page
],
e
);
}).
bind
(
events
.
end
,
function
(
e
)
{
bind
(
events
.
end
,
function
(
e
)
{
for
(
var
page
in
data
.
pages
)
if
(
has
(
page
,
data
.
pages
))
flipMethods
.
_eventEnd
.
call
(
data
.
pages
[
page
],
e
);
...
...
@@ -308,25 +279,25 @@ var has3d,
// Adds a page from external data
addPage
:
function
(
element
,
page
)
{
addPage
:
function
(
element
,
page
)
{
var
incPages
=
false
,
data
=
this
.
data
(),
lastPage
=
data
.
totalPages
+
1
;
lastPage
=
data
.
totalPages
+
1
;
if
(
page
)
{
if
(
page
==
lastPage
)
{
if
(
page
==
lastPage
)
{
page
=
lastPage
;
incPages
=
true
;
}
else
if
(
page
>
lastPage
)
throw
new
Error
(
'It is impossible to add the page "'
+
page
+
'", the maximum value is: "'
+
lastPage
+
'"'
);
}
else
if
(
page
>
lastPage
)
throw
new
Error
(
'It is impossible to add the page "'
+
page
+
'", the maximum value is: "'
+
lastPage
+
'"'
);
}
else
{
page
=
lastPage
;
incPages
=
true
;
}
if
(
page
>=
1
&&
page
<=
lastPage
)
{
if
(
page
>=
1
&&
page
<=
lastPage
)
{
// Stop animations
if
(
data
.
done
)
this
.
turn
(
'stop'
);
...
...
@@ -357,7 +328,7 @@ var has3d,
// Adds a page from internal data
_addPage
:
function
(
page
)
{
_addPage
:
function
(
page
)
{
var
data
=
this
.
data
(),
element
=
data
.
pageObjs
[
page
];
...
...
@@ -367,26 +338,22 @@ var has3d,
if
(
!
data
.
pageWrap
[
page
])
{
var
pageWidth
=
(
data
.
display
==
'double'
)
?
this
.
width
()
/
2
:
this
.
width
(),
var
pageWidth
=
(
data
.
display
==
'double'
)
?
this
.
width
()
/
2
:
this
.
width
(),
pageHeight
=
this
.
height
();
element
.
css
({
width
:
pageWidth
,
height
:
pageHeight
});
element
.
css
({
width
:
pageWidth
,
height
:
pageHeight
});
// Place
data
.
pagePlace
[
page
]
=
page
;
// Wrapper
data
.
pageWrap
[
page
]
=
$
(
'<div/>'
,
{
'class'
:
'turn-page-wrapper'
,
data
.
pageWrap
[
page
]
=
$
(
'<div/>'
,
{
'class'
:
'turn-page-wrapper'
,
page
:
page
,
css
:
{
position
:
'absolute'
,
css
:
{
position
:
'absolute'
,
overflow
:
'hidden'
,
width
:
pageWidth
,
height
:
pageHeight
}
}).
css
(
pagePosition
[(
data
.
display
==
'double'
)
?
page
%
2
:
0
]);
height
:
pageHeight
}}).
css
(
pagePosition
[(
data
.
display
==
'double'
)
?
page
%
2
:
0
]);
// Append to this
this
.
append
(
data
.
pageWrap
[
page
]);
...
...
@@ -396,7 +363,7 @@ var has3d,
}
// If the page is in the current view, create the flip effect
if
(
!
page
||
turnMethods
.
_setPageLoc
.
call
(
this
,
page
)
==
1
)
if
(
!
page
||
turnMethods
.
_setPageLoc
.
call
(
this
,
page
)
==
1
)
turnMethods
.
_makeFlip
.
call
(
this
,
page
);
}
else
{
...
...
@@ -414,7 +381,7 @@ var has3d,
// Checks if a page is in memory
hasPage
:
function
(
page
)
{
hasPage
:
function
(
page
)
{
return
page
in
this
.
data
().
pageObjs
;
...
...
@@ -422,27 +389,22 @@ var has3d,
// Prepares the flip effect for a page
_makeFlip
:
function
(
page
)
{
_makeFlip
:
function
(
page
)
{
var
data
=
this
.
data
();
console
.
log
(
'🔧 _makeFlip: page='
,
page
,
'exists='
,
!!
data
.
pages
[
page
],
'pagePlace='
,
data
.
pagePlace
[
page
]);
if
(
!
data
.
pages
[
page
]
&&
data
.
pagePlace
[
page
]
==
page
)
{
if
(
!
data
.
pages
[
page
]
&&
data
.
pagePlace
[
page
]
==
page
)
{
var
single
=
data
.
display
==
'single'
,
even
=
page
%
2
;
console
.
log
(
'🔧 _makeFlip: creating flip for page'
,
page
,
'single='
,
single
,
'even='
,
even
);
var
single
=
data
.
display
==
'single'
,
even
=
page
%
2
;
data
.
pages
[
page
]
=
data
.
pageObjs
[
page
].
css
({
width
:
(
single
)
?
this
.
width
()
:
this
.
width
()
/
2
,
height
:
this
.
height
()
}).
flip
({
page
:
page
,
next
:
(
single
&&
page
===
data
.
totalPages
)
?
page
-
1
:
((
even
||
single
)
?
page
+
1
:
page
-
1
),
css
({
width
:
(
single
)
?
this
.
width
()
:
this
.
width
()
/
2
,
height
:
this
.
height
()}).
flip
({
page
:
page
,
next
:
(
single
&&
page
===
data
.
totalPages
)
?
page
-
1
:
((
even
||
single
)
?
page
+
1
:
page
-
1
),
turn
:
this
,
duration
:
data
.
opts
.
duration
,
acceleration
:
data
.
opts
.
acceleration
,
acceleration
:
data
.
opts
.
acceleration
,
corners
:
(
single
)
?
'all'
:
((
even
)
?
'forward'
:
'backward'
),
backGradient
:
data
.
opts
.
gradients
,
frontGradient
:
data
.
opts
.
gradients
...
...
@@ -453,21 +415,19 @@ var has3d,
bind
(
'start'
,
turnMethods
.
_start
).
bind
(
'end'
,
turnMethods
.
_end
).
bind
(
'flip'
,
turnMethods
.
_flip
);
console
.
log
(
'🔧 _makeFlip: events bound for page'
,
page
,
'next='
,
(
single
&&
page
===
data
.
totalPages
)
?
page
-
1
:
((
even
||
single
)
?
page
+
1
:
page
-
1
));
}
return
data
.
pages
[
page
];
},
// Makes pages within a range
_makeRange
:
function
()
{
_makeRange
:
function
()
{
var
page
,
data
=
this
.
data
(),
range
=
this
.
turn
(
'range'
);
for
(
page
=
range
[
0
];
page
<=
range
[
1
];
page
++
)
for
(
page
=
range
[
0
];
page
<=
range
[
1
];
page
++
)
turnMethods
.
_addPage
.
call
(
this
,
page
);
},
...
...
@@ -481,55 +441,55 @@ var has3d,
// 1 2-3 4-5 6-7 8-9 10-11 12-13
// ** ** -- ** **
range
:
function
(
page
)
{
range
:
function
(
page
)
{
var
remainingPages
,
left
,
right
,
data
=
this
.
data
();
page
=
page
||
data
.
tpage
||
data
.
page
;
var
view
=
turnMethods
.
_view
.
call
(
this
,
page
);
if
(
page
<
1
||
page
>
data
.
totalPages
)
throw
new
Error
(
'"'
+
page
+
'" is not a page for range'
);
if
(
page
<
1
||
page
>
data
.
totalPages
)
throw
new
Error
(
'"'
+
page
+
'" is not a page for range'
);
view
[
1
]
=
view
[
1
]
||
view
[
0
];
if
(
view
[
0
]
>=
1
&&
view
[
1
]
<=
data
.
totalPages
)
{
if
(
view
[
0
]
>=
1
&&
view
[
1
]
<=
data
.
totalPages
)
{
remainingPages
=
Math
.
floor
((
pagesInDOM
-
2
)
/
2
);
remainingPages
=
Math
.
floor
((
pagesInDOM
-
2
)
/
2
);
if
(
data
.
totalPages
-
view
[
1
]
>
view
[
0
])
{
left
=
Math
.
min
(
view
[
0
]
-
1
,
remainingPages
);
right
=
2
*
remainingPages
-
left
;
if
(
data
.
totalPages
-
view
[
1
]
>
view
[
0
])
{
left
=
Math
.
min
(
view
[
0
]
-
1
,
remainingPages
);
right
=
2
*
remainingPages
-
left
;
}
else
{
right
=
Math
.
min
(
data
.
totalPages
-
view
[
1
],
remainingPages
);
left
=
2
*
remainingPages
-
right
;
right
=
Math
.
min
(
data
.
totalPages
-
view
[
1
],
remainingPages
);
left
=
2
*
remainingPages
-
right
;
}
}
else
{
left
=
pagesInDOM
-
1
;
right
=
pagesInDOM
-
1
;
left
=
pagesInDOM
-
1
;
right
=
pagesInDOM
-
1
;
}
return
[
Math
.
max
(
1
,
view
[
0
]
-
left
),
Math
.
min
(
data
.
totalPages
,
view
[
1
]
+
right
)];
return
[
Math
.
max
(
1
,
view
[
0
]
-
left
),
Math
.
min
(
data
.
totalPages
,
view
[
1
]
+
right
)];
},
// Detects if a page is within the range of `pagesInDOM` from the current view
_necessPage
:
function
(
page
)
{
_necessPage
:
function
(
page
)
{
if
(
page
===
0
)
if
(
page
===
0
)
return
true
;
var
range
=
this
.
turn
(
'range'
);
return
page
>=
range
[
0
]
&&
page
<=
range
[
1
];
return
page
>=
range
[
0
]
&&
page
<=
range
[
1
];
},
// Releases memory by removing pages from the DOM
_removeFromDOM
:
function
()
{
_removeFromDOM
:
function
()
{
var
page
,
data
=
this
.
data
();
...
...
@@ -542,7 +502,7 @@ var has3d,
// Removes a page from DOM and its internal references
_removePageFromDOM
:
function
(
page
)
{
_removePageFromDOM
:
function
(
page
)
{
var
data
=
this
.
data
();
...
...
@@ -568,7 +528,7 @@ var has3d,
// Removes a page
removePage
:
function
(
page
)
{
removePage
:
function
(
page
)
{
var
data
=
this
.
data
();
...
...
@@ -584,11 +544,11 @@ var has3d,
turnMethods
.
_movePages
.
call
(
this
,
page
,
-
1
);
// Resize the size of this magazine
data
.
totalPages
=
data
.
totalPages
-
1
;
data
.
totalPages
=
data
.
totalPages
-
1
;
turnMethods
.
_makeRange
.
call
(
this
);
// Check the current view
if
(
data
.
page
>
data
.
totalPages
)
if
(
data
.
page
>
data
.
totalPages
)
this
.
turn
(
'page'
,
data
.
totalPages
);
}
...
...
@@ -598,15 +558,15 @@ var has3d,
// Moves pages
_movePages
:
function
(
from
,
change
)
{
_movePages
:
function
(
from
,
change
)
{
var
page
,
data
=
this
.
data
(),
single
=
data
.
display
==
'single'
,
move
=
function
(
page
)
{
single
=
data
.
display
==
'single'
,
move
=
function
(
page
)
{
var
next
=
page
+
change
,
odd
=
next
%
2
;
odd
=
next
%
2
;
if
(
data
.
pageObjs
[
page
])
data
.
pageObjs
[
next
]
=
data
.
pageObjs
[
page
].
removeClass
(
'page'
+
page
).
addClass
(
'page'
+
next
);
...
...
@@ -615,28 +575,13 @@ var has3d,
data
.
pagePlace
[
next
]
=
next
;
data
.
pageWrap
[
next
]
=
data
.
pageWrap
[
page
].
css
(
pagePosition
[(
single
)
?
0
:
odd
]).
attr
(
'page'
,
next
);
if
(
data
.
pages
[
page
])
{
console
.
log
(
'🔄 _movePages: moving page'
,
page
,
'to'
,
next
,
'rebinding events'
);
// 更新flip选项
if
(
data
.
pages
[
page
])
data
.
pages
[
next
]
=
data
.
pages
[
page
].
flip
(
'options'
,
{
page
:
next
,
next
:
(
single
||
odd
)
?
next
+
1
:
next
-
1
,
next
:
(
single
||
odd
)
?
next
+
1
:
next
-
1
,
corners
:
(
single
)
?
'all'
:
((
odd
)
?
'forward'
:
'backward'
)
});
// 重新绑定事件监听器 - 这是关键修复
data
.
pages
[
next
]
.
unbind
(
'pressed released start end flip'
)
// 清除旧的事件监听器
.
bind
(
'pressed'
,
turnMethods
.
_pressed
)
.
bind
(
'released'
,
turnMethods
.
_released
)
.
bind
(
'start'
,
turnMethods
.
_start
)
.
bind
(
'end'
,
turnMethods
.
_end
)
.
bind
(
'flip'
,
turnMethods
.
_flip
);
console
.
log
(
'🔄 _movePages: events rebound for page'
,
next
);
}
if
(
change
)
{
delete
data
.
pages
[
page
];
delete
data
.
pagePlace
[
page
];
...
...
@@ -647,37 +592,37 @@ var has3d,
}
};
if
(
change
>
0
)
for
(
page
=
data
.
totalPages
;
page
>=
from
;
page
--
)
move
(
page
);
if
(
change
>
0
)
for
(
page
=
data
.
totalPages
;
page
>=
from
;
page
--
)
move
(
page
);
else
for
(
page
=
from
;
page
<=
data
.
totalPages
;
page
++
)
move
(
page
);
for
(
page
=
from
;
page
<=
data
.
totalPages
;
page
++
)
move
(
page
);
},
// Sets or Gets the display mode
display
:
function
(
display
)
{
display
:
function
(
display
)
{
var
data
=
this
.
data
(),
currentDisplay
=
data
.
display
;
if
(
display
)
{
if
(
$
.
inArray
(
display
,
displays
)
==
-
1
)
throw
new
Error
(
'"'
+
display
+
'" is not a value for display'
);
if
(
$
.
inArray
(
display
,
displays
)
==
-
1
)
throw
new
Error
(
'"'
+
display
+
'" is not a value for display'
);
if
(
display
==
'single'
)
{
if
(
display
==
'single'
)
{
if
(
!
data
.
pageObjs
[
0
])
{
this
.
turn
(
'stop'
).
css
({
'overflow'
:
'hidden'
});
data
.
pageObjs
[
0
]
=
$
(
'<div />'
,
{
'class'
:
'turn-page p-temporal'
}).
css
({
width
:
this
.
width
(),
height
:
this
.
height
()
}).
css
({
'overflow'
:
'hidden'
});
data
.
pageObjs
[
0
]
=
$
(
'<div />'
,
{
'class'
:
'turn-page p-temporal'
}).
css
({
width
:
this
.
width
(),
height
:
this
.
height
()
}).
appendTo
(
this
);
}
}
else
{
if
(
data
.
pageObjs
[
0
])
{
this
.
turn
(
'stop'
).
css
({
'overflow'
:
''
});
css
({
'overflow'
:
''
});
data
.
pageObjs
[
0
].
remove
();
delete
data
.
pageObjs
[
0
];
}
...
...
@@ -701,25 +646,25 @@ var has3d,
// Detects if the pages are being animated
animating
:
function
()
{
animating
:
function
()
{
return
this
.
data
().
pageMv
.
length
>
0
;
return
this
.
data
().
pageMv
.
length
>
0
;
},
// Disables and enables the effect
disable
:
function
(
bool
)
{
disable
:
function
(
bool
)
{
var
page
,
data
=
this
.
data
(),
view
=
this
.
turn
(
'view'
);
data
.
disabled
=
bool
===
undefined
||
bool
===
true
;
data
.
disabled
=
bool
===
undefined
||
bool
===
true
;
for
(
page
in
data
.
pages
)
if
(
has
(
page
,
data
.
pages
))
data
.
pages
[
page
].
flip
(
'disable'
,
bool
?
$
.
inArray
(
page
,
view
)
:
false
);
data
.
pages
[
page
].
flip
(
'disable'
,
bool
?
$
.
inArray
(
page
,
view
)
:
false
);
return
this
;
...
...
@@ -727,23 +672,23 @@ var has3d,
// Gets and sets the size
size
:
function
(
width
,
height
)
{
size
:
function
(
width
,
height
)
{
if
(
width
&&
height
)
{
var
data
=
this
.
data
(),
pageWidth
=
(
data
.
display
==
'double'
)
?
width
/
2
:
width
,
page
;
var
data
=
this
.
data
(),
pageWidth
=
(
data
.
display
==
'double'
)
?
width
/
2
:
width
,
page
;
this
.
css
({
width
:
width
,
height
:
height
});
this
.
css
({
width
:
width
,
height
:
height
});
if
(
data
.
pageObjs
[
0
])
data
.
pageObjs
[
0
].
css
({
width
:
pageWidth
,
height
:
height
});
data
.
pageObjs
[
0
].
css
({
width
:
pageWidth
,
height
:
height
});
for
(
page
in
data
.
pageWrap
)
{
if
(
!
has
(
page
,
data
.
pageWrap
))
continue
;
data
.
pageObjs
[
page
].
css
({
width
:
pageWidth
,
height
:
height
});
data
.
pageWrap
[
page
].
css
({
width
:
pageWidth
,
height
:
height
});
data
.
pageObjs
[
page
].
css
({
width
:
pageWidth
,
height
:
height
});
data
.
pageWrap
[
page
].
css
({
width
:
pageWidth
,
height
:
height
});
if
(
data
.
pages
[
page
])
data
.
pages
[
page
].
css
({
width
:
pageWidth
,
height
:
height
});
data
.
pages
[
page
].
css
({
width
:
pageWidth
,
height
:
height
});
}
this
.
turn
(
'resize'
);
...
...
@@ -752,19 +697,19 @@ var has3d,
}
else
{
return
{
width
:
this
.
width
(),
height
:
this
.
height
()
};
return
{
width
:
this
.
width
(),
height
:
this
.
height
()
};
}
},
// Resizes each page
resize
:
function
()
{
resize
:
function
()
{
var
page
,
data
=
this
.
data
();
if
(
data
.
pages
[
0
])
{
data
.
pageWrap
[
0
].
css
({
left
:
-
this
.
width
()
});
data
.
pageWrap
[
0
].
css
({
left
:
-
this
.
width
()
});
data
.
pages
[
0
].
flip
(
'resize'
,
true
);
}
...
...
@@ -777,12 +722,12 @@ var has3d,
// Removes an animation from the cache
_removeMv
:
function
(
page
)
{
_removeMv
:
function
(
page
)
{
var
i
,
data
=
this
.
data
();
for
(
i
=
0
;
i
<
data
.
pageMv
.
length
;
i
++
)
if
(
data
.
pageMv
[
i
]
==
page
)
{
for
(
i
=
0
;
i
<
data
.
pageMv
.
length
;
i
++
)
if
(
data
.
pageMv
[
i
]
==
page
)
{
data
.
pageMv
.
splice
(
i
,
1
);
return
true
;
}
...
...
@@ -793,7 +738,7 @@ var has3d,
// Adds an animation to the cache
_addMv
:
function
(
page
)
{
_addMv
:
function
(
page
)
{
var
data
=
this
.
data
();
...
...
@@ -804,13 +749,13 @@ var has3d,
// Gets indexes for a view
_view
:
function
(
page
)
{
_view
:
function
(
page
)
{
var
data
=
this
.
data
();
page
=
page
||
data
.
page
;
if
(
data
.
display
==
'double'
)
return
(
page
%
2
)
?
[
page
-
1
,
page
]
:
[
page
,
page
+
1
];
if
(
data
.
display
==
'double'
)
return
(
page
%
2
)
?
[
page
-
1
,
page
]
:
[
page
,
page
+
1
];
else
return
[
page
];
...
...
@@ -818,19 +763,18 @@ var has3d,
// Gets a view
view
:
function
(
page
)
{
view
:
function
(
page
)
{
var
data
=
this
.
data
(),
view
=
turnMethods
.
_view
.
call
(
this
,
page
);
return
(
data
.
display
==
'double'
)
?
[(
view
[
0
]
>
0
)
?
view
[
0
]
:
0
,
(
view
[
1
]
<=
data
.
totalPages
)
?
view
[
1
]
:
0
]
:
[(
view
[
0
]
>
0
&&
view
[
0
]
<=
data
.
totalPages
)
?
view
[
0
]
:
0
];
return
(
data
.
display
==
'double'
)
?
[(
view
[
0
]
>
0
)
?
view
[
0
]
:
0
,
(
view
[
1
]
<=
data
.
totalPages
)
?
view
[
1
]
:
0
]
:
[(
view
[
0
]
>
0
&&
view
[
0
]
<=
data
.
totalPages
)
?
view
[
0
]
:
0
];
},
// Stops animations
stop
:
function
(
ok
)
{
stop
:
function
(
ok
)
{
var
i
,
opts
,
data
=
this
.
data
(),
pages
=
data
.
pageMv
;
data
.
pageMv
=
[];
...
...
@@ -848,7 +792,7 @@ var has3d,
data
.
pagePlace
[
opts
.
next
]
=
opts
.
next
;
if
(
opts
.
force
)
{
opts
.
next
=
(
opts
.
page
%
2
===
0
)
?
opts
.
page
-
1
:
opts
.
page
+
1
;
opts
.
next
=
(
opts
.
page
%
2
===
0
)
?
opts
.
page
-
1
:
opts
.
page
+
1
;
delete
opts
[
'force'
];
}
...
...
@@ -861,17 +805,17 @@ var has3d,
// Gets and sets the number of pages
pages
:
function
(
pages
)
{
pages
:
function
(
pages
)
{
var
data
=
this
.
data
();
if
(
pages
)
{
if
(
pages
<
data
.
totalPages
)
{
if
(
pages
<
data
.
totalPages
)
{
for
(
var
page
=
pages
+
1
;
page
<=
data
.
totalPages
;
page
++
)
for
(
var
page
=
pages
+
1
;
page
<=
data
.
totalPages
;
page
++
)
this
.
turn
(
'removePage'
,
page
);
if
(
this
.
turn
(
'page'
)
>
pages
)
if
(
this
.
turn
(
'page'
)
>
pages
)
this
.
turn
(
'page'
,
pages
);
}
...
...
@@ -885,14 +829,14 @@ var has3d,
// Sets a page without effect
_fitPage
:
function
(
page
,
ok
)
{
_fitPage
:
function
(
page
,
ok
)
{
var
data
=
this
.
data
(),
newView
=
this
.
turn
(
'view'
,
page
);
if
(
data
.
page
!=
page
)
{
if
(
data
.
page
!=
page
)
{
this
.
trigger
(
'turning'
,
[
page
,
newView
]);
if
(
$
.
inArray
(
1
,
newView
)
!=
-
1
)
this
.
trigger
(
'first'
);
if
(
$
.
inArray
(
data
.
totalPages
,
newView
)
!=
-
1
)
this
.
trigger
(
'last'
);
if
(
$
.
inArray
(
1
,
newView
)
!=
-
1
)
this
.
trigger
(
'first'
);
if
(
$
.
inArray
(
data
.
totalPages
,
newView
)
!=
-
1
)
this
.
trigger
(
'last'
);
}
if
(
!
data
.
pageObjs
[
page
])
...
...
@@ -909,22 +853,17 @@ var has3d,
// Turns to a page
_turnPage
:
function
(
page
)
{
_turnPage
:
function
(
page
)
{
var
current
,
next
,
data
=
this
.
data
(),
view
=
this
.
turn
(
'view'
),
newView
=
this
.
turn
(
'view'
,
page
);
// 如果不再中间,就不再翻页
if
(
!
data
.
corner
)
{
return
;
}
if
(
data
.
page
!=
page
)
{
if
(
data
.
page
!=
page
)
{
this
.
trigger
(
'turning'
,
[
page
,
newView
]);
if
(
$
.
inArray
(
1
,
newView
)
!=
-
1
)
this
.
trigger
(
'first'
);
if
(
$
.
inArray
(
data
.
totalPages
,
newView
)
!=
-
1
)
this
.
trigger
(
'last'
);
if
(
$
.
inArray
(
1
,
newView
)
!=
-
1
)
this
.
trigger
(
'first'
);
if
(
$
.
inArray
(
data
.
totalPages
,
newView
)
!=
-
1
)
this
.
trigger
(
'last'
);
}
if
(
!
data
.
pageObjs
[
page
])
...
...
@@ -936,13 +875,13 @@ var has3d,
turnMethods
.
_makeRange
.
call
(
this
);
if
(
data
.
display
==
'single'
)
{
if
(
data
.
display
==
'single'
)
{
current
=
view
[
0
];
next
=
newView
[
0
];
}
else
if
(
view
[
1
]
&&
page
>
view
[
1
])
{
}
else
if
(
view
[
1
]
&&
page
>
view
[
1
])
{
current
=
view
[
1
];
next
=
newView
[
0
];
}
else
if
(
view
[
0
]
&&
page
<
view
[
0
])
{
}
else
if
(
view
[
0
]
&&
page
<
view
[
0
])
{
current
=
view
[
0
];
next
=
newView
[
1
];
}
...
...
@@ -952,13 +891,13 @@ var has3d,
var
opts
=
data
.
pages
[
current
].
data
().
f
.
opts
;
data
.
tpage
=
next
;
if
(
opts
.
next
!=
next
)
{
if
(
opts
.
next
!=
next
)
{
opts
.
next
=
next
;
data
.
pagePlace
[
next
]
=
opts
.
page
;
opts
.
force
=
true
;
}
if
(
data
.
display
==
'single'
)
if
(
data
.
display
==
'single'
)
data
.
pages
[
current
].
flip
(
'turnPage'
,
(
newView
[
0
]
>
view
[
0
])
?
'br'
:
'bl'
);
else
data
.
pages
[
current
].
flip
(
'turnPage'
);
...
...
@@ -968,14 +907,13 @@ var has3d,
// Gets and sets a page
page
:
function
(
page
)
{
page
:
function
(
page
)
{
page
=
parseInt
(
page
,
10
);
var
data
=
this
.
data
();
if
(
page
>
0
&&
page
<=
data
.
totalPages
)
{
if
(
!
data
.
done
||
$
.
inArray
(
page
,
this
.
turn
(
'view'
))
!=
-
1
)
if
(
page
>
0
&&
page
<=
data
.
totalPages
)
{
if
(
!
data
.
done
||
$
.
inArray
(
page
,
this
.
turn
(
'view'
))
!=
-
1
)
turnMethods
.
_fitPage
.
call
(
this
,
page
);
else
turnMethods
.
_turnPage
.
call
(
this
,
page
);
...
...
@@ -989,7 +927,7 @@ var has3d,
// Turns to the next view
next
:
function
()
{
next
:
function
()
{
var
data
=
this
.
data
();
return
this
.
turn
(
'page'
,
turnMethods
.
_view
.
call
(
this
,
data
.
page
).
pop
()
+
1
);
...
...
@@ -998,7 +936,7 @@ var has3d,
// Turns to the previous view
previous
:
function
()
{
previous
:
function
()
{
var
data
=
this
.
data
();
return
this
.
turn
(
'page'
,
turnMethods
.
_view
.
call
(
this
,
data
.
page
).
shift
()
-
1
);
...
...
@@ -1007,7 +945,7 @@ var has3d,
// Adds a motion to the internal list
_addMotionPage
:
function
()
{
_addMotionPage
:
function
()
{
var
opts
=
$
(
this
).
data
().
f
.
opts
,
turn
=
opts
.
turn
,
...
...
@@ -1022,55 +960,41 @@ var has3d,
// This event is called in context of flip
_start
:
function
(
e
,
opts
,
corner
)
{
_start
:
function
(
e
,
opts
,
corner
)
{
var
data
=
opts
.
turn
.
data
(),
event
=
$
.
Event
(
'start'
);
e
.
stopPropagation
();
console
.
log
(
'⭐ _start: corner='
,
corner
,
'opts.page='
,
opts
.
page
,
'opts.next='
,
opts
.
next
);
console
.
log
(
'⭐ _start: display mode='
,
data
.
display
,
'totalPages='
,
data
.
totalPages
);
opts
.
turn
.
trigger
(
event
,
[
opts
,
corner
]);
if
(
event
.
isDefaultPrevented
())
{
console
.
log
(
'⭐ _start: event prevented'
);
e
.
preventDefault
();
return
;
}
if
(
data
.
display
==
'single'
)
{
console
.
log
(
'⭐ _start: single mode processing'
);
var
left
=
corner
.
charAt
(
1
)
==
'l'
;
console
.
log
(
'⭐ _start: left corner='
,
left
,
'page='
,
opts
.
page
,
'totalPages='
,
data
.
totalPages
);
if
(
data
.
display
==
'single'
)
{
if
((
opts
.
page
==
1
&&
left
)
||
(
opts
.
page
==
data
.
totalPages
&&
!
left
))
{
console
.
log
(
'⭐ _start: preventing edge page flip'
);
var
left
=
corner
.
charAt
(
1
)
==
'l'
;
if
((
opts
.
page
==
1
&&
left
)
||
(
opts
.
page
==
data
.
totalPages
&&
!
left
))
e
.
preventDefault
();
}
else
{
else
{
if
(
left
)
{
console
.
log
(
'⭐ _start: left flip, current next='
,
opts
.
next
,
'page='
,
opts
.
page
);
opts
.
next
=
(
opts
.
next
<
opts
.
page
)
?
opts
.
next
:
opts
.
page
-
1
;
opts
.
next
=
(
opts
.
next
<
opts
.
page
)
?
opts
.
next
:
opts
.
page
-
1
;
opts
.
force
=
true
;
console
.
log
(
'⭐ _start: left flip, new next='
,
opts
.
next
,
'force='
,
opts
.
force
);
}
else
{
console
.
log
(
'⭐ _start: right flip, current next='
,
opts
.
next
,
'page='
,
opts
.
page
);
opts
.
next
=
(
opts
.
next
>
opts
.
page
)
?
opts
.
next
:
opts
.
page
+
1
;
console
.
log
(
'⭐ _start: right flip, new next='
,
opts
.
next
);
}
}
else
opts
.
next
=
(
opts
.
next
>
opts
.
page
)
?
opts
.
next
:
opts
.
page
+
1
;
}
}
console
.
log
(
'⭐ _start: final opts.next='
,
opts
.
next
,
'opts.force='
,
opts
.
force
);
turnMethods
.
_addMotionPage
.
call
(
this
);
},
// This event is called in context of flip
_end
:
function
(
e
,
turned
)
{
_end
:
function
(
e
,
turned
)
{
var
that
=
$
(
this
),
data
=
that
.
data
().
f
,
...
...
@@ -1082,7 +1006,7 @@ var has3d,
if
(
turned
||
dd
.
tpage
)
{
if
(
dd
.
tpage
==
opts
.
next
||
dd
.
tpage
==
opts
.
page
)
{
if
(
dd
.
tpage
==
opts
.
next
||
dd
.
tpage
==
opts
.
page
)
{
delete
dd
[
'tpage'
];
turnMethods
.
_fitPage
.
call
(
turn
,
dd
.
tpage
||
opts
.
next
,
true
);
}
...
...
@@ -1096,7 +1020,7 @@ var has3d,
// This event is called in context of flip
_pressed
:
function
()
{
_pressed
:
function
()
{
var
page
,
that
=
$
(
this
),
...
...
@@ -1105,7 +1029,7 @@ var has3d,
pages
=
turn
.
data
().
pages
;
for
(
page
in
pages
)
if
(
page
!=
data
.
opts
.
page
)
if
(
page
!=
data
.
opts
.
page
)
pages
[
page
].
flip
(
'disable'
,
true
);
return
data
.
time
=
new
Date
().
getTime
();
...
...
@@ -1114,32 +1038,25 @@ var has3d,
// This event is called in context of flip
_released
:
function
(
e
,
point
)
{
_released
:
function
(
e
,
point
)
{
var
that
=
$
(
this
),
data
=
that
.
data
().
f
;
e
.
stopPropagation
();
console
.
log
(
'🎯 _released: point='
,
point
,
'data.time='
,
data
.
time
);
console
.
log
(
'🎯 _released: element width='
,
$
(
this
).
width
(),
'time diff='
,
(
new
Date
().
getTime
())
-
data
.
time
);
if
((
new
Date
().
getTime
())
-
data
.
time
<
200
||
point
.
x
<
0
||
point
.
x
>
$
(
this
).
width
())
{
console
.
log
(
'🎯 _released: quick release or out of bounds, preventing default and turning page'
);
console
.
log
(
'🎯 _released: setting tpage to='
,
data
.
opts
.
next
);
if
((
new
Date
().
getTime
())
-
data
.
time
<
300
||
point
.
x
<
0
||
point
.
x
>
$
(
this
).
width
())
{
e
.
preventDefault
();
data
.
opts
.
turn
.
data
().
tpage
=
data
.
opts
.
next
;
data
.
opts
.
turn
.
turn
(
'update'
);
$
(
that
).
flip
(
'turnPage'
);
}
else
{
console
.
log
(
'🎯 _released: normal release, not turning page'
);
}
},
// This event is called in context of flip
_flip
:
function
()
{
_flip
:
function
()
{
var
opts
=
$
(
this
).
data
().
f
.
opts
;
...
...
@@ -1149,30 +1066,30 @@ var has3d,
// Calculate the z-index value for pages during the animation
calculateZ
:
function
(
mv
)
{
calculateZ
:
function
(
mv
)
{
var
i
,
page
,
nextPage
,
placePage
,
dpage
,
that
=
this
,
data
=
this
.
data
(),
view
=
this
.
turn
(
'view'
),
currentPage
=
view
[
0
]
||
view
[
1
],
r
=
{
pageZ
:
{},
partZ
:
{},
pageV
:
{}
},
r
=
{
pageZ
:
{},
partZ
:
{},
pageV
:
{}
},
addView
=
function
(
page
)
{
addView
=
function
(
page
)
{
var
view
=
that
.
turn
(
'view'
,
page
);
if
(
view
[
0
])
r
.
pageV
[
view
[
0
]]
=
true
;
if
(
view
[
1
])
r
.
pageV
[
view
[
1
]]
=
true
;
};
for
(
i
=
0
;
i
<
mv
.
length
;
i
++
)
{
for
(
i
=
0
;
i
<
mv
.
length
;
i
++
)
{
page
=
mv
[
i
];
nextPage
=
data
.
pages
[
page
].
data
().
f
.
opts
.
next
;
placePage
=
data
.
pagePlace
[
page
];
addView
(
page
);
addView
(
nextPage
);
dpage
=
(
data
.
pagePlace
[
nextPage
]
==
nextPage
)
?
nextPage
:
page
;
r
.
pageZ
[
dpage
]
=
data
.
totalPages
-
Math
.
abs
(
currentPage
-
dpage
);
r
.
partZ
[
placePage
]
=
data
.
totalPages
*
2
+
Math
.
abs
(
currentPage
-
dpage
);
dpage
=
(
data
.
pagePlace
[
nextPage
]
==
nextPage
)
?
nextPage
:
page
;
r
.
pageZ
[
dpage
]
=
data
.
totalPages
-
Math
.
abs
(
currentPage
-
dpage
);
r
.
partZ
[
placePage
]
=
data
.
totalPages
*
2
+
Math
.
abs
(
currentPage
-
dpage
);
}
return
r
;
...
...
@@ -1180,12 +1097,12 @@ var has3d,
// Updates the z-index and display property of every page
update
:
function
()
{
update
:
function
()
{
var
page
,
data
=
this
.
data
();
if
(
data
.
pageMv
.
length
&&
data
.
pageMv
[
0
]
!==
0
)
{
if
(
data
.
pageMv
.
length
&&
data
.
pageMv
[
0
]
!==
0
)
{
// Update motion
...
...
@@ -1193,14 +1110,14 @@ var has3d,
pos
=
this
.
turn
(
'calculateZ'
,
data
.
pageMv
),
view
=
this
.
turn
(
'view'
,
data
.
tpage
);
if
(
data
.
pagePlace
[
view
[
0
]]
==
view
[
0
])
apage
=
view
[
0
];
else
if
(
data
.
pagePlace
[
view
[
1
]]
==
view
[
1
])
apage
=
view
[
1
];
if
(
data
.
pagePlace
[
view
[
0
]]
==
view
[
0
])
apage
=
view
[
0
];
else
if
(
data
.
pagePlace
[
view
[
1
]]
==
view
[
1
])
apage
=
view
[
1
];
for
(
page
in
data
.
pageWrap
)
{
if
(
!
has
(
page
,
data
.
pageWrap
))
continue
;
data
.
pageWrap
[
page
].
css
({
display
:
(
pos
.
pageV
[
page
])
?
''
:
'none'
,
'z-index'
:
pos
.
pageZ
[
page
]
||
0
});
data
.
pageWrap
[
page
].
css
({
display
:
(
pos
.
pageV
[
page
])
?
''
:
'none'
,
'z-index'
:
pos
.
pageZ
[
page
]
||
0
});
if
(
data
.
pages
[
page
])
{
data
.
pages
[
page
].
flip
(
'z'
,
pos
.
partZ
[
page
]
||
null
);
...
...
@@ -1221,7 +1138,7 @@ var has3d,
if
(
!
has
(
page
,
data
.
pageWrap
))
continue
;
var
pageLocation
=
turnMethods
.
_setPageLoc
.
call
(
this
,
page
);
if
(
data
.
pages
[
page
])
data
.
pages
[
page
].
flip
(
'disable'
,
data
.
disabled
||
pageLocation
!=
1
).
flip
(
'z'
,
null
);
data
.
pages
[
page
].
flip
(
'disable'
,
data
.
disabled
||
pageLocation
!=
1
).
flip
(
'z'
,
null
);
}
}
},
...
...
@@ -1229,38 +1146,38 @@ var has3d,
// Sets the z-index and display property of a page
// It depends on the current view
_setPageLoc
:
function
(
page
)
{
_setPageLoc
:
function
(
page
)
{
var
data
=
this
.
data
(),
view
=
this
.
turn
(
'view'
);
if
(
page
==
view
[
0
]
||
page
==
view
[
1
])
{
data
.
pageWrap
[
page
].
css
({
'z-index'
:
data
.
totalPages
,
display
:
''
});
if
(
page
==
view
[
0
]
||
page
==
view
[
1
])
{
data
.
pageWrap
[
page
].
css
({
'z-index'
:
data
.
totalPages
,
display
:
''
});
return
1
;
}
else
if
((
data
.
display
==
'single'
&&
page
==
view
[
0
]
+
1
)
||
(
data
.
display
==
'double'
&&
page
==
view
[
0
]
-
2
||
page
==
view
[
1
]
+
2
))
{
data
.
pageWrap
[
page
].
css
({
'z-index'
:
data
.
totalPages
-
1
,
display
:
''
});
}
else
if
((
data
.
display
==
'single'
&&
page
==
view
[
0
]
+
1
)
||
(
data
.
display
==
'double'
&&
page
==
view
[
0
]
-
2
||
page
==
view
[
1
]
+
2
))
{
data
.
pageWrap
[
page
].
css
({
'z-index'
:
data
.
totalPages
-
1
,
display
:
''
});
return
2
;
}
else
{
data
.
pageWrap
[
page
].
css
({
'z-index'
:
0
,
display
:
'none'
});
data
.
pageWrap
[
page
].
css
({
'z-index'
:
0
,
display
:
'none'
});
return
0
;
}
}
},
},
// Methods and properties for the flip page effect
// Methods and properties for the flip page effect
flipMethods
=
{
flipMethods
=
{
// Constructor
init
:
function
(
opts
)
{
init
:
function
(
opts
)
{
if
(
opts
.
gradients
)
{
opts
.
frontGradient
=
true
;
opts
.
backGradient
=
true
;
}
this
.
data
({
f
:
{}
});
this
.
data
({
f
:
{}
});
this
.
flip
(
'options'
,
opts
);
flipMethods
.
_addPageWrapper
.
call
(
this
);
...
...
@@ -1268,7 +1185,7 @@ var has3d,
return
this
;
},
setData
:
function
(
d
)
{
setData
:
function
(
d
)
{
var
data
=
this
.
data
();
...
...
@@ -1277,36 +1194,35 @@ var has3d,
return
this
;
},
options
:
function
(
opts
)
{
options
:
function
(
opts
)
{
var
data
=
this
.
data
().
f
;
if
(
opts
)
{
flipMethods
.
setData
.
call
(
this
,
{
opts
:
$
.
extend
({},
data
.
opts
||
flipOptions
,
opts
)
});
flipMethods
.
setData
.
call
(
this
,
{
opts
:
$
.
extend
({},
data
.
opts
||
flipOptions
,
opts
)
});
return
this
;
}
else
return
data
.
opts
;
},
z
:
function
(
z
)
{
z
:
function
(
z
)
{
var
data
=
this
.
data
().
f
;
data
.
opts
[
'z-index'
]
=
z
;
data
.
fwrapper
.
css
({
'z-index'
:
z
||
parseInt
(
data
.
parent
.
css
(
'z-index'
),
10
)
||
0
});
data
.
fwrapper
.
css
({
'z-index'
:
z
||
parseInt
(
data
.
parent
.
css
(
'z-index'
),
10
)
||
0
});
return
this
;
},
_cAllowed
:
function
()
{
_cAllowed
:
function
()
{
return
corners
[
this
.
data
().
f
.
opts
.
corners
]
||
this
.
data
().
f
.
opts
.
corners
;
},
_cornerActivated
:
function
(
e
)
{
_cornerActivated
:
function
(
e
)
{
if
(
e
.
originalEvent
===
undefined
)
{
console
.
log
(
'📍 _cornerActivated: no originalEvent, returning false'
);
return
false
;
}
...
...
@@ -1316,143 +1232,112 @@ var has3d,
pos
=
data
.
parent
.
offset
(),
width
=
this
.
width
(),
height
=
this
.
height
(),
c
=
{
x
:
Math
.
max
(
0
,
e
[
0
].
pageX
-
pos
.
left
),
y
:
Math
.
max
(
0
,
e
[
0
].
pageY
-
pos
.
top
)
},
c
=
{
x
:
Math
.
max
(
0
,
e
[
0
].
pageX
-
pos
.
left
),
y
:
Math
.
max
(
0
,
e
[
0
].
pageY
-
pos
.
top
)
},
csz
=
data
.
opts
.
cornerSize
,
allowedCorners
=
flipMethods
.
_cAllowed
.
call
(
this
);
console
.
log
(
'📍 _cornerActivated: pos='
,
pos
,
'width='
,
width
,
'height='
,
height
);
console
.
log
(
'📍 _cornerActivated: mouse pos='
,
{
x
:
e
[
0
].
pageX
,
y
:
e
[
0
].
pageY
},
'relative pos='
,
c
);
console
.
log
(
'📍 _cornerActivated: cornerSize='
,
csz
,
'allowedCorners='
,
allowedCorners
);
if
(
c
.
x
<=
0
||
c
.
y
<=
0
||
c
.
x
>=
width
||
c
.
y
>=
height
)
return
false
;
if
(
c
.
x
<=
0
||
c
.
y
<=
0
||
c
.
x
>=
width
||
c
.
y
>=
height
)
{
console
.
log
(
'📍 _cornerActivated: mouse outside bounds, returning false'
);
return
false
;
}
if
(
c
.
y
<
csz
)
c
.
corner
=
't'
;
else
if
(
c
.
y
>=
height
-
csz
)
c
.
corner
=
'b'
;
else
return
false
;
if
(
c
.
y
<
csz
)
c
.
corner
=
't'
;
else
if
(
c
.
y
>=
height
-
csz
)
c
.
corner
=
'b'
;
else
{
console
.
log
(
'📍 _cornerActivated: not in corner zone (y='
,
c
.
y
,
'), returning false'
);
return
false
;
}
if
(
c
.
x
<=
csz
)
c
.
corner
+=
'l'
;
else
if
(
c
.
x
>=
width
-
csz
)
c
.
corner
+=
'r'
;
else
return
false
;
if
(
c
.
x
<=
csz
)
c
.
corner
+=
'l'
;
else
if
(
c
.
x
>=
width
-
csz
)
c
.
corner
+=
'r'
;
else
{
console
.
log
(
'📍 _cornerActivated: not in corner zone (x='
,
c
.
x
,
'), returning false'
);
return
false
;
}
return
(
$
.
inArray
(
c
.
corner
,
allowedCorners
)
==-
1
)
?
false
:
c
;
var
result
=
(
$
.
inArray
(
c
.
corner
,
allowedCorners
)
==
-
1
)
?
false
:
c
;
console
.
log
(
'📍 _cornerActivated: detected corner='
,
c
.
corner
,
'allowed='
,
$
.
inArray
(
c
.
corner
,
allowedCorners
)
!=
-
1
,
'result='
,
result
);
return
result
;
},
_c
:
function
(
corner
,
opts
)
{
_c
:
function
(
corner
,
opts
)
{
opts
=
opts
||
0
;
return
({
tl
:
point2D
(
opts
,
opts
),
tr
:
point2D
(
this
.
width
()
-
opts
,
opts
),
bl
:
point2D
(
opts
,
this
.
height
()
-
opts
),
br
:
point2D
(
this
.
width
()
-
opts
,
this
.
height
()
-
opts
)
})[
corner
];
return
({
tl
:
point2D
(
opts
,
opts
),
tr
:
point2D
(
this
.
width
()
-
opts
,
opts
),
bl
:
point2D
(
opts
,
this
.
height
()
-
opts
),
br
:
point2D
(
this
.
width
()
-
opts
,
this
.
height
()
-
opts
)})[
corner
];
},
_c2
:
function
(
corner
)
{
_c2
:
function
(
corner
)
{
return
{
tl
:
point2D
(
this
.
width
()
*
2
,
0
),
return
{
tl
:
point2D
(
this
.
width
()
*
2
,
0
),
tr
:
point2D
(
-
this
.
width
(),
0
),
bl
:
point2D
(
this
.
width
()
*
2
,
this
.
height
()),
br
:
point2D
(
-
this
.
width
(),
this
.
height
())
}[
corner
];
bl
:
point2D
(
this
.
width
()
*
2
,
this
.
height
()),
br
:
point2D
(
-
this
.
width
(),
this
.
height
())}[
corner
];
},
_foldingPage
:
function
(
corner
)
{
_foldingPage
:
function
(
corner
)
{
var
opts
=
this
.
data
().
f
.
opts
;
console
.
log
(
'📋 _foldingPage: corner='
,
corner
,
'opts.folding='
,
opts
.
folding
);
if
(
opts
.
folding
)
{
console
.
log
(
'📋 _foldingPage: returning opts.folding='
,
opts
.
folding
);
return
opts
.
folding
;
}
else
if
(
opts
.
turn
)
{
if
(
opts
.
folding
)
return
opts
.
folding
;
else
if
(
opts
.
turn
)
{
var
data
=
opts
.
turn
.
data
();
console
.
log
(
'📋 _foldingPage: turn mode, display='
,
data
.
display
,
'opts.next='
,
opts
.
next
);
console
.
log
(
'📋 _foldingPage: pageObjs[next]='
,
!!
data
.
pageObjs
[
opts
.
next
],
'pageObjs[0]='
,
!!
data
.
pageObjs
[
0
]);
if
(
data
.
display
==
'single'
)
{
var
backPage
=
(
data
.
pageObjs
[
opts
.
next
])
?
data
.
pageObjs
[
0
]
:
null
;
console
.
log
(
'📋 _foldingPage: single mode, backPage='
,
!!
backPage
);
if
(
backPage
&&
!
backPage
.
hasClass
(
'turn-page-back-fixed'
))
{
console
.
log
(
'📋 _foldingPage: fixing back page styling'
);
backPage
.
addClass
(
'turn-page-back-fixed'
).
css
({
'background-color'
:
'#ffffff'
,
'background'
:
'#ffffff'
});
}
console
.
log
(
'📋 _foldingPage: returning backPage='
,
!!
backPage
);
return
backPage
;
}
else
{
console
.
log
(
'📋 _foldingPage: double mode, returning pageObjs[next]='
,
!!
data
.
pageObjs
[
opts
.
next
]);
return
data
.
pageObjs
[
opts
.
next
];
}
}
},
_backGradient
:
function
()
{
_backGradient
:
function
()
{
var
data
=
this
.
data
().
f
,
turn
=
data
.
opts
.
turn
,
gradient
=
data
.
opts
.
backGradient
&&
(
!
turn
||
turn
.
data
().
display
==
'single'
||
(
data
.
opts
.
page
!=
2
&&
data
.
opts
.
page
!=
turn
.
data
().
totalPages
-
1
)
);
(
!
turn
||
turn
.
data
().
display
==
'single'
||
(
data
.
opts
.
page
!=
2
&&
data
.
opts
.
page
!=
turn
.
data
().
totalPages
-
1
)
);
if
(
gradient
&&
!
data
.
bshadow
)
data
.
bshadow
=
$
(
'<div/>'
,
divAtt
(
0
,
0
,
1
)).
css
({
'position'
:
''
,
width
:
this
.
width
(),
height
:
this
.
height
()
}).
css
({
'position'
:
''
,
width
:
this
.
width
(),
height
:
this
.
height
()
}).
appendTo
(
data
.
parent
);
return
gradient
;
},
resize
:
function
(
full
)
{
resize
:
function
(
full
)
{
var
data
=
this
.
data
().
f
,
width
=
this
.
width
(),
height
=
this
.
height
(),
size
=
Math
.
round
(
Math
.
sqrt
(
Math
.
pow
(
width
,
2
)
+
Math
.
pow
(
height
,
2
)));
size
=
Math
.
round
(
Math
.
sqrt
(
Math
.
pow
(
width
,
2
)
+
Math
.
pow
(
height
,
2
)));
if
(
full
)
{
data
.
wrapper
.
css
({
width
:
size
,
height
:
size
});
data
.
fwrapper
.
css
({
width
:
size
,
height
:
size
}).
data
.
wrapper
.
css
({
width
:
size
,
height
:
size
});
data
.
fwrapper
.
css
({
width
:
size
,
height
:
size
}).
children
(
':first-child'
).
css
({
width
:
width
,
height
:
height
});
css
({
width
:
width
,
height
:
height
});
data
.
fpage
.
css
({
width
:
height
,
height
:
width
});
data
.
fpage
.
css
({
width
:
height
,
height
:
width
});
if
(
data
.
opts
.
frontGradient
)
data
.
ashadow
.
css
({
width
:
height
,
height
:
width
});
data
.
ashadow
.
css
({
width
:
height
,
height
:
width
});
if
(
flipMethods
.
_backGradient
.
call
(
this
))
data
.
bshadow
.
css
({
width
:
width
,
height
:
height
});
data
.
bshadow
.
css
({
width
:
width
,
height
:
height
});
}
if
(
data
.
parent
.
is
(
':visible'
))
{
data
.
fwrapper
.
css
({
top
:
data
.
parent
.
offset
().
top
,
left
:
data
.
parent
.
offset
().
left
});
data
.
fwrapper
.
css
({
top
:
data
.
parent
.
offset
().
top
,
left
:
data
.
parent
.
offset
().
left
});
if
(
data
.
opts
.
turn
)
data
.
fparent
.
css
({
top
:
-
data
.
opts
.
turn
.
offset
().
top
,
left
:
-
data
.
opts
.
turn
.
offset
().
left
});
data
.
fparent
.
css
({
top
:
-
data
.
opts
.
turn
.
offset
().
top
,
left
:
-
data
.
opts
.
turn
.
offset
().
left
});
}
this
.
flip
(
'z'
,
data
.
opts
[
'z-index'
]);
...
...
@@ -1461,7 +1346,7 @@ var has3d,
// Prepares the page by adding a general wrapper and another objects
_addPageWrapper
:
function
()
{
_addPageWrapper
:
function
()
{
var
att
,
data
=
this
.
data
().
f
,
...
...
@@ -1473,13 +1358,13 @@ var has3d,
top
=
this
.
css
(
'top'
),
width
=
this
.
width
(),
height
=
this
.
height
(),
size
=
Math
.
round
(
Math
.
sqrt
(
Math
.
pow
(
width
,
2
)
+
Math
.
pow
(
height
,
2
)));
size
=
Math
.
round
(
Math
.
sqrt
(
Math
.
pow
(
width
,
2
)
+
Math
.
pow
(
height
,
2
)));
data
.
parent
=
parent
;
data
.
fparent
=
(
data
.
opts
.
turn
)
?
data
.
opts
.
turn
.
data
().
fparent
:
$
(
'#turn-fwrappers'
);
if
(
!
data
.
fparent
)
{
var
fparent
=
$
(
'<div/>'
,
{
css
:
{
'pointer-events'
:
'none'
}
}).
hide
();
var
fparent
=
$
(
'<div/>'
,
{
css
:
{
'pointer-events'
:
'none'
}
}).
hide
();
fparent
.
data
().
flips
=
0
;
if
(
data
.
opts
.
turn
)
{
...
...
@@ -1496,7 +1381,7 @@ var has3d,
data
.
fparent
=
fparent
;
}
this
.
css
({
position
:
'absolute'
,
top
:
0
,
left
:
0
,
bottom
:
'auto'
,
right
:
'auto'
});
this
.
css
({
position
:
'absolute'
,
top
:
0
,
left
:
0
,
bottom
:
'auto'
,
right
:
'auto'
});
data
.
wrapper
=
$
(
'<div/>'
,
divAtt
(
0
,
0
,
this
.
css
(
'z-index'
))).
appendTo
(
parent
).
...
...
@@ -1506,7 +1391,7 @@ var has3d,
hide
().
appendTo
(
data
.
fparent
);
data
.
fpage
=
$
(
'<div/>'
,
{
css
:
{
cursor
:
'default'
,
'background-color'
:
'#ffffff'
}
}).
data
.
fpage
=
$
(
'<div/>'
,
{
css
:
{
cursor
:
'default'
}
}).
appendTo
(
$
(
'<div/>'
,
divAtt
(
0
,
0
,
0
,
'visible'
)).
appendTo
(
data
.
fwrapper
));
...
...
@@ -1526,9 +1411,7 @@ var has3d,
// Takes a 2P point from the screen and applies the transformation
_fold
:
function
(
point
)
{
console
.
log
(
'🔧 _fold: input point='
,
point
);
_fold
:
function
(
point
)
{
var
that
=
this
,
a
=
0
,
...
...
@@ -1554,184 +1437,163 @@ var has3d,
top
=
point
.
corner
.
substr
(
0
,
1
)
==
't'
,
left
=
point
.
corner
.
substr
(
1
,
1
)
==
'l'
,
compute
=
function
()
{
compute
=
function
()
{
var
rel
=
point2D
((
o
.
x
)
?
o
.
x
-
point
.
x
:
point
.
x
,
(
o
.
y
)
?
o
.
y
-
point
.
y
:
point
.
y
),
tan
=
(
Math
.
atan2
(
rel
.
y
,
rel
.
x
)),
middle
;
alpha
=
A90
-
tan
;
a
=
deg
(
alpha
);
middle
=
point2D
((
left
)
?
width
-
rel
.
x
/
2
:
point
.
x
+
rel
.
x
/
2
,
rel
.
y
/
2
);
console
.
log
(
'🔧 _fold compute: rel='
,
rel
,
'alpha='
,
alpha
,
'a='
,
a
,
'middle='
,
middle
);
middle
=
point2D
((
left
)
?
width
-
rel
.
x
/
2
:
point
.
x
+
rel
.
x
/
2
,
rel
.
y
/
2
);
var
gamma
=
alpha
-
Math
.
atan2
(
middle
.
y
,
middle
.
x
),
distance
=
Math
.
max
(
0
,
Math
.
sin
(
gamma
)
*
Math
.
sqrt
(
Math
.
pow
(
middle
.
x
,
2
)
+
Math
.
pow
(
middle
.
y
,
2
)));
tr
=
point2D
(
distance
*
Math
.
sin
(
alpha
),
distance
*
Math
.
cos
(
alpha
));
console
.
log
(
'🔧 _fold compute: gamma='
,
gamma
,
'distance='
,
distance
,
'tr='
,
tr
);
if
(
alpha
>
A90
)
{
tr
.
x
=
tr
.
x
+
Math
.
abs
(
tr
.
y
*
Math
.
tan
(
tan
));
tr
.
y
=
0
;
if
(
Math
.
round
(
tr
.
x
*
Math
.
tan
(
PI
-
alpha
))
<
height
)
{
if
(
Math
.
round
(
tr
.
x
*
Math
.
tan
(
PI
-
alpha
))
<
height
)
{
point
.
y
=
Math
.
sqrt
(
Math
.
pow
(
height
,
2
)
+
2
*
middle
.
x
*
rel
.
x
);
point
.
y
=
Math
.
sqrt
(
Math
.
pow
(
height
,
2
)
+
2
*
middle
.
x
*
rel
.
x
);
if
(
top
)
point
.
y
=
height
-
point
.
y
;
console
.
log
(
'🔧 _fold compute: alpha > A90, recalculating point.y='
,
point
.
y
);
return
compute
();
}
}
if
(
alpha
>
A90
)
{
var
beta
=
PI
-
alpha
,
dd
=
h
-
height
/
Math
.
sin
(
beta
);
mv
=
point2D
(
Math
.
round
(
dd
*
Math
.
cos
(
beta
)),
Math
.
round
(
dd
*
Math
.
sin
(
beta
)));
if
(
alpha
>
A90
)
{
var
beta
=
PI
-
alpha
,
dd
=
h
-
height
/
Math
.
sin
(
beta
);
mv
=
point2D
(
Math
.
round
(
dd
*
Math
.
cos
(
beta
)),
Math
.
round
(
dd
*
Math
.
sin
(
beta
)));
if
(
left
)
mv
.
x
=
-
mv
.
x
;
if
(
top
)
mv
.
y
=
-
mv
.
y
;
console
.
log
(
'🔧 _fold compute: alpha > A90, beta='
,
beta
,
'mv='
,
mv
);
}
px
=
Math
.
round
(
tr
.
y
/
Math
.
tan
(
alpha
)
+
tr
.
x
);
px
=
Math
.
round
(
tr
.
y
/
Math
.
tan
(
alpha
)
+
tr
.
x
);
var
side
=
width
-
px
,
sideX
=
side
*
Math
.
cos
(
alpha
*
2
),
sideY
=
side
*
Math
.
sin
(
alpha
*
2
);
df
=
point2D
(
Math
.
round
((
left
?
side
-
sideX
:
px
+
sideX
)),
Math
.
round
((
top
)
?
sideY
:
height
-
sideY
));
sideX
=
side
*
Math
.
cos
(
alpha
*
2
),
sideY
=
side
*
Math
.
sin
(
alpha
*
2
);
df
=
point2D
(
Math
.
round
(
(
left
?
side
-
sideX
:
px
+
sideX
)),
Math
.
round
((
top
)
?
sideY
:
height
-
sideY
));
console
.
log
(
'🔧 _fold compute: px='
,
px
,
'side='
,
side
,
'df='
,
df
);
// GRADIENTS
gradientSize
=
side
*
Math
.
sin
(
alpha
);
gradientSize
=
side
*
Math
.
sin
(
alpha
);
var
endingPoint
=
flipMethods
.
_c2
.
call
(
that
,
point
.
corner
),
far
=
Math
.
sqrt
(
Math
.
pow
(
endingPoint
.
x
-
point
.
x
,
2
)
+
Math
.
pow
(
endingPoint
.
y
-
point
.
y
,
2
));
far
=
Math
.
sqrt
(
Math
.
pow
(
endingPoint
.
x
-
point
.
x
,
2
)
+
Math
.
pow
(
endingPoint
.
y
-
point
.
y
,
2
));
gradientOpacity
=
(
far
<
width
)
?
far
/
width
:
1
;
gradientOpacity
=
(
far
<
width
)
?
far
/
width
:
1
;
console
.
log
(
'🔧 _fold compute: gradientSize='
,
gradientSize
,
'gradientOpacity='
,
gradientOpacity
);
if
(
data
.
opts
.
frontGradient
)
{
gradientStartV
=
gradientSize
>
100
?
(
gradientSize
-
100
)
/
gradientSize
:
0
;
gradientEndPointA
=
point2D
(
gradientSize
*
Math
.
sin
(
A90
-
alpha
)
/
height
*
100
,
gradientSize
*
Math
.
cos
(
A90
-
alpha
)
/
width
*
100
);
gradientStartV
=
gradientSize
>
100
?
(
gradientSize
-
100
)
/
gradientSize
:
0
;
gradientEndPointA
=
point2D
(
gradientSize
*
Math
.
sin
(
A90
-
alpha
)
/
height
*
100
,
gradientSize
*
Math
.
cos
(
A90
-
alpha
)
/
width
*
100
);
if
(
top
)
gradientEndPointA
.
y
=
100
-
gradientEndPointA
.
y
;
if
(
left
)
gradientEndPointA
.
x
=
100
-
gradientEndPointA
.
x
;
if
(
top
)
gradientEndPointA
.
y
=
100
-
gradientEndPointA
.
y
;
if
(
left
)
gradientEndPointA
.
x
=
100
-
gradientEndPointA
.
x
;
}
if
(
flipMethods
.
_backGradient
.
call
(
that
))
{
gradientEndPointB
=
point2D
(
gradientSize
*
Math
.
sin
(
alpha
)
/
width
*
100
,
gradientSize
*
Math
.
cos
(
alpha
)
/
height
*
100
);
if
(
!
left
)
gradientEndPointB
.
x
=
100
-
gradientEndPointB
.
x
;
if
(
!
top
)
gradientEndPointB
.
y
=
100
-
gradientEndPointB
.
y
;
gradientEndPointB
=
point2D
(
gradientSize
*
Math
.
sin
(
alpha
)
/
width
*
100
,
gradientSize
*
Math
.
cos
(
alpha
)
/
height
*
100
);
if
(
!
left
)
gradientEndPointB
.
x
=
100
-
gradientEndPointB
.
x
;
if
(
!
top
)
gradientEndPointB
.
y
=
100
-
gradientEndPointB
.
y
;
}
//
tr
.
x
=
Math
.
round
(
tr
.
x
);
tr
.
y
=
Math
.
round
(
tr
.
y
);
console
.
log
(
'🔧 _fold compute final: tr='
,
tr
,
'mv='
,
mv
,
'df='
,
df
);
return
true
;
},
transform
=
function
(
tr
,
c
,
x
,
a
)
{
console
.
log
(
'🔧 _fold transform: tr='
,
tr
,
'c='
,
c
,
'x='
,
x
,
'a='
,
a
);
transform
=
function
(
tr
,
c
,
x
,
a
)
{
var
f
=
[
'0'
,
'auto'
],
mvW
=
(
width
-
h
)
*
x
[
0
]
/
100
,
mvH
=
(
height
-
h
)
*
x
[
1
]
/
100
,
v
=
{
left
:
f
[
c
[
0
]],
top
:
f
[
c
[
1
]],
right
:
f
[
c
[
2
]],
bottom
:
f
[
c
[
3
]]
},
aliasingFk
=
(
a
!=
90
&&
a
!=
-
90
)
?
(
left
?
-
1
:
1
)
:
0
;
var
f
=
[
'0'
,
'auto'
],
mvW
=
(
width
-
h
)
*
x
[
0
]
/
100
,
mvH
=
(
height
-
h
)
*
x
[
1
]
/
100
,
v
=
{
left
:
f
[
c
[
0
]],
top
:
f
[
c
[
1
]],
right
:
f
[
c
[
2
]],
bottom
:
f
[
c
[
3
]]
},
aliasingFk
=
(
a
!=
90
&&
a
!=
-
90
)
?
(
left
?
-
1
:
1
)
:
0
;
x
=
x
[
0
]
+
'% '
+
x
[
1
]
+
'%'
;
console
.
log
(
'🔧 _fold transform: mvW='
,
mvW
,
'mvH='
,
mvH
,
'v='
,
v
,
'aliasingFk='
,
aliasingFk
);
that
.
css
(
v
).
transform
(
rotate
(
a
)
+
translate
(
tr
.
x
+
aliasingFk
,
tr
.
y
,
ac
),
x
);
data
.
fpage
.
parent
().
css
(
v
);
data
.
wrapper
.
transform
(
translate
(
-
tr
.
x
+
mvW
-
aliasingFk
,
-
tr
.
y
+
mvH
,
ac
)
+
rotate
(
-
a
),
x
);
data
.
wrapper
.
transform
(
translate
(
-
tr
.
x
+
mvW
-
aliasingFk
,
-
tr
.
y
+
mvH
,
ac
)
+
rotate
(
-
a
),
x
);
data
.
fwrapper
.
transform
(
translate
(
-
tr
.
x
+
mv
.
x
+
mvW
,
-
tr
.
y
+
mv
.
y
+
mvH
,
ac
)
+
rotate
(
-
a
),
x
);
data
.
fpage
.
parent
().
transform
(
rotate
(
a
)
+
translate
(
tr
.
x
+
df
.
x
-
mv
.
x
,
tr
.
y
+
df
.
y
-
mv
.
y
,
ac
),
x
);
if
(
data
.
opts
.
frontGradient
)
gradient
(
data
.
ashadow
,
point2D
(
left
?
100
:
0
,
top
?
100
:
0
),
point2D
(
left
?
100
:
0
,
top
?
100
:
0
),
point2D
(
gradientEndPointA
.
x
,
gradientEndPointA
.
y
),
[[
gradientStartV
,
'rgba(0,0,0,0)'
],
[((
1
-
gradientStartV
)
*
0.8
)
+
gradientStartV
,
'rgba(0,0,0,'
+
(
0.2
*
gradientOpacity
)
+
')'
],
[
1
,
'rgba(255,255,255,'
+
(
0.2
*
gradientOpacity
)
+
')'
]],
[((
1
-
gradientStartV
)
*
0.8
)
+
gradientStartV
,
'rgba(0,0,0,'
+
(
0.2
*
gradientOpacity
)
+
')'
],
[
1
,
'rgba(255,255,255,'
+
(
0.2
*
gradientOpacity
)
+
')'
]],
3
,
alpha
);
if
(
flipMethods
.
_backGradient
.
call
(
that
))
gradient
(
data
.
bshadow
,
point2D
(
left
?
0
:
100
,
top
?
0
:
100
),
point2D
(
left
?
0
:
100
,
top
?
0
:
100
),
point2D
(
gradientEndPointB
.
x
,
gradientEndPointB
.
y
),
[[
0.8
,
'rgba(0,0,0,0)'
],
[
1
,
'rgba(0,0,0,'
+
(
0.3
*
gradientOpacity
)
+
')'
],
[
1
,
'rgba(0,0,0,'
+
(
0.3
*
gradientOpacity
)
+
')'
],
[
1
,
'rgba(0,0,0,0)'
]],
3
);
};
console
.
log
(
'🔧 _fold: width='
,
width
,
'height='
,
height
,
'corner='
,
point
.
corner
);
console
.
log
(
'🔧 _fold: o='
,
o
,
'top='
,
top
,
'left='
,
left
);
switch
(
point
.
corner
)
{
case
'tl'
:
case
'tl'
:
point
.
x
=
Math
.
max
(
point
.
x
,
1
);
compute
();
transform
(
tr
,
[
1
,
0
,
0
,
1
],
[
100
,
0
],
a
);
data
.
fpage
.
transform
(
translate
(
-
height
,
-
width
,
ac
)
+
rotate
(
90
-
a
*
2
)
,
'100% 100%'
);
transform
(
tr
,
[
1
,
0
,
0
,
1
],
[
100
,
0
],
a
);
data
.
fpage
.
transform
(
translate
(
-
height
,
-
width
,
ac
)
+
rotate
(
90
-
a
*
2
)
,
'100% 100%'
);
folding
.
transform
(
rotate
(
90
)
+
translate
(
0
,
-
height
,
ac
),
'0% 0%'
);
console
.
log
(
'🔧 _fold: tl case processed'
);
break
;
case
'tr'
:
point
.
x
=
Math
.
min
(
point
.
x
,
width
-
1
);
case
'tr'
:
point
.
x
=
Math
.
min
(
point
.
x
,
width
-
1
);
compute
();
transform
(
point2D
(
-
tr
.
x
,
tr
.
y
),
[
0
,
0
,
0
,
1
],
[
0
,
0
],
-
a
);
data
.
fpage
.
transform
(
translate
(
0
,
-
width
,
ac
)
+
rotate
(
-
90
+
a
*
2
)
,
'0% 100%'
);
transform
(
point2D
(
-
tr
.
x
,
tr
.
y
),
[
0
,
0
,
0
,
1
],
[
0
,
0
],
-
a
);
data
.
fpage
.
transform
(
translate
(
0
,
-
width
,
ac
)
+
rotate
(
-
90
+
a
*
2
)
,
'0% 100%'
);
folding
.
transform
(
rotate
(
270
)
+
translate
(
-
width
,
0
,
ac
),
'0% 0%'
);
console
.
log
(
'🔧 _fold: tr case processed'
);
break
;
case
'bl'
:
case
'bl'
:
point
.
x
=
Math
.
max
(
point
.
x
,
1
);
compute
();
transform
(
point2D
(
tr
.
x
,
-
tr
.
y
),
[
1
,
1
,
0
,
0
],
[
100
,
100
],
-
a
);
data
.
fpage
.
transform
(
translate
(
-
height
,
0
,
ac
)
+
rotate
(
-
90
+
a
*
2
),
'100% 0%'
);
transform
(
point2D
(
tr
.
x
,
-
tr
.
y
),
[
1
,
1
,
0
,
0
],
[
100
,
100
],
-
a
);
data
.
fpage
.
transform
(
translate
(
-
height
,
0
,
ac
)
+
rotate
(
-
90
+
a
*
2
),
'100% 0%'
);
folding
.
transform
(
rotate
(
270
)
+
translate
(
-
width
,
0
,
ac
),
'0% 0%'
);
console
.
log
(
'🔧 _fold: bl case processed'
);
break
;
case
'br'
:
point
.
x
=
Math
.
min
(
point
.
x
,
width
-
1
);
case
'br'
:
point
.
x
=
Math
.
min
(
point
.
x
,
width
-
1
);
compute
();
transform
(
point2D
(
-
tr
.
x
,
-
tr
.
y
),
[
0
,
1
,
1
,
0
],
[
0
,
100
],
a
);
data
.
fpage
.
transform
(
rotate
(
90
-
a
*
2
),
'0% 0%'
);
transform
(
point2D
(
-
tr
.
x
,
-
tr
.
y
),
[
0
,
1
,
1
,
0
],
[
0
,
100
],
a
);
data
.
fpage
.
transform
(
rotate
(
90
-
a
*
2
),
'0% 0%'
);
folding
.
transform
(
rotate
(
90
)
+
translate
(
0
,
-
height
,
ac
),
'0% 0%'
);
console
.
log
(
'🔧 _fold: br case processed'
);
break
;
}
data
.
point
=
point
;
console
.
log
(
'🔧 _fold: final data.point='
,
data
.
point
);
},
_moveFoldingPage
:
function
(
bool
)
{
_moveFoldingPage
:
function
(
bool
)
{
var
data
=
this
.
data
().
f
,
folding
=
flipMethods
.
_foldingPage
.
call
(
this
);
if
(
folding
)
{
if
(
bool
)
{
if
(
!
data
.
fpage
.
children
()[
data
.
ashadow
?
'1'
:
'0'
])
{
flipMethods
.
setData
.
call
(
this
,
{
backParent
:
folding
.
parent
()
});
if
(
!
data
.
fpage
.
children
()[
data
.
ashadow
?
'1'
:
'0'
])
{
flipMethods
.
setData
.
call
(
this
,
{
backParent
:
folding
.
parent
()
});
data
.
fpage
.
prepend
(
folding
);
}
}
else
{
...
...
@@ -1743,45 +1605,34 @@ var has3d,
},
_showFoldedPage
:
function
(
c
,
animate
)
{
_showFoldedPage
:
function
(
c
,
animate
)
{
var
folding
=
flipMethods
.
_foldingPage
.
call
(
this
),
dd
=
this
.
data
(),
data
=
dd
.
f
;
console
.
log
(
'📄 _showFoldedPage: corner='
,
c
,
'animate='
,
animate
);
console
.
log
(
'📄 _showFoldedPage: folding='
,
!!
folding
,
'current data.point='
,
data
.
point
);
if
(
!
data
.
point
||
data
.
point
.
corner
!=
c
.
corner
)
{
console
.
log
(
'📄 _showFoldedPage: triggering start event, old point corner='
,
data
.
point
?.
corner
,
'new corner='
,
c
.
corner
);
if
(
!
data
.
point
||
data
.
point
.
corner
!=
c
.
corner
)
{
var
event
=
$
.
Event
(
'start'
);
this
.
trigger
(
event
,
[
data
.
opts
,
c
.
corner
]);
if
(
event
.
isDefaultPrevented
())
{
console
.
log
(
'📄 _showFoldedPage: start event prevented, returning false'
);
if
(
event
.
isDefaultPrevented
())
return
false
;
}
}
if
(
folding
)
{
if
(
animate
)
{
console
.
log
(
'📄 _showFoldedPage: animating fold'
);
var
that
=
this
,
point
=
(
data
.
point
&&
data
.
point
.
corner
==
c
.
corner
)
?
data
.
point
:
flipMethods
.
_c
.
call
(
this
,
c
.
corner
,
1
);
console
.
log
(
'📄 _showFoldedPage: animation from point='
,
point
,
'to='
,
{
x
:
c
.
x
,
y
:
c
.
y
});
var
that
=
this
,
point
=
(
data
.
point
&&
data
.
point
.
corner
==
c
.
corner
)
?
data
.
point
:
flipMethods
.
_c
.
call
(
this
,
c
.
corner
,
1
);
this
.
animatef
({
from
:
[
point
.
x
,
point
.
y
],
to
:
[
c
.
x
,
c
.
y
],
duration
:
500
,
frame
:
function
(
v
)
{
this
.
animatef
({
from
:
[
point
.
x
,
point
.
y
],
to
:[
c
.
x
,
c
.
y
],
duration
:
500
,
frame
:
function
(
v
)
{
c
.
x
=
Math
.
round
(
v
[
0
]);
c
.
y
=
Math
.
round
(
v
[
1
]);
flipMethods
.
_fold
.
call
(
that
,
c
);
}
});
}});
}
else
{
console
.
log
(
'📄 _showFoldedPage: direct fold without animation'
);
flipMethods
.
_fold
.
call
(
this
,
c
);
if
(
dd
.
effect
&&
!
dd
.
effect
.
turning
)
...
...
@@ -1790,7 +1641,6 @@ var has3d,
}
if
(
!
data
.
fwrapper
.
is
(
':visible'
))
{
console
.
log
(
'📄 _showFoldedPage: showing fwrapper, flips count='
,
data
.
fparent
.
data
().
flips
);
data
.
fparent
.
show
().
data
().
flips
++
;
flipMethods
.
_moveFoldingPage
.
call
(
this
,
true
);
data
.
fwrapper
.
show
();
...
...
@@ -1799,23 +1649,21 @@ var has3d,
data
.
bshadow
.
show
();
}
console
.
log
(
'📄 _showFoldedPage: success, returning true'
);
return
true
;
}
console
.
log
(
'📄 _showFoldedPage: no folding page, returning false'
);
return
false
;
},
hide
:
function
()
{
hide
:
function
()
{
var
data
=
this
.
data
().
f
,
folding
=
flipMethods
.
_foldingPage
.
call
(
this
);
if
((
--
data
.
fparent
.
data
().
flips
)
===
0
)
if
((
--
data
.
fparent
.
data
().
flips
)
===
0
)
data
.
fparent
.
hide
();
this
.
css
({
left
:
0
,
top
:
0
,
right
:
'auto'
,
bottom
:
'auto'
}).
transform
(
''
,
'0% 100%'
);
this
.
css
({
left
:
0
,
top
:
0
,
right
:
'auto'
,
bottom
:
'auto'
}).
transform
(
''
,
'0% 100%'
);
data
.
wrapper
.
transform
(
''
,
'0% 100%'
);
...
...
@@ -1829,46 +1677,35 @@ var has3d,
return
this
;
},
hideFoldedPage
:
function
(
animate
)
{
hideFoldedPage
:
function
(
animate
)
{
var
data
=
this
.
data
().
f
;
var
data
=
this
.
data
().
f
;
console
.
log
(
'🙈 hideFoldedPage: animate='
,
animate
,
'data.point='
,
data
.
point
);
if
(
!
data
.
point
)
{
console
.
log
(
'🙈 hideFoldedPage: no point to hide, returning'
);
return
;
}
if
(
!
data
.
point
)
return
;
var
that
=
this
,
p1
=
data
.
point
,
hide
=
function
()
{
console
.
log
(
'🙈 hideFoldedPage hide function: clearing point and hiding'
);
hide
=
function
()
{
data
.
point
=
null
;
that
.
flip
(
'hide'
);
that
.
trigger
(
'end'
,
[
false
]);
};
console
.
log
(
'🙈 hideFoldedPage: p1='
,
p1
);
if
(
animate
)
{
var
p4
=
flipMethods
.
_c
.
call
(
this
,
p1
.
corner
),
top
=
(
p1
.
corner
.
substr
(
0
,
1
)
==
't'
),
delta
=
(
top
)
?
Math
.
min
(
0
,
p1
.
y
-
p4
.
y
)
/
2
:
Math
.
max
(
0
,
p1
.
y
-
p4
.
y
)
/
2
,
p2
=
point2D
(
p1
.
x
,
p1
.
y
+
delta
),
p3
=
point2D
(
p4
.
x
,
p4
.
y
-
delta
);
console
.
log
(
'🙈 hideFoldedPage animate: p4='
,
p4
,
'top='
,
top
,
'delta='
,
delta
);
console
.
log
(
'🙈 hideFoldedPage animate: p2='
,
p2
,
'p3='
,
p3
);
top
=
(
p1
.
corner
.
substr
(
0
,
1
)
==
't'
),
delta
=
(
top
)
?
Math
.
min
(
0
,
p1
.
y
-
p4
.
y
)
/
2
:
Math
.
max
(
0
,
p1
.
y
-
p4
.
y
)
/
2
,
p2
=
point2D
(
p1
.
x
,
p1
.
y
+
delta
),
p3
=
point2D
(
p4
.
x
,
p4
.
y
-
delta
);
this
.
animatef
({
from
:
0
,
to
:
1
,
frame
:
function
(
v
)
{
frame
:
function
(
v
)
{
var
np
=
bezier
(
p1
,
p2
,
p3
,
p4
,
v
);
p1
.
x
=
np
.
x
;
p1
.
y
=
np
.
y
;
console
.
log
(
'🙈 hideFoldedPage animation: v='
,
v
,
'np='
,
np
);
flipMethods
.
_fold
.
call
(
that
,
p1
);
},
complete
:
hide
,
...
...
@@ -1877,208 +1714,155 @@ var has3d,
});
}
else
{
console
.
log
(
'🙈 hideFoldedPage: immediate hide without animation'
);
this
.
animatef
(
false
);
hide
();
}
},
turnPage
:
function
(
corner
)
{
turnPage
:
function
(
corner
)
{
var
that
=
this
,
data
=
this
.
data
().
f
;
corner
=
{
corner
:
(
data
.
corner
)
?
data
.
corner
.
corner
:
corner
||
flipMethods
.
_cAllowed
.
call
(
this
)[
0
]
};
corner
=
{
corner
:
(
data
.
corner
)
?
data
.
corner
.
corner
:
corner
||
flipMethods
.
_cAllowed
.
call
(
this
)[
0
]
};
console
.
log
(
'📖 turnPage: input corner='
,
corner
,
'data.corner='
,
data
.
corner
);
console
.
log
(
'📖 turnPage: data.point='
,
data
.
point
,
'data.opts='
,
data
.
opts
);
var
p1
,
p4
;
if
(
data
.
point
&&
data
.
point
.
corner
===
corner
.
corner
)
{
p1
=
{
x
:
data
.
point
.
x
,
y
:
data
.
point
.
y
,
corner
:
data
.
point
.
corner
};
console
.
log
(
'📖 turnPage: using existing point='
,
p1
);
}
else
{
var
elevation
=
(
data
.
opts
.
turn
)
?
data
.
opts
.
turn
.
data
().
opts
.
elevation
||
0
:
0
;
p1
=
flipMethods
.
_c
.
call
(
this
,
corner
.
corner
,
elevation
);
p1
.
corner
=
corner
.
corner
;
console
.
log
(
'📖 turnPage: created new point='
,
p1
,
'elevation='
,
elevation
);
}
var
p1
=
data
.
point
||
flipMethods
.
_c
.
call
(
this
,
corner
.
corner
,
(
data
.
opts
.
turn
)
?
data
.
opts
.
turn
.
data
().
opts
.
elevation
:
0
),
p4
=
flipMethods
.
_c2
.
call
(
this
,
corner
.
corner
);
console
.
log
(
'📖 turnPage: p1='
,
p1
,
'p4='
,
p4
);
console
.
log
(
'📖 turnPage: starting animation with duration='
,
data
.
opts
.
duration
);
this
.
trigger
(
'flip'
).
animatef
({
from
:
0
,
to
:
1
,
frame
:
function
(
v
)
{
frame
:
function
(
v
)
{
var
np
=
bezier
(
p1
,
p1
,
p4
,
p4
,
v
);
corner
.
x
=
np
.
x
;
corner
.
y
=
np
.
y
;
console
.
log
(
'📖 turnPage animation: v='
,
v
,
'np='
,
np
);
flipMethods
.
_showFoldedPage
.
call
(
that
,
corner
);
},
complete
:
function
()
{
console
.
log
(
'📖 turnPage: animation complete'
);
complete
:
function
()
{
that
.
trigger
(
'end'
,
[
true
]);
},
duration
:
data
.
opts
.
duration
,
turning
:
true
});
console
.
log
(
'📖 turnPage: clearing corner and point'
);
data
.
corner
=
null
;
data
.
point
=
null
;
},
moving
:
function
()
{
moving
:
function
()
{
return
'effect'
in
this
.
data
();
},
isTurning
:
function
()
{
isTurning
:
function
()
{
return
this
.
flip
(
'moving'
)
&&
this
.
data
().
effect
.
turning
;
},
_eventStart
:
function
(
e
)
{
_eventStart
:
function
(
e
)
{
var
data
=
this
.
data
().
f
;
console
.
log
(
'🚀 _eventStart: disabled='
,
data
.
disabled
,
'isTurning='
,
this
.
flip
(
'isTurning'
));
console
.
log
(
'🚀 _eventStart: current data.point='
,
data
.
point
,
'data.corner='
,
data
.
corner
);
console
.
log
(
'🚀 _eventStart: page='
,
data
.
opts
.
page
,
'element='
,
this
.
get
(
0
));
if
(
!
data
.
disabled
&&
!
this
.
flip
(
'isTurning'
))
{
// 修复: 在开始新的拖动前清理旧状态
console
.
log
(
'🚀 _eventStart: clearing old point state, was='
,
data
.
point
);
data
.
point
=
null
;
data
.
corner
=
flipMethods
.
_cornerActivated
.
call
(
this
,
e
);
console
.
log
(
'🚀 _eventStart: corner activated result='
,
data
.
corner
);
if
(
data
.
corner
&&
flipMethods
.
_foldingPage
.
call
(
this
,
data
.
corner
))
{
console
.
log
(
'🚀 _eventStart: corner valid, moving folding page and triggering pressed'
);
flipMethods
.
_moveFoldingPage
.
call
(
this
,
true
);
// 🔧 _pressed函数不使用参数,所以传递什么都无关紧要
// 关键是确保在_eventMove中正确设置data.point
console
.
log
(
'🚀 _eventStart: triggering pressed event'
);
this
.
trigger
(
'pressed'
);
this
.
trigger
(
'pressed'
,
[
data
.
point
]);
return
false
;
}
else
{
console
.
log
(
'🚀 _eventStart: corner invalid or no folding page, clearing corner'
);
}
else
data
.
corner
=
null
;
}
}
},
_eventMove
:
function
(
e
)
{
_eventMove
:
function
(
e
)
{
var
data
=
this
.
data
().
f
;
if
(
!
data
.
disabled
)
{
e
=
(
isTouch
)
?
e
.
originalEvent
.
touches
:
[
e
];
console
.
log
(
'🔄 _eventMove: disabled='
,
data
.
disabled
,
'hasCorner='
,
!!
data
.
corner
);
if
(
data
.
corner
)
{
var
pos
=
data
.
parent
.
offset
();
console
.
log
(
'🔄 _eventMove: parent offset='
,
pos
,
'raw mouse='
,
{
x
:
e
[
0
].
pageX
,
y
:
e
[
0
].
pageY
});
data
.
corner
.
x
=
e
[
0
].
pageX
-
pos
.
left
;
data
.
corner
.
y
=
e
[
0
].
pageY
-
pos
.
top
;
data
.
corner
.
x
=
e
[
0
].
pageX
-
pos
.
left
;
data
.
corner
.
y
=
e
[
0
].
pageY
-
pos
.
top
;
console
.
log
(
'🔄 _eventMove: updated corner position='
,
{
x
:
data
.
corner
.
x
,
y
:
data
.
corner
.
y
,
corner
:
data
.
corner
.
corner
});
flipMethods
.
_showFoldedPage
.
call
(
this
,
data
.
corner
);
}
else
if
(
!
this
.
data
().
effect
&&
this
.
is
(
':visible'
))
{
// roll over
console
.
log
(
'🔄 _eventMove: rollover mode, checking corner activation'
);
var
corner
=
flipMethods
.
_cornerActivated
.
call
(
this
,
e
[
0
]);
if
(
corner
)
{
console
.
log
(
'🔄 _eventMove: rollover corner detected='
,
corner
.
corner
);
var
origin
=
flipMethods
.
_c
.
call
(
this
,
corner
.
corner
,
data
.
opts
.
cornerSize
/
2
);
var
origin
=
flipMethods
.
_c
.
call
(
this
,
corner
.
corner
,
data
.
opts
.
cornerSize
/
2
);
corner
.
x
=
origin
.
x
;
corner
.
y
=
origin
.
y
;
console
.
log
(
'🔄 _eventMove: rollover showing folded page at origin='
,
origin
);
flipMethods
.
_showFoldedPage
.
call
(
this
,
corner
,
true
);
}
else
{
console
.
log
(
'🔄 _eventMove: rollover no corner, hiding folded page'
);
// flipMethods.hideFoldedPage.call(this, true);
// data.point = null;
}
else
flipMethods
.
hideFoldedPage
.
call
(
this
,
true
);
}
}
},
_eventEnd
:
function
()
{
_eventEnd
:
function
()
{
var
data
=
this
.
data
().
f
;
console
.
log
(
'🏁 _eventEnd: disabled='
,
data
.
disabled
,
'hasPoint='
,
!!
data
.
point
);
console
.
log
(
'🏁 _eventEnd: data.point='
,
data
.
point
,
'data.corner='
,
data
.
corner
);
if
(
!
data
.
disabled
&&
data
.
point
)
{
var
event
=
$
.
Event
(
'released'
);
console
.
log
(
'🏁 _eventEnd: triggering released event with point='
,
data
.
point
);
this
.
trigger
(
event
,
[
data
.
point
]);
if
(
!
event
.
isDefaultPrevented
())
{
console
.
log
(
'🏁 _eventEnd: released event not prevented, hiding folded page'
);
if
(
!
event
.
isDefaultPrevented
())
flipMethods
.
hideFoldedPage
.
call
(
this
,
true
);
}
else
{
console
.
log
(
'🏁 _eventEnd: released event was prevented'
);
}
}
console
.
log
(
'🏁 _eventEnd: clearing corner, was='
,
data
.
corner
);
data
.
corner
=
null
;
},
disable
:
function
(
disable
)
{
disable
:
function
(
disable
)
{
flipMethods
.
setData
.
call
(
this
,
{
'disabled'
:
disable
});
flipMethods
.
setData
.
call
(
this
,
{
'disabled'
:
disable
});
return
this
;
}
},
},
cla
=
function
(
that
,
methods
,
args
)
{
cla
=
function
(
that
,
methods
,
args
)
{
if
(
!
args
[
0
]
||
typeof
(
args
[
0
])
==
'object'
)
if
(
!
args
[
0
]
||
typeof
(
args
[
0
])
==
'object'
)
return
methods
.
init
.
apply
(
that
,
args
);
else
if
(
methods
[
args
[
0
]]
&&
args
[
0
].
toString
().
substr
(
0
,
1
)
!=
'_'
)
else
if
(
methods
[
args
[
0
]]
&&
args
[
0
].
toString
().
substr
(
0
,
1
)
!=
'_'
)
return
methods
[
args
[
0
]].
apply
(
that
,
Array
.
prototype
.
slice
.
call
(
args
,
1
));
else
throw
args
[
0
]
+
' is an invalid value'
;
};
};
$
.
extend
(
$
.
fn
,
{
flip
:
function
(
req
,
opts
)
{
flip
:
function
(
req
,
opts
)
{
return
cla
(
this
,
flipMethods
,
arguments
);
},
turn
:
function
(
req
)
{
turn
:
function
(
req
)
{
return
cla
(
this
,
turnMethods
,
arguments
);
},
transform
:
function
(
transform
,
origin
)
{
transform
:
function
(
transform
,
origin
)
{
var
properties
=
{};
if
(
origin
)
properties
[
vendor
+
'transform-origin'
]
=
origin
;
properties
[
vendor
+
'transform-origin'
]
=
origin
;
properties
[
vendor
+
'transform'
]
=
transform
;
properties
[
vendor
+
'transform'
]
=
transform
;
return
this
.
css
(
properties
);
},
animatef
:
function
(
point
)
{
animatef
:
function
(
point
)
{
var
data
=
this
.
data
();
...
...
@@ -2089,23 +1873,23 @@ $.extend($.fn, {
if
(
!
point
.
to
.
length
)
point
.
to
=
[
point
.
to
];
if
(
!
point
.
from
.
length
)
point
.
from
=
[
point
.
from
];
if
(
!
point
.
easing
)
point
.
easing
=
function
(
x
,
t
,
b
,
c
,
data
)
{
return
c
*
Math
.
sqrt
(
1
-
(
t
=
t
/
data
-
1
)
*
t
)
+
b
;
};
if
(
!
point
.
easing
)
point
.
easing
=
function
(
x
,
t
,
b
,
c
,
data
)
{
return
c
*
Math
.
sqrt
(
1
-
(
t
=
t
/
data
-
1
)
*
t
)
+
b
;
};
var
j
,
diff
=
[],
len
=
point
.
to
.
length
,
that
=
this
,
fps
=
point
.
fps
||
30
,
time
=
-
fps
,
f
=
function
()
{
f
=
function
()
{
var
j
,
v
=
[];
time
=
Math
.
min
(
point
.
duration
,
time
+
fps
);
for
(
j
=
0
;
j
<
len
;
j
++
)
v
.
push
(
point
.
easing
(
1
,
time
,
point
.
from
[
j
],
diff
[
j
],
point
.
duration
));
point
.
frame
((
len
==
1
)
?
v
[
0
]
:
v
);
point
.
frame
((
len
==
1
)
?
v
[
0
]
:
v
);
if
(
time
==
point
.
duration
)
{
if
(
time
==
point
.
duration
)
{
clearInterval
(
data
.
effect
.
handle
);
delete
data
[
'effect'
];
that
.
data
(
data
);
...
...
src/components/BookReader/index.vue
浏览文件 @
72882efa
...
...
@@ -156,8 +156,7 @@
<
script
setup
>
import
$
from
"jquery"
;
import
"turn.js"
;
// import turn from "@/assets/js/turn.js";
import
turn
from
"@/assets/js/turn.js"
;
import
{
ref
,
onMounted
,
onUnmounted
,
watch
,
nextTick
,
computed
}
from
"vue"
;
import
VueEasyLightbox
from
"vue-easy-lightbox"
;
import
GuideMobile
from
"../GuideMobile/index.vue"
;
...
...
@@ -233,14 +232,15 @@ const handleTouchEnd = throttle((e) => {
const
deltaX
=
touchEndX
-
touchStartX
.
value
;
const
deltaY
=
touchEndY
-
touchStartY
.
value
;
// 这里与卷边的移动冲突,需要处理得更优雅
// 如果水平滑动距离大于垂直滑动距离,且大于50px,则触发翻页
if
(
Math
.
abs
(
deltaX
)
>
Math
.
abs
(
deltaY
)
&&
Math
.
abs
(
deltaX
)
>
50
)
{
if
(
deltaX
>
0
)
{
previousPage
();
}
else
{
nextPage
();
}
}
//
if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > 50) {
//
if (deltaX > 0) {
//
previousPage();
//
} else {
//
nextPage();
//
}
//
}
});
// 修改处理页面的函数,只处理必要的属性
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论