精确搜索【1230】

https://m.jjwxc.net/assort#@js: try{ java.longToast("加载中...请稍候..."); let wo= String(source.getVariable()??""); let script=`<script> let wo= \`${wo}\`; let iswo = /^🔼.*?@.*?#/.test(wo); let temp = localStorage.getItem('setTag'); let istemp = /.*?@.*?#/.test(temp); let saveTag = temp; if(iswo)saveTag=wo.replace(/^🔼/,''); localStorage.setItem('setTag',saveTag); saveTag = localStorage.getItem('setTag'); </script>`; let saveTag =java.webView(script,"https://m.jjwxc.net/assort#","saveTag"); source.setVariable(saveTag); }catch(e){ java.log("我是错误:"+e) }; result

分享者: guaner001125 (317)发布时间: 2天前

将排序和搜索按钮修改至中部,更方便点击
二维码导入
{
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 21,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "@js:\nresult = JSON.stringify({\n\t\"referer\":\"http:\/\/android.jjwxc.net\/?v=357\",\n\t\"versionCode\":\"357\",\n\t\"versiontype\":\"reading\",\n  \"User-Agent\": \"Dalvik\/2.1.0\"\n})",
    "injectJs": "if(\/book2\\\/\\d+\/.test(window.location.href)){\ndocument.getElementById(\"app\").remove();\ndocument.querySelector(\".grid-c\").remove();\n\/\/ 获取书籍链接\n\t\tbookid = String(window.location.href).replace(\/^.*\\\/\/,'');\n\t\tbooksrc = \"http:\/\/app-cdn.jjwxc.net\/androidapi\/novelbasicinfo?novelId=\"+bookid;\n\t\t\nbooksrc = `legado:\/\/import\/addToBookshelf?src=${encodeURIComponent(booksrc)}`;\n\tconsole.log(booksrc)\n\t\t\/\/获取书籍名称\ntitle = document.querySelector(\".big.o\").innerText.replace(\/首页>\/,'');\nconsole.log(\"x\"+title)\n\n\/\/获取作者名称\nauthor = document.querySelector(\".authorname-content a\").innerText;\n\n\/\/跳转作者url[可省略]\nhref = document.querySelector(\".authorname-content a\").href;\n\n\/\/create(搜索的内容,\"bookName or bookAuthor\",距离顶部距离,[跳转其他url])\n\ncreate(title,\"addBookshelf\",14,booksrc);\ncreate(title,\"bookName\",18)\ncreate(author,\"bookAuthor\",22)\n}\n\n function create(name,type,top,url){\n \t    type = type+\"=\"+name;\n \t    url = url!=undefined?url+\"#\"+type:\"\";\n \t    \n     let \ttypebutton;\n     if(\/bookName\/.test(type)){\n     \t    typebutton=\"搜索书名\"\n     \t}else if(\/bookAuthor\/.test(type)){\n     \t\t   typebutton=\"搜索作者\"\n     \t}else{\n     \t\t\t   typebutton=\"加入书架\"\n     \t}\n    \n    \tlet Url = location.search!=\"\"?location.search.replace(\/&*book[AN].*?=.*\/,'')+\"&\"+type:window.location.pathname+\"?\"+type;\n    \turl = url!=\"\"?url:Url;\n    \t\n    \tA = document.createElement(\"a\");\n\t\t A.href =url.replace(\/#addBookshelf.*\/,'')\n\t\t     \n\t\tA.innerHTML = `<button style=\"outline:none; position:fixed; top:${top}%; right:7%; z-index:999; border-radius:5px; color:#166188;background:#fff;padding:4px;border:1px solid #000\"><b>${typebutton}<\/b><\/button>`;\n\t\tconsole.log(A.href)\n    \tdocument.body.appendChild(A);\n \t}\t    \n\n\n\nlet previousUrl = \"\";\nlet currentUrl = '';\nlet currentOffset = 0;\nlet totalPages = 1;\nlet isLoading = false;\nlet hasMore = true;\nlet hasPrevious = false;\nlet scrollDebounceTimer = null;\nlet exploreM = localStorage.getItem('explore') || \"0\";\n\nif(document.querySelector(\"#dis\")){\n   \ndocument.querySelector(\"#dis\").remove();\ndocument.querySelector(\"#logininfo\").remove();\ndocument.querySelector(\".ft\").innerHTML =`<div style=\"width:100%;height:200px;display:block\"><\/div>\n`;\n\nvar li1 = document.createElement('li');\nli1.innerHTML = `\n   <span class=\"biaoqian\">排序方式:<\/span>\n    <div class=\"optionsArea\">\n        \n            <label><input type=\"radio\" name=\"sorttype\" value=\"2\" checked=\"checked\">\n                积分<\/label>\n       \n            <label><input type=\"radio\" name=\"sorttype\" value=\"1\">\n                <span>最近更新<\/span><\/label>\n        \n            <label><input type=\"radio\" name=\"sorttype\" value=\"3\">\n                <span>最新发表<\/span><\/label>\n\n            <label><input type=\"radio\" name=\"sorttype\" value=\"5\">\n                <span>字数<\/span><\/label>\n     \n            <label><input type=\"radio\" name=\"sorttype\" value=\"4\">\n                <span>收藏数<\/span><\/label>\n\n            <label><input type=\"radio\" name=\"sorttype\" value=\"10\">\n                <span>完结高分<\/span><\/label>\n        \n    <\/div>\n`;\n\n\nvar li2 = document.createElement('li');\nli2.innerHTML = `\n    <span class=\"biaoqian\">完成状态:<\/span>\n    <div class=\"optionsArea\">\n\n            <label><input type=\"radio\" name=\"isfinish\" value=\"0\" checked=\"checked\">\n                <span>无限制<\/span><\/label>\n        \n            <label><input type=\"radio\" name=\"isfinish\" value=\"1\">\n                <span>连载<\/span><\/label>\n     \n            <label><input type=\"radio\" name=\"isfinish\" value=\"2\">\n                <span>完结<\/span><\/label>\n        \n    <\/div>\n`;\n\n\/\/ 添加到ul中\nvar formsList = document.getElementById('formsList');\nif(formsList){\n    \/*\nformsList.prepend(li1);\nformsList.prepend(li2);\n*\/\nvar liElements = formsList.getElementsByTagName(\"li\");\n    var liCount = liElements.length;\n    \n        var lastLi = liElements[liCount - 1];\n        var secondLastLi = liElements[liCount - 3];\n        formsList.insertBefore(lastLi,secondLastLi)\n        formsList.insertBefore(li1,liElements[9]);\n        formsList.insertBefore(li2,liElements[9])\n    \n}\n}\n\nfunction encode(str) {\n    str = str.replace(\/https:.*?bq=\/g,'');\n    return btoa(encodeURI(str));\n}\n\nfunction decode(str) {\n    str = \"https:\/\/android.jjwxc.net\/search\/getSearchForKeyWords?offset=0&limit=20&bq=\" + atob(str);\n    return str;\n}\n\n\/\/ 书籍定位\nfunction recordBookPosition(novelid,offset) {\n    let previousUrl = sessionStorage.getItem('previousUrl');\n    sessionStorage.setItem('bookPosition', JSON.stringify({\n        url:previousUrl,\n        novelid: novelid,\n        offset: offset    \n    }));\n}\n\nfunction restoreBookPosition() {\n    const bookPosition = sessionStorage.getItem('bookPosition');\n    if (!bookPosition) return;\n    \n    let { url, novelid, offset, timestamp } = JSON.parse(bookPosition);\n    const pUrl = new URL(url);\n    pUrl.searchParams.set('offset', offset);\n    currentOffset = offset;\n    fetchAndRender(pUrl.toString(), function(error) {\n    if (error) {\n        return;\n    }\n    \n    const bookElement = document.querySelector(`.book[data-id=\"${novelid}\"]`);\n    if (bookElement) {\n        updateCurrentPage()\n        window.scrollTo({\n            top: bookElement.offsetTop - 100,\n            behavior: 'auto'\n        });\n    }\n});\n    \n}\n        \nfunction fetchAndRender(url, callback) {\n    showLoadingMessage();\n    isLoading = true;\n    sessionStorage.setItem('previousUrl',url);\n    fetch(url)\n        .then(response => response.json())\n        .then(jsonData => {\n            currentUrl = url;\n            totalPages = jsonData.total_page;\n            \n            currentOffset = parseInt(new URL(url).searchParams.get('offset')) || 0;\n            hasMore = (Math.floor(currentOffset \/ 20) + 1) < jsonData.total_page;\n            hasPrevious = currentOffset > 0; \n            sessionStorage.setItem('previousUrl',url);\n            generatePageContent(jsonData,currentOffset);\n            addStyles();\n           \n            if (typeof callback === 'function') {\n                callback(null, jsonData);\n            }\n        })\n        .catch(error => {\n            console.error('加载失败:', error);\n            if (typeof callback === 'function') {\n                callback(error);\n            }\n        })\n        .finally(() => {\n            isLoading = false;\n            hideLoadingMessage();\n            bookPosition = sessionStorage.getItem('bookPosition');        \n            sessionStorage.removeItem('bookPosition');        \n            if (!bookPosition) {\n                window.scrollTo(0,0); \t\n                return;\n            }\n        });\n}\n\n\/\/ 下拉加载\nfunction initScrollListener() {    \n    window.addEventListener('scroll', handleScroll, { passive: true });\n}\n\nfunction handleScroll() {    \n    clearTimeout(scrollDebounceTimer);\n    scrollDebounceTimer = setTimeout(() => {\n        if (!isLoading) {\n            updateCurrentPage();\n        }        \n        checkScrollBoundaries();\n    }, 50);\n}\n\nfunction checkScrollBoundaries() {\n    if (isLoading) return;\n    \n    const scrollPosition = window.scrollY;\n    const documentHeight = document.body.offsetHeight;\n    const windowHeight = window.innerHeight;\n    \n    if (scrollPosition + windowHeight >= documentHeight - 100 && hasMore) {\n        loadNextPage();\n    }\n        \n    if (scrollPosition <= 100 && hasPrevious) {\n        loadPreviousPage();\n    }\n}\n\nfunction loadPreviousPage() {\n    if (isLoading) return;\n    \n    isLoading = true;\n    document.getElementById('loading').style.display = 'block';\n    \n    const newOffset = Math.max(0, currentOffset - 20);\n    const url = new URL(currentUrl);\n    url.searchParams.set('offset', newOffset);\n    const scrollPositionBefore = window.scrollY;\n    \n    fetch(url.toString())\n        .then(response => response.json())\n        .then(jsonData => {\n                requestAnimationFrame(() => {\n                prependBookElements(jsonData, newOffset);                                \n                currentOffset = newOffset;\n                updateCurrentPage();\n                hasMore = (Math.floor(newOffset \/ 20) + 1) < jsonData.total_page;\n                hasPrevious = newOffset > 0;           \n                const newBooks = document.querySelectorAll('.book');\n                if (newBooks.length > 0) {              \n                    const targetBook = newBooks[jsonData.items.length - 1];\n                    if (targetBook) {\n                        const targetPosition = targetBook.offsetTop +100; \n                        window.scrollTo({\n                            top: targetPosition,\n                            behavior: 'auto'\n                        });\n                    }\n                }\n            });\n        })\n        .catch(error => {\n            console.error('加载上一页失败:', error);\n        })\n        .finally(() => {\n            isLoading = false;\n            document.getElementById('loading').style.display = 'none';\n        });\n}\n\n\/\/ 加载下一页函数\nfunction loadNextPage() {\n   \n    if (isLoading) return;\n    \n    isLoading = true;\n    document.getElementById('loading').style.display = 'block';\n    \n    const newOffset = currentOffset + 20;\n    \n    \n    const url = new URL(currentUrl);\n    url.searchParams.set('offset', newOffset);\n    \n    fetch(url.toString())\n        .then(response => response.json())\n        .then(jsonData => {\n            requestAnimationFrame(() => {\n                currentOffset = newOffset;\n                appendBookElements(jsonData, newOffset);\n                updateCurrentPage();\n                hasMore = (Math.floor(newOffset \/ 20) + 1) < jsonData.total_page;\n            });\n        })\n        .catch(error => {\n            console.error('加载下一页失败:', error);\n        })\n        .finally(() => {\n            isLoading = false;\n            document.getElementById('loading').style.display = 'none';\n        });\n}\n\nfunction createBookElement(item,offset){\nlet bookDiv = document.createElement('div');\n        bookDiv.className = 'book';\n        bookDiv.setAttribute('data-id', item.novelid);\n        bookDiv.setAttribute('data-offset', offset);\n        booksrc = `http:\/\/app-cdn.jjwxc.net\/androidapi\/novelbasicinfo?novelId=${item.novelid}`;\n        bookDiv.innerHTML = `\n            <div class=\"bookdes\">\n                <div class=\"pic\" onclick=\"window.open('${booksrc}')\"><img src=\"${item.cover.replace(\/https?\/,'https')}\" referrerpolicy=\"no-referrer\"><\/div>\n                <div class=\"details\">\n                    <p class=\"bookname\">\n                        <span class=\"name\"><a href=\"https:\/\/m.jjwxc.net\/book2\/${item.novelid}\">${item.novelname}<\/a><\/span>\n                        <br>\n                        <span class=\"author\" onclick=\"window.open('https:\/\/m.jjwxc.net\/channel\/#bookAuthor=${item.authorname}')\">——${item.authorname}<\/span>\n                    <\/p>\n                    <p class=\"tag\" onclick=\"window.open('https:\/\/m.jjwxc.net\/channel\/#bookName=${item.novelname}')\">⭐️ ${item.novelSizeformat}字•${item.novelstep === '2' ? '<span style=\"color:red\">已完结<\/span>' : '<span style=\"color:blue\">连载中<\/span>'} 🔎<br><br>📖 ${item.novelintroshort}<br><br>🔖 ${item.novelClass}<br><br>🏷 <span style=\"color:green\">${item.tags}<\/span><\/p>\n                <\/div>\n            <\/div>\n        `;\n        \n        const link = bookDiv.querySelector('a');\n        link.addEventListener('click', (e) => {\n            e.preventDefault();\n            recordBookPosition(item.novelid, offset);\n            window.location.href = link.href;\n        });\nreturn bookDiv\n}\n\nfunction prependBookElements(data, offset) {\n    const bookContainer = document.getElementById('bookContainer');\n    const fragment = document.createDocumentFragment();   \n    data.items.forEach((item, index) => {       \n        let bookDiv = createBookElement(item,offset)\n        fragment.appendChild(bookDiv);\n    });    \n    bookContainer.insertBefore(fragment, bookContainer.firstChild);\n}\n\n\n\/\/ 书籍列表生成\nfunction createBookElements(data,offset) {\n    const bookContainer = document.getElementById('bookContainer');\n    bookContainer.innerHTML = '';\n    data.items.forEach((item, index) => {\n        let bookDiv = createBookElement(item,offset)\n        bookContainer.appendChild(bookDiv);     \n    });\n}\n\nfunction appendBookElements(data,offset) {\n    const bookContainer = document.getElementById('bookContainer');\n    data.items.forEach((item, index) => {\n        let bookDiv = createBookElement(item,offset)\n        bookContainer.appendChild(bookDiv);\n    });\n}\n\n\/\/ 页面操作\nfunction updateUrlParam(key, value) {\n    const url = new URL(currentUrl);\n    url.searchParams.set(key, value);\n    url.searchParams.set('offset', 0);\n    currentOffset = 0;\n    updateCurrentPage()\n    fetchAndRender(url.toString());\n}\n\nfunction updateOffset(delta) {\n    const url = new URL(currentUrl);\n    const newOffset = Math.max(0, currentOffset + delta);\n    currentOffset = newOffset;\n    url.searchParams.set('offset', newOffset);\n    fetchAndRender(url.toString());\n}\n\nfunction jumpToPage() {\n    const pageInput = document.querySelector('.page-input');\n    const page = parseInt(pageInput.value);\n    if (isNaN(page) || page < 1 || page > totalPages) {\n        alert(`请输入有效的页码(1-${totalPages})`);\n        return;\n    }\n    \n    currentOffset = (page - 1) * 20;\n    const url = new URL(currentUrl);\n    url.searchParams.set('offset', currentOffset);\n    fetchAndRender(url.toString());\n}\n\nfunction updateCurrentPage() {\n    const books = document.querySelectorAll('.book');\n    if (books.length === 0) return;\n    \n    \n    const observer = new IntersectionObserver((entries) => {\n        entries.forEach(entry => {\n            if (entry.isIntersecting) {\n                const bookOffsetAttr = entry.target.getAttribute('data-offset');\n                \nconst bookOffset = bookOffsetAttr !== null ? parseInt(bookOffsetAttr) : currentOffset;\n\n                const currentPage = Math.floor(bookOffset \/ 20) + 1;\n                \n                \n                const currentDisplay = document.querySelector('.current-page').textContent;\n                if (currentDisplay !== currentPage.toString()) {\n                    document.querySelector('.current-page').textContent = currentPage;\n                    document.querySelector('.current').textContent = currentPage;\n                    currentOffset = bookOffset;\n                }\n            }\n        });\n    }, {\n        threshold: 0.5 \n    });        \n    books.forEach(book => {\n        observer.observe(book);\n    });\n    \n    return () => {\n        observer.disconnect();\n    };\n}\n\n\n\/\/ 辅助函数\nfunction showLoadingMessage() {\n    const loadingDiv = document.createElement('div');\n    loadingDiv.id = 'loading-message';\n    loadingDiv.style.position = 'fixed';\n    loadingDiv.style.top = '20px';\n    loadingDiv.style.left = '50%';\n    loadingDiv.style.transform = 'translateX(-50%)';\n    loadingDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';\n    loadingDiv.style.color = 'white';\n    loadingDiv.style.padding = '10px 20px';\n    loadingDiv.style.borderRadius = '5px';\n    loadingDiv.style.zIndex = '1000';\n    loadingDiv.textContent = '正在加载,请稍候...';\n    document.body.appendChild(loadingDiv);\n}\n\nfunction hideLoadingMessage() {\n    const loadingDiv = document.getElementById('loading-message');\n    if (loadingDiv) loadingDiv.remove();\n}\n\nfunction generateFinalUrl(formData) {\n    const variables = {};\n    for (let [key, value] of formData.entries()) {\n        const variableName = key.replace(\/\\d+\/g, '');\n        if (!variables[variableName]) {\n            variables[variableName] = [];\n        }\n        variables[variableName].push(value);\n    }\n\n    for (const key in variables) {\n        variables[key] = variables[key].join(',');\n    }\n\n    let bookurl = `https:\/\/android.jjwxc.net\/search\/getSearchForKeyWords?offset=0&limit=20&bq=${variables.bq || ''}&removetags=${variables.removebq || ''}&notlikecollectionTypes=${variables.notlikecollectiontypes || ''}&fw=${variables.fw || ''}&yc=${variables.yc || ''}&xx=${variables.xx || ''}&sd=${variables.sd || ''}&lx=${variables.lx || ''}&mainview=${variables.mainview || ''}&fbsj=${variables.fbsj || ''}&novelbefavoritedcount=${variables.novelbefavoritedcount || ''}&isfinish=${variables.isfinish || ''}&collectionTypes=${variables.collectiontypes || ''}&searchkeyWords=${variables.searchkeywords || ''}&sortType=${variables.sorttype}`;\n    return bookurl\n}\n\n\/\/ 页面生成\nfunction generatePageContent(jsonData,offset) {\n    document.documentElement.innerHTML = `\n          <!-- 悬浮按钮组 -->\n    <div class=\"float-buttons\">\n        <div class=\"button-group\">\n                    <!-- 页码控制面板 -->\n            <div class=\"page-control\">\n                <div class=\"page-info\">\n                    <span class=\"current-page\">1<\/span>\n                    <div class=\"divider\"><\/div>\n                    <span class=\"total-pages\">${jsonData.total_page}<\/span>\n                <\/div>\n                <div class=\"page-jump\">\n                    <input type=\"number\" min=\"1\" max=\"${jsonData.total_page}\" value=\"1\" class=\"page-input\">\n                    <button class=\"go-btn\">GO<\/button>\n                <\/div>\n            <\/div>\n            <!-- 功能按钮(从下到上顺序) -->\n            <button class=\"func-btn home\" title=\"返回首页\">⌂<\/button>\n            <button class=\"func-btn bottom\" title=\"页面底部\">↓<\/button>\n            <button class=\"func-btn top\" title=\"页面顶部\">↑<\/button>\n            \n\n        <\/div>\n        \n        <!-- 主按钮 - 深绿色圆形 -->\n        <button class=\"main-btn\" title=\"展开功能\">\n            <span class=\"current\">1<\/span>\n            <div class=\"divider\"><\/div>\n            <span class=\"total\">${jsonData.total_page}<\/span>\n        <\/button>\n    <\/div>\n    \n            <div class=\"center\" style=\"text-align: center;\">\n                <select name=\"sortType\" id=\"orderstr\" style=\"width:25%\">\n                    <option value=\"2\">积分<\/option>\n                    <option value=\"1\">最近更新<\/option>\n                    <option value=\"3\">最新发表<\/option>\n                    <option value=\"5\">字数<\/option>\n                    <option value=\"4\">收藏数<\/option>\n                    <option value=\"10\">完结高分<\/option>\n                <\/select>\n                <span style=\"margin: 0 2px;\">|<\/span>\n                <select name=\"isfinish\" id=\"isfinish\" style=\"width:25%\">\n                    <option value=\"0\">无限制<\/option>\n                    <option value=\"1\">连载<\/option>\n                    <option value=\"2\">完结<\/option>\n                <\/select>\n                <span style=\"margin: 0 2px;\">|<\/span>\n                <button id=\"biaoqian\" style=\"width:25%\">\n                    标签管理                  \n                <\/button>\n            <\/div>\n        <div style=\"height: 60px;\"><\/div>\n        <br>\n        <div id=\"bookContainer\" class=\"book-container\"><\/div>\n        <div id=\"loading\" style=\"text-align: center; padding: 10px; display: none;\">\n            正在加载更多...\n        <\/div>\n    `;\n\n    const sortTypeSelect = document.getElementById(\"orderstr\");\n    const isFinishSelect = document.getElementById(\"isfinish\");\n    const urlParams = new URLSearchParams(currentUrl.split('?')[1]);\n            \n    const mainBtn = document.querySelector('.main-btn');\n    const floatButtons = document.querySelector('.float-buttons');\n    const totalPagesEl = document.querySelector('.total-pages');\n    const pageInput = document.querySelector('.page-input');\n    const pageSections = document.querySelectorAll('.page-section');\n    const homeBtn = document.querySelector('.func-btn.home');\n    const topBtn = document.querySelector('.func-btn.top');\n    const bottomBtn = document.querySelector('.func-btn.bottom');\n        totalPages = jsonData.total_page; \n        totalPagesEl.textContent = totalPages;\n        pageInput.max = totalPages;\n        \n        if (totalPages >= 10000) {\n            floatButtons.classList.add('long-page');\n        }\n        \n        \n        mainBtn.addEventListener('click', function(e) {\n            e.stopPropagation();\n            floatButtons.classList.toggle('expanded');\n            mainBtn.style.display = 'none';\n            \n        });\n        \n        document.addEventListener('click', function() {\n            floatButtons.classList.remove('expanded');\n            mainBtn.style.display = 'flex';\n        });\n        \n        \n        document.querySelector('.button-group').addEventListener('click', function(e) {\n            e.stopPropagation();\n        });\n        \n        \n        document.querySelector('.go-btn').addEventListener('click', jumpToPage);\n        document.querySelector('#biaoqian').addEventListener('click',function() {    \n            toggleTag(sessionStorage.getItem('previousUrl'))\n        });\n\n        \n        homeBtn.addEventListener('click', function() {\n            sessionStorage.setItem('previousUrl', \"\");\n            window.location.reload();\n        });\n        \n        topBtn.addEventListener('click', function() {\n            window.scrollTo({top: 0, behavior: 'smooth'});\n            floatButtons.classList.remove('expanded');\n            mainBtn.style.display = 'flex';\n        });\n        \n        bottomBtn.addEventListener('click', function() {\n            window.scrollTo({top: document.body.scrollHeight-100, behavior: 'smooth'});\n            floatButtons.classList.remove('expanded');\n            mainBtn.style.display = 'flex';\n        });\n        \n    sortTypeSelect.value = urlParams.get('sortType') || '2';\n    isFinishSelect.value = urlParams.get('isfinish') || '0';\n    sortTypeSelect.onchange = () => {\n        updateUrlParam('sortType', sortTypeSelect.value);\n        window.scrollTo(0,0);\n    }\n    isFinishSelect.onchange = () => {\n        updateUrlParam('isfinish', isFinishSelect.value);\n        window.scrollTo(0,0);\n    }\n    \n      \n    initScrollListener();\n    createBookElements(jsonData,offset);\n    updateCurrentPage();\n    \n    const checkScrollable = () => {\n        if (document.body.scrollHeight <= window.innerHeight) {\n            \n            if (hasMore) {\n                loadNextPage();\n            } else if (hasPrevious) {\n                loadPreviousPage();\n            }\n        }\n    };\n    \n\n    checkScrollable();\n}\n\n\n\nfunction createTag(url){    \n        const form = document.getElementsByTagName('form')[1];\n        const formData = new FormData(form);\n        \n        const finalUrl = url==undefined?generateFinalUrl(formData):url;                                           \n        const dialog = createModalDialog();               \n        const urlTextarea = document.createElement('textarea');\n        urlTextarea.value = `标签名@${encode(finalUrl)}#`;\n        urlTextarea.style.width = '90%';\n        urlTextarea.style.height = '100px';\n        urlTextarea.style.padding = '10px';\n        urlTextarea.style.margin = '10px';\n        urlTextarea.style.outline ='none';\n        urlTextarea.style.border ='1px solid #ddd';\n        urlTextarea.style.resize = 'none';\n        \n        dialog.dialog.prepend(urlTextarea);\n\n        const promptText = document.createElement('p');\n        promptText.textContent = '修改标签名,点击保存';\n        promptText.style.margin = '10px 0';\n        promptText.style.fontSize = '14px';\n        promptText.style.color = '#333';\n        dialog.dialog.prepend(promptText);\n\n        const copyButton = document.createElement('button');\n        copyButton.textContent = '保存';\n        copyButton.style.margin = '10px';\n        copyButton.style.padding = '5px 5px';\n        copyButton.style.backgroundColor = '#28a745';\n        copyButton.style.color = 'white';\n        copyButton.style.border = 'none';\n        copyButton.style.borderRadius = '5px';\n        copyButton.style.cursor = 'pointer';\n        copyButton.addEventListener('click', () => {\n            let tag = urlTextarea.value;\n            let tags = localStorage.getItem(\"setTag\");\n            localStorage.setItem(\"setTag\",tags+tag);\n            let saveTag = localStorage.getItem(\"setTag\");            \n            alert('已保存标签:'+tag);\n            document.body.removeChild(dialog.overlay);\n        });\n        dialog.dialog.appendChild(copyButton);   \n        \n        const addshelfButton = document.createElement('button');\n        addshelfButton.textContent = '加入书架';\n        addshelfButton.style.margin = '10px';\n        addshelfButton.style.padding = '5px 5px';\n        addshelfButton.style.backgroundColor = '#F3A23D';\n        addshelfButton.style.color = 'white';\n        addshelfButton.style.border = 'none';\n        addshelfButton.style.borderRadius = '5px';\n        addshelfButton.style.cursor = 'pointer';\n        addshelfButton.addEventListener('click', () => {\n            let tag = urlTextarea.value;\n            let u = tag.split(\"@\");\n            let name = u[0];\n            let booku = decode(u[1].replace(\/#$\/,''))+\"#❌bookname=\"+u[0]; \n            \n            let url = `legado:\/\/import\/addToBookshelf?src=${encodeURIComponent(booku)}`;\n            window.open(url)\n            document.body.removeChild(dialog.overlay);\n        });\n        dialog.dialog.appendChild(addshelfButton);  \n}\n\n\n\/\/标签管理弹窗\nfunction createModalDialog(options = {}) {\n    \/\/遮罩层\n    const overlay = document.createElement('div');\n    overlay.style.position = 'fixed';\n    overlay.style.top = '0';\n    overlay.style.left = '0';\n    overlay.style.width = '100%';\n    overlay.style.height = '100%';\n    overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';\n    overlay.style.zIndex = '1001';\n    overlay.style.display = 'flex';\n    overlay.style.justifyContent = 'center';\n    overlay.style.alignItems = 'center';\n    \n    \/\/弹窗\n    const dialog = document.createElement('div');\ndialog.style.cssText = `\n    background-color: white;\n    padding: 10px;\n    border-radius: 10px;\n    width: 80%;\n    box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);\n    text-align: center;\n    max-height: 60vh;\n`;\n\n\n    if (options.title) {\n        const title = document.createElement('h2');\n        title.textContent = options.title;\n        title.style.marginTop = '0';\n        dialog.appendChild(title);\n    }\n\n    if (options.content && Array.isArray(options.content)) {\n        options.content.forEach(element => {\n            dialog.appendChild(element);\n        });\n    }\n\n    \/\/ 创建关闭按钮\n    const closeButton = document.createElement('button');\n    closeButton.textContent = '关闭';\n    closeButton.style.margin = '10px';\n    closeButton.style.padding = '5px 5px';\n    closeButton.style.backgroundColor = '#dc3545';\n    closeButton.style.color = 'white';\n    closeButton.style.border = 'none';\n    closeButton.style.borderRadius = '5px';\n    closeButton.style.cursor = 'pointer';\n    closeButton.addEventListener('click', () => {\n        document.body.removeChild(overlay);\n        if (typeof options.onClose === 'function') {\n            options.onClose(); \n        }\n    });\n    dialog.appendChild(closeButton);\n\n    overlay.appendChild(dialog);\n    document.body.appendChild(overlay);\n\n     return {\n        dialog: dialog, \n        overlay: overlay\n    };\n}\n\nfunction createTagButton(type){   \n    const tagsWrapper = document.createElement('div');\n    tagsWrapper.style.cssText = `\n        margin: 5px;\n        padding:5px;\n        max-height:50vh;\n        overflow-y: auto;\n        display: flex;\n        flex-wrap: wrap;\n        align-items: flex-start;\n    `;\n    let url = localStorage.getItem('setTag');\n    const urls = url.split('#');\n    const buttonData = urls.filter(part => part.trim() !== '');        \n    buttonData.forEach((data, index) => {\n        const [label, url] = data.split('@');\n        const button = document.createElement('button');\n        button.textContent = decodeURIComponent(label) || `标签${index + 1}`;\n        button.style.cssText = `\n            padding: 5px 5px;\n            border-radius: 5px;\n            white-space: wrap;\n            flex-shrink: 0;\n            background-color: #2196F3;\n            color: white;\n            border: none;\n            cursor: pointer;\n            transition: all 0.3s;\n            margin-right: 10px;\n            margin-bottom: 10px;\n            min-width: 60px;\n            max-width: 100%;\n        `;\n        if(type!==0){     \n            if(exploreM==\"0\"){\n            button.addEventListener('click', () =>{\n                fetchAndRender(decode(url));\n                window.scrollTo(0,0);\n            });\n                \n           }else{\n               button.addEventListener('click', () =>{\n                   window.open(decode(url)+\"bookname\"+encodeURIComponent(label))\n               });\n           }\n        }else if(type===0){\n        button.addEventListener('click', () => {\n        try{\n        document.querySelectorAll(\"input\").forEach(input => {\n\n  input.checked = false;\n  \n  const span = input.nextElementSibling; \n  if (span && span.tagName === 'SPAN') {\n    span.style.color = 'black';\n  }\n});\n\n        document.querySelectorAll('.del_choosed_tag').forEach(button => {\n    button.click();\n});              \n        let eurl = decodeURIComponent(decodeURIComponent(decode(url)));\n        \n        eurl = eurl.toLowerCase().replace(\/http.*?\\?|offset=\\d+&|limit=\\d+&\/g,'').split('&'); \n        if(!\/sortsype\/.test(eurl))document.querySelector(`input[name=\"sorttype\"][value=\"2\"]`).checked = true;\n        if(!\/isfinish\/.test(eurl))document.querySelector(`input[name=\"isfinish\"][value=\"0\"]`).checked = true;\n        for(let i=0;i<eurl.length;i++){\n            let params = eurl[i].split(\"=\");\n            let names = params[0];  \n                       \n            let values = params[1].split(\",\"); \n                         \n            for(let j=0;j<values.length;j++){\n                let name,input;\n      if(names===\"searchkeywords\"){\n      \tdocument.querySelector(`input[name=\"${names}\"]`).value = params[1];\n      \t}else if(names===\"bq\"||names===\"removetags\"){\n      if(values[j]){\n              addBq(params[1],values[j],names)\n             }\n              }else if(\/\\d+\/.test(values[j]) && !\/sorttype|isfinish\/.test(names)){\n                name = names+values[j];       \n                input = document.querySelector(`input[name=\"${name}\"]`);\n                if(input){\n                  if (input.nextElementSibling && input.nextElementSibling.tagName === 'SPAN') {\n    input.nextElementSibling.style.color = 'red';\n  }\n  input.checked=true\n        }        \n              }else{\n              input = document.querySelector(`input[name=\"${names}\"][value=\"${values[j]}\"]`);\n              \n              input?input.checked=true:null\n              }            \t       \n            }                                         \n        }\n       \n        }catch(e){alert(e)}              \n        });               \n     }\n        tagsWrapper.appendChild(button);        \n    });\n    return tagsWrapper\n}\n\nfunction addBq(all,v,type){\ntry{\n        \n        type === \"removetags\"?        \n          document.querySelector('.tag_label_'+v+\"~.remove_tags\").click()                  \n           :document.querySelector('.tag_label_'+v+\"~.add_tags\").click();          \n         \n      }catch(e){\n      alert(e)\n      }\n}\n\nfunction toggleTagEdit(){      \n    const dialog = createModalDialog();\n    const tagContainer = document.createElement('div');\n    const tagsWrapper = createTagButton(0);\n\n    tagContainer.style.cssText = `\n        max-height:50vh;\n        padding: 10px;\n        margin: 5px;\n        border-radius: 10px;\n        width: 90%;\n        display: flex;\n        flex-direction: column;\n        align-items: flex-start;\n    `;\n   \n    tagContainer.appendChild(tagsWrapper); \n    dialog.dialog.prepend(tagContainer);\n\n    dialog.overlay.addEventListener('click', () => {\n        document.body.removeChild(dialog.overlay);\n    });\n    \n}\n\n\/\/\/标签选择\nfunction toggleTag(curl){   \n    \/\/ 创建弹窗    \n    const dialog = createModalDialog();\n    const tagContainer = document.createElement('div');\n    const tagsWrapper = createTagButton();\n\n    tagContainer.style.cssText = `\n        max-height:50vh;\n        padding: 10px;\n        margin: 5px;\n        border-radius: 10px;\n        width: 90%;\n        display: flex;\n        flex-direction: column;\n        align-items: flex-start;\n    `;\n\n    \/\/ 创建【生成标签】按钮\n    const generateBtn = document.createElement('button');\n    generateBtn.textContent = '生成';\n    generateBtn.style.cssText = `\n        padding: 5px 5px;\n        margin: 6px;\n        background: #4CAF50;\n        color: white;\n        border: none;\n        border-radius: 5px;\n        cursor: pointer;\n        margin-bottom: 10px;\n    `;\n    dialog.dialog.appendChild(generateBtn);\n    const editBtn = document.createElement('button');\n    \n    \n    editBtn.textContent = '编辑';\n    editBtn.style.cssText = `\n        padding: 5px 5px;\n        margin: 6px;\n        background: #719EA5;\n        color: white;\n        border: none;\n        border-radius: 5px;\n        cursor: pointer;\n        margin-bottom: 10px;\n    `;\n    dialog.dialog.appendChild(editBtn);\n     \n    const copyBtn = document.createElement('button');\n    copyBtn.textContent = '复制';\n    copyBtn.style.cssText = `\n        padding: 5px 5px;\n        margin: 6px;\n        background: #DE8E32;\n        color: white;\n        border: none;\n        border-radius: 5px;\n        cursor: pointer;\n        margin-bottom: 10px;\n    `;\n    dialog.dialog.appendChild(copyBtn);\n     \n    tagContainer.appendChild(tagsWrapper); \n    dialog.dialog.prepend(tagContainer);\n\n    dialog.overlay.addEventListener('click', () => {\n        document.body.removeChild(dialog.overlay);\n    });\n    \n    \/\/ 【生成标签】点击事件\n    generateBtn.addEventListener('click', () => {        \n        createTag(curl)        \n    });    \n    editBtn.addEventListener('click', () => {        \n        editTag()        \n    });    \n    copyBtn.addEventListener('click', () => {        \n        copyTag()        \n    });    \n}\nfunction copyTag(){\n           let setTagValue = localStorage.getItem('setTag');\n            if (setTagValue){\n                let tempTextArea = document.createElement('textarea');\n                tempTextArea.value = setTagValue;\n                document.body.appendChild(tempTextArea);\n                tempTextArea.select();\n                document.execCommand('copy');\n                document.body.removeChild(tempTextArea);\n                alert('内容已复制到剪贴板: ' + setTagValue);\n            } else {\n                alert('localStorage中没有找到setTag的值');\n            }\n    \n    \n}\n\nfunction editTag(){\n    let dialog = createModalDialog();\n    let text = localStorage.getItem('setTag');\n    const tagsWrapper = document.createElement('div');\n    tagsWrapper.style.cssText = `\n        margin: 5px;\n        padding:5px;\n        max-height:50vh;\n        overflow-y: auto;\n        display: flex;\n        flex-wrap: wrap;\n        align-items: flex-start;\n    `;        \n    const urls = text.split('#');\n    \n    const buttonData = urls.filter(part => part.trim() !== '');        \n    buttonData.forEach((data, index) => {\n        const [label, url] = data.split('@');\n        const button = document.createElement('input');\n        button.type = \"text\";\n        button.value = label || `标签${index + 1}`;\n        button.style.cssText = `\n            padding: 5px 5px;\n            border-radius: 5px;\n            white-space: wrap;\n            flex-shrink: 0;\n            background-color: #2196F3;\n            color: white;\n            border: none;\n            cursor: pointer;\n            transition: all 0.3s;           \n            min-width: 60px;\n            max-width: 100%;\n            width:40%;\n            margin-right: 10px;\n            margin-bottom: 10px;\n        `;\n        \n        button.dataset.id = url;   \n        tagsWrapper.appendChild(button); \n    });            \n        dialog.dialog.prepend(tagsWrapper);\n        \n        const promptText = document.createElement('p');\n        promptText.textContent = '修改标签名或者删除相应文字,点击保存';\n        promptText.style.margin = '10px 0';\n        promptText.style.fontSize = '14px';\n        promptText.style.color = '#333';\n        dialog.dialog.prepend(promptText);\n\n        const copyButton = document.createElement('button');\n        copyButton.textContent = '保存';\n        copyButton.style.margin = '10px';\n        copyButton.style.padding = '5px 5px';\n        copyButton.style.backgroundColor = '#28a745';\n        copyButton.style.color = 'white';\n        copyButton.style.border = 'none';\n        copyButton.style.borderRadius = '5px';\n        copyButton.style.cursor = 'pointer';\n        copyButton.addEventListener('click', () => {\n            const allButtons = tagsWrapper.querySelectorAll('input');\n            \n            let saveTag = \"\";        \n            allButtons.forEach(data=>{\n            if(data.value){\n               saveTag+=data.value+\"@\"+data.dataset.id+\"#\";}\n            });\n            \n            localStorage.setItem(\"setTag\",saveTag);\n            alert(\"已更新标签\");\n            document.body.removeChild(dialog.overlay);\n            \n        });        \n        \n        dialog.dialog.appendChild(copyButton);          \n}\n\n\n\nif(\/#$\/.test(window.location.href)){\n    let homeTagButton = document.createElement('button');\n    homeTagButton.textContent = '标签管理';\n    homeTagButton.style.cssText = `\n        position: fixed;\n        bottom: 20px;\n        right: 20px;\n        z-index: 1000;\n        padding: 5px 10px;\n        background-color: #007BFF;\n        color: white;\n        border: none;\n        border-radius: 5px;\n        cursor: pointer;\n    `;\n    document.body.appendChild(homeTagButton);\n    \n    let cTagButton = document.createElement('button');\n    cTagButton.textContent = '生成标签';\n    cTagButton.style.cssText = `\n        position: fixed;\n        bottom: 50px;\n        right: 20px;\n        z-index: 1000;\n        padding: 5px 10px;\n        background-color: #007BFF;\n        color: white;\n        border: none;\n        border-radius: 5px;\n        cursor: pointer;\n    `;\n    document.body.appendChild(cTagButton);\n    \n    \n    let eTagButton = document.createElement('button');\n    eTagButton.textContent = '复现标签';\n    eTagButton.style.cssText = `\n        position: fixed;\n        bottom: 80px;\n        right: 20px;\n        z-index: 1000;\n        padding: 5px 10px;\n        background-color: #007BFF;\n        color: white;\n        border: none;\n        border-radius: 5px;\n        cursor: pointer;\n    `;\n    document.body.appendChild(eTagButton);\n    \n    let exploreButton = document.createElement('button');\n    exploreButton.textContent = exploreM==\"0\"?\"网页模式\":\"发现模式\";\n    exploreButton.style.cssText = `\n        position: fixed;\n        bottom: 110px;\n        right: 20px;\n        z-index: 1000;\n        padding: 5px 10px;\n        background-color: #007BFF;\n        color: white;\n        border: none;\n        border-radius: 5px;\n        cursor: pointer;\n    `;\n    document.body.appendChild(exploreButton);\n    \n     \n    let searchb = document.createElement('button');\n    searchb.textContent = \"搜索\";\n    searchb.style.cssText = `\n        position: fixed;\n        bottom: 140px;\n        right: 20px;\n        z-index: 1000;\n        padding: 5px 10px;\n        background-color: #007BFF;\n        color: white;\n        border: none;\n        border-radius: 5px;\n        cursor: pointer;\n    `;\n    document.body.appendChild(searchb);\n    \n    exploreButton.addEventListener('click', () => {\n        if(exploreM==\"0\"){\n            localStorage.setItem('explore',\"1\");\n            exploreButton.textContent = \"发现模式\"\n            exploreM = 1;\n        }else{\n            localStorage.setItem('explore',\"0\");\n            exploreM = 0;\n            exploreButton.textContent = \"网页模式\"\n        }\n    });\n    \n    homeTagButton.addEventListener('click', () => {            \n        toggleTag()\n    });\n    \n    eTagButton.addEventListener('click', () => {               \n        toggleTagEdit()\n    });\n    \n    cTagButton.addEventListener('click', () => {              \n        createTag()        \n    });\n    \n    const forms = document.getElementsByTagName('form')[1];\n    restoreBookPosition();\n    searchb.addEventListener('click', () => {            \n        let formData = new FormData(forms);\n        currentUrl = generateFinalUrl(formData);\n        previousUrl = currentUrl;\n        currentOffset = 0;\n        if(exploreM == \"0\")fetchAndRender(currentUrl);\n        if(exploreM == \"1\")window.open(currentUrl)\n    });\n    forms.addEventListener('submit', function(event) {\n        event.preventDefault();\n        let formData = new FormData(forms);\n        currentUrl = generateFinalUrl(formData);\n        previousUrl = currentUrl;\n        currentOffset = 0;\n        if(exploreM == \"0\")fetchAndRender(currentUrl);\n        if(exploreM == \"1\")window.open(currentUrl)\n    });\n}\n\nfunction addStyles() {\n    const style = document.createElement('style');\n    style.innerHTML = `\n    .center {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100%;\n    background: white;\n    z-index: 999;\n    padding: 10px 0;\n    box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n}\n\n        a:link { color: #415E44; }\n        a:visited { color: #8EB28B; }\n        button, select, input {\n            background: #E9F5F3;\n            color: green;\n            font-weight: bold;\n            border-radius: 15px;\n            border: 0px solid #000;\n            padding: 5px 10px;\n            box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);\n        }\n        \n        .float-buttons {\n            position: fixed;\n            right: 10px;\n            bottom: 10px;\n            display: flex;\n            flex-direction: column-reverse;\n            align-items: center;\n            z-index: 999;\n        }\n       \n        \/* 主按钮 - 深绿色圆形 *\/\n        .main-btn {\n            width: 50px;\n            height: 50px;\n            border-radius: 50%;\n            background: #E9F5F3;\n            color: green;\n            border: none;\n            cursor: pointer;\n            box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            font-size: 12px;\n            outline: none;\n            -webkit-tap-highlight-color: transparent;\n            transition: all 0.3s ease;\n            padding: 5px 2px;\n            position: relative;\n        }\n        \n        \/* 当前页和总页数颜色区分 *\/\n        .main-btn .current {\n            color: green;\n            font-weight: bold;\n            margin-bottom: 2px;\n        }\n        \n        .main-btn .total {\n            color: rgba(0, 0, 0, 0.8);\n            font-size: 0.9em;\n            margin-top: 2px;\n        }\n        \n        .main-btn .divider {\n            width: 60%;\n            height: 1px;\n            background: green;\n            margin: 3px 0;\n        }\n        \n        \/* 功能按钮容器 - 默认隐藏 *\/\n        .button-group {\n            display: none;\n            flex-direction: column-reverse;\n            align-items: center;\n        }\n        \n        \n        .expanded .button-group {\n            display: flex;\n        }\n        \n        \/* 功能按钮样式 *\/\n        .func-btn {\n            width: 50px;\n            height: 50px;\n            border-radius: 50%;\n            background: #495057;\n            color: white;\n            border: none;\n            cursor: pointer;\n            box-shadow: 0 2px 6px rgba(0, 0, 0, 0.7);\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            font-size: 18px;\n            outline: none;\n            margin-bottom: 8px;\n        }\n        \n        \/* 不同功能按钮颜色 *\/\n        .func-btn.home { background: #9B5F64; }\n        .func-btn.bottom { background: #8DA371; }\n        .func-btn.top { background: #67749A; }\n        \n        \/* 页码控制面板 *\/\n        .page-control {\n            background: #E9F5F3;\n            color: white;\n            padding: 10px;\n            border-radius: 25px;\n            font-size: 14px;\n            box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            width: 30px;\n            margin-bottom: 8px;\n        }\n        \n        .page-info {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            margin-bottom: 8px;\n            font-size: 12px;\n            line-height: 1.3;\n            position: relative;\n            width: 100%;\n        }\n        \n        \n        .page-info .divider {\n            width: 90%;\n            height: 1px;\n            background: green;\n            margin: 4px 0;\n        }\n        \n        .page-info .current-page {\n            color: green;\n            font-weight: bold;\n            font-size: 14px;\n        }\n        \n        .page-info .total-pages {\n            color: rgba(0, 0, 0, 0.6);\n            font-size: 11px;\n        }\n        \n        .page-jump {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            width: 100%;\n        }\n        \n        .page-jump input {\n            width: 30px;\n            padding: 6px;\n            border: none;\n            border-radius: 15px;\n            text-align: center;\n            outline: none;\n            font-size: 12px;\n            margin-bottom: 6px;\n            background: #f8f9fa;\n        }\n        \n        .page-jump button {\n            width: 30px;\n            height: 25px;\n            background: #2b8a3e;\n            color: white;\n            border: none;\n            border-radius: 15px;\n            cursor: pointer;\n            font-size: 12px;\n            transition: background 0.2s;\n        }\n        \n        .page-jump button:hover {\n            background: #2f9e44;\n        }\n        \n        .main-btn:hover, .func-btn:hover {\n            transform: translateY(-3px);\n            box-shadow: 0 6px 12px rgba(0, 0, 0, 0.25);\n        }\n        \n        .main-btn:active, .func-btn:active {\n            transform: translateY(0);\n        }\n        \n        .long-page .main-btn {\n            font-size: 11px;\n            padding: 3px 1px;\n        }\n        \n        .book {\n            width: 100%;\n            display: flex;\n            flex-direction: column;\n            align-items: flex-start;\n            margin-bottom: 8px;\n        }\n        .bookdes {\n            display: flex;\n            flex-direction: row;\n            margin: 5px;\n            width: 100%;\n            position: relative;\n            align-items: center;\n        }\n        .pic {\n            width: 25vw;\n            margin-right: 20px;\n            align-self: center;\n        }\n        .details {\n            width: 72vw;\n            margin-left: 20px;\n            align-self: center;\n            margin-left: auto;\n        }\n        .pic img {\n            border: 1px solid #C4C4C4;\n            border-radius: 5px;\n            box-shadow: 1px 2px 2px black;\n            width: 97%;\n            height: auto;\n        }\n        .name { font-size: 20px; color: #000; }\n        .author {\n            font-size: 15px;\n            display: inline-block;\n            position: absolute;\n            right: 8px;\n        }\n        .tag { font-size: 12px; margin-top: -10px; }\n        #loading {\n            background: rgba(0,0,0,0.1);\n            margin: 10px 0;\n        }\n    `;\n    document.head.appendChild(style);\n}",
    "jsLib": "function gbkToutf(title){\n\tconst {java} = this;\n let URLDecoder = Packages.java.net.URLDecoder;\n let \tgb2312Str = URLDecoder.decode(title,\"gbk\");\n let utf8Str = URLDecoder.decode(title,\"utf-8\");\n let result = gb2312Str.length() >= utf8Str.length();\n\ttitle = result?decodeURI(title):gb2312Str;\n\treturn title\n\t\n\t}",
    "lastUpdateTime": 1767029767207,
    "loadWithBaseUrl": true,
    "loginUi": "[\n    {\n        \"name\": \"🖨打印标签\",\n        \"type\": \"button\",\n        \"action\": \"getTag()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,        \n            \"layout_flexBasisPercent\": 0.4   \n        }\n    },\n    {\n        \"name\": \"❌删除所有标签\",\n        \"type\": \"button\",\n        \"action\": \"clearTag()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,              \n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"☕️支持源作者\",\n        \"type\": \"button\",\n        \"action\": \"toThank()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,     \n            \"layout_flexBasisPercent\": 1\n        }\n    }\n]",
    "loginUrl": "function getTag(){\n\t   java.longToast(\"打印中...请稍候...\");\n     let \tlocal = java.webView(null,\"https:\/\/m.jjwxc.net\/assort#\",\"localStorage.getItem('setTag')?localStorage.getItem('setTag'):''\");  \n    let msg = `\\n------这是源变量里的标签----\\n${source.getVariable()}\\n------这是网页里的标签------\\n${local}`\n    \tjava.log(msg);\n   \tjava.longToast(\"请查看日志查看标签,可复制用来备份\");\n\t}\n\t\nfunction clearTag(){\n\t   java.longToast(\"删除中...请稍候...\");\n     let \tlocal = java.webView(\"<script>localStorage.setItem('setTag','')<\/script>\",\"https:\/\/m.jjwxc.net\/assort#\",null);     \t\n   \tjava.longToast(\"已删除网页保存标签\");\n\t}\nfunction toThank(){\n\tjava.startBrowser(\"data:text\/html;base64,PGltZyBzdHlsZT0id2lkdGg6MTAwJSIgc3JjPSJhYm91dDpibGFuayIgb25lcnJvcj0idGhpcy5zcmM9YXRvYignYUhSMGNITTZMeTluYVhSbFpTNWpiMjB2WjNWaGJtVnlNREF4TVRJMUwySnZiMnR6YjNWeVkyVXZjbUYzTDIxaGMzUmxjaThsUlRVbE9VSWxRa1VsUlRjbE9Ea2xPRGN2WjNWaGJtVnlMbmRsWW5BPScpIj4KCg==\",\"感谢你的支持\");\t\n\t}",
    "preload": false,
    "shouldOverrideUrlLoading": "if(\/[\\?#&]book[AN]\/.test(url)){\n\ttitle = url.match(\/[\\?#&]book[AN].+?=(.*)\/)[1];\n\t title = gbkToutf(title)\n\t java.searchBook(title);\n\t true\n\t}\n\t\n\tif(\/novelbasicinfo\/.test(url) && !\/legado\/.test(url)){\n\t\tjava.addBook(url);\n\t\ttrue\n\t\t}\n\t\t\n\t\t\nif(\/^http.*?search\\\/getSearchForKeyWords\/.test(url)){\n\tlet urls = url.replace(\/offset=\\d+\/,'offset={\\{(page-1)*20}}').split('bookname');\n\t\ttitle = urls[0].match(\/searchkeyWords=(.*?)&\/)?.[1]??\"\";\t\n\t title = gbkToutf(title)\n\t url = urls[0].replace(\/searchkeyWords=.*?&\/,'searchkeyWords='+title+'&');\n\t \n\tjava.open(\"explore\", url,urls[1]?decodeURIComponent(urls[1]):\"搜索结果\",\"https:\/\/m.jjwxc.net\/channel\/\")\n\t\n\ttrue\n\t}",
    "showWebLog": true,
    "singleUrl": true,
    "sourceComment": "❗️保存标签,在网页里生成标签后保存标签。\n❗️删除标签,在网页里编辑标签,把文字删了,点保存。\n◎网页保存的标签信息消失情况:清除webView或清除应用缓存。\n◎源变量消失情况:对源URL进行了更改。\n◎当网页保存的标签信息和源变量两者都消失时,你的标签信息就会消失。\n◎每次点进网页会同步二者。\n\n❗️【编辑订阅源->右上角三点->设置源变量】里有保存的标签,可以复制下来,给其他设备使用。\n\n❗️利用源变量更新标签:\n\n前面加上🔼符号将复制的所有标签保存到源变量,\n如:🔼标签1@xxxxx#标签2@xxxxx#标签2@xxxxx#",
    "sourceIcon": "https:\/\/m-static.jjwxc.net\/images\/wap\/logo.png",
    "sourceName": "精确搜索【1230】",
    "sourceUrl": "https:\/\/m.jjwxc.net\/assort#@js:\ntry{\n\t   java.longToast(\"加载中...请稍候...\");\n    let wo= String(source.getVariable()??\"\");     \n    let script=`<script>\n    let wo= \\`${wo}\\`;\n    let iswo = \/^🔼.*?@.*?#\/.test(wo);\n    let temp = localStorage.getItem('setTag');    \n    let istemp =  \/.*?@.*?#\/.test(temp);\n    let saveTag = temp;\n    if(iswo)saveTag=wo.replace(\/^🔼\/,'');\n  \t localStorage.setItem('setTag',saveTag);\n  \t saveTag = localStorage.getItem('setTag'); \n  \t <\/script>`;\n  \t let saveTag =java.webView(script,\"https:\/\/m.jjwxc.net\/assort#\",\"saveTag\");\t \n   source.setVariable(saveTag);\n}catch(e){\n   \tjava.log(\"我是错误:\"+e)\n};\nresult",
    "type": 0,
    "variableComment": "\n想利用源变量更新标签请在最前面加上符号🔼\n如\n🔼新名字@xxxxx#我的标签@xxxxx#我的标签@xxxxx#"
}
广告