Skip to content

Commit 4fb36da

Browse files
committed
feat: add click to turn page btn
1 parent 7964efc commit 4fb36da

7 files changed

Lines changed: 95 additions & 28 deletions

File tree

epub_browser/assets/book.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,8 @@ function initScript() {
137137
var el = document.querySelector('.container');
138138
if (!isKindleMode()) {
139139
var sortable = Sortable.create(el, {
140-
delay: 10, // 延迟100ms后才开始拖动,给用户选择文字的时间
141-
delayOnTouchOnly: false, // 在触摸设备上也应用延迟
140+
delay: 300, // 延迟300ms后才开始拖动,避免移动端滑动时误触发
141+
delayOnTouchOnly: true, // 只在触摸设备上应用延迟
142142
filter: '.toc-container', // 允许直接选择文字
143143
preventOnFilter: false, // 过滤时不阻止默认行为
144144
onEnd: function(evt) {

epub_browser/assets/chapter.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1047,7 +1047,7 @@ body {
10471047
}
10481048

10491049
@media (max-width: 768px) {
1050-
.container {
1050+
body:not(.pagination-mode) .container {
10511051
width: 100%;
10521052
}
10531053

epub_browser/assets/chapter.js

Lines changed: 76 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ function initScript() {
332332
const progressFill = document.getElementById('progressBar');
333333
const pageHeightSetBtn = document.querySelector("#setPageHeight");
334334
const pageHeightInput = document.querySelector("#pageHeightInput");
335+
const toggleClickPageBtn = document.getElementById('toggleClickPage');
335336

336337
// 生成存储键名
337338
function getStorageKey(mode) {
@@ -347,6 +348,7 @@ function initScript() {
347348
let totalPages = 0;
348349
let contentWidth = 0;
349350
let pageWidth = 0;
351+
let isClickPageEnabled = false; // 点击翻页功能状态
350352

351353
let fontSize = "small";
352354
let fontFamily = "system-ui, -apple-system, sans-serif";
@@ -386,8 +388,8 @@ function initScript() {
386388
var el = document.querySelector('.container');
387389
if (!isKindleMode()) {
388390
var sortable = Sortable.create(el, {
389-
delay: 10, // 延迟100ms后才开始拖动,给用户选择文字的时间
390-
delayOnTouchOnly: false, // 在触摸设备上也应用延迟
391+
delay: 300, // 延迟300ms后才开始拖动,避免移动端滑动时误触发
392+
delayOnTouchOnly: true, // 只在触摸设备上应用延迟
391393
filter: '#eb-content, #pageJumpInput, .page-height-adjustment, #customCssInput', // 允许直接选择#eb-content中的文字
392394
preventOnFilter: false, // 过滤时不阻止默认行为
393395
onStart: function(evt) {
@@ -982,22 +984,79 @@ function initScript() {
982984
}
983985
});
984986

985-
// 监听点击事件
986-
if (isKindleMode()) {
987-
content.addEventListener('click', function(e) {
988-
const screenWidth = window.innerWidth;
989-
const targetArea = screenWidth * 0.2;
990-
991-
// 左侧40px内点击
992-
if (e.clientX < targetArea) {
993-
prevPageBtn.click();
994-
}
995-
// 右侧40px内点击
996-
else if (e.clientX > screenWidth - targetArea) {
997-
nextPageBtn.click();
998-
}
999-
});
987+
// 点击翻页功能
988+
function handleClickPage(e) {
989+
if (!isClickPageEnabled || !isPaginationMode) return;
990+
991+
const screenWidth = window.innerWidth;
992+
const targetArea = screenWidth * 0.2;
993+
994+
// 左侧20%区域点击
995+
if (e.clientX < targetArea) {
996+
prevPageBtn.click();
997+
}
998+
// 右侧20%区域点击
999+
else if (e.clientX > screenWidth - targetArea) {
1000+
nextPageBtn.click();
1001+
}
1002+
}
1003+
1004+
// 初始化点击翻页功能状态
1005+
function initClickPageState() {
1006+
if (!isKindleMode()) {
1007+
isClickPageEnabled = localStorage.getItem('clickPageEnabled') === 'true';
1008+
} else {
1009+
isClickPageEnabled = getCookie('clickPageEnabled') === 'true';
1010+
}
1011+
updateClickPageButton();
1012+
1013+
// 如果是 Kindle 模式,默认开启点击翻页
1014+
if (isKindleMode() && localStorage.getItem('clickPageEnabled') === null && getCookie('clickPageEnabled') === null) {
1015+
isClickPageEnabled = true;
1016+
saveClickPageState();
1017+
}
10001018
}
1019+
1020+
// 保存点击翻页功能状态
1021+
function saveClickPageState() {
1022+
if (!isKindleMode()) {
1023+
localStorage.setItem('clickPageEnabled', isClickPageEnabled.toString());
1024+
} else {
1025+
setCookie('clickPageEnabled', isClickPageEnabled.toString());
1026+
}
1027+
}
1028+
1029+
// 更新点击翻页按钮状态
1030+
function updateClickPageButton() {
1031+
if (isClickPageEnabled) {
1032+
toggleClickPageBtn.classList.add('active');
1033+
toggleClickPageBtn.style.background = 'var(--primary)';
1034+
toggleClickPageBtn.style.color = 'white';
1035+
} else {
1036+
toggleClickPageBtn.classList.remove('active');
1037+
toggleClickPageBtn.style.background = '';
1038+
toggleClickPageBtn.style.color = '';
1039+
}
1040+
}
1041+
1042+
// 初始化点击翻页功能状态
1043+
initClickPageState();
1044+
1045+
// 监听点击事件
1046+
content.addEventListener('click', handleClickPage);
1047+
1048+
// 点击翻页按钮点击事件
1049+
toggleClickPageBtn.addEventListener('click', function() {
1050+
isClickPageEnabled = !isClickPageEnabled;
1051+
saveClickPageState();
1052+
updateClickPageButton();
1053+
1054+
if (isClickPageEnabled) {
1055+
showNotification('Click to turn page enabled', 'info');
1056+
} else {
1057+
showNotification('Click to turn page disabled', 'info');
1058+
}
1059+
});
10011060

10021061
// 自定义 css
10031062
customCssFunc();

epub_browser/assets/library.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ function initScript() {
7979
var elContainer = document.querySelector('.container');
8080
if (!isKindleMode()) {
8181
var sortableBook = Sortable.create(elBook, {
82+
delay: 300, // 延迟300ms后才开始拖动,避免移动端滑动时误触发
83+
delayOnTouchOnly: true, // 只在触摸设备上应用延迟
8284
onEnd: function(evt) {
8385
// 获取所有项目的ID
8486
var itemIds = Array.from(evt.from.children).map(function(child) {
@@ -89,6 +91,8 @@ function initScript() {
8991
}
9092
});
9193
var sortableTag = Sortable.create(elTag, {
94+
delay: 300, // 延迟300ms后才开始拖动,避免移动端滑动时误触发
95+
delayOnTouchOnly: true, // 只在触摸设备上应用延迟
9296
onEnd: function(evt) {
9397
// 获取所有项目的ID
9498
var itemIds = Array.from(evt.from.children).map(function(child) {
@@ -98,9 +102,9 @@ function initScript() {
98102
localStorage.setItem(storageKeySortableTag, JSON.stringify(itemIds));
99103
}
100104
});
101-
var sortableTag = Sortable.create(elContainer, {
102-
delay: 10, // 延迟100ms后才开始拖动,给用户选择文字的时间
103-
delayOnTouchOnly: false, // 在触摸设备上也应用延迟
105+
var sortableContainer = Sortable.create(elContainer, {
106+
delay: 300, // 延迟300ms后才开始拖动,给用户选择文字的时间
107+
delayOnTouchOnly: true, // 只在触摸设备上应用延迟
104108
filter: '.book-grid, .search-box', // 允许直接选择.content中的文字
105109
preventOnFilter: false, // 过滤时不阻止默认行为
106110
onEnd: function(evt) {

epub_browser/library.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,10 @@ def create_library_home(self):
195195
<div class="book-card" data-id="{book_hash}">
196196
<a href="/book/{book_hash}/index.html" class="book-link" id="{book_hash}">
197197
<img src="/book/{book_hash}/{book_info['cover']}" alt="cover" class="book-cover"/>
198-
<div class="book-card-content">
199-
<h3 class="book-title">{book_info['title']}</h3>
200-
<div class="book-author">{" & ".join(book_info['authors']) if book_info['authors'] else ""}</div>
198+
</a>
199+
<div class="book-card-content">
200+
<h3 class="book-title">{book_info['title']}</h3>
201+
<div class="book-author">{" & ".join(book_info['authors']) if book_info['authors'] else ""}</div>
201202
"""
202203
if book_info['tags']:
203204
library_html += """<div class="book-tags">"""
@@ -208,7 +209,6 @@ def create_library_home(self):
208209
library_html += """</div>"""
209210
library_html += """
210211
</div>
211-
</a>
212212
</div>
213213
"""
214214
library_html += f"""

epub_browser/processor.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -964,6 +964,10 @@ def create_chapter_template(self, content, style_links, chapter_index, chapter_t
964964
<i class="fas fa-arrow-right-to-bracket"></i>
965965
<span class="control-name">Jump</span>
966966
</div>
967+
<div class="control-btn" style="padding-left:10px;" id="toggleClickPage" title="Click to turn page">
968+
<i class="fas fa-hand-pointer"></i>
969+
<span class="control-name">Click</span>
970+
</div>
967971
</div>
968972
<div style="display: none; flex-direction: row;" class="page-height-adjustment">
969973
<span>

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
setup(
88
name="epub-browser", # 在PyPI上显示的项目名称
9-
version="1.7.3", # 初始版本号
9+
version="1.7.4", # 初始版本号
1010
author="dfface", # 作者名
1111
author_email="dfface@sina.com", # 作者邮箱
1212
keywords="epub reader html export browser convert calibre-web calibre kindle web server local",

0 commit comments

Comments
 (0)