You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS/JQuery+IndexedDB进度条问题:计算值perc无法显示

问题:阅读进度条计算值无法正常显示

尝试用JavaScript和JQuery通过「已读页数/总页数」计算实现阅读进度条,但计算得到的perc值无法在进度条上正常显示,推测函数逻辑存在问题。说明:代码采用IndexedDB存储数据,在calculate函数中尝试从数据库获取已读页数(pageR)和总页数(pageE)进行计算,代码中已标注需赋值perc值的元素。

进度条问题截图

相关代码

$(document).ready(function(){

    function calculate() {
    var perc = "";
    if (isNaN(pagesE.value) || isNaN(pagesR.value)) {
      perc = " ";
      updateProgressBar(myProgressBar, 0);
    } else {
      perc = ((pagesR.value / pagesE.value) * 100).toFixed(0);
      updateProgressBar(myProgressBar, perc)
    }
    document.getElementById('#progress__text').innerHTML = perc;
}



//Open Database
var request = indexedDB.open('bookmanager',1);

request.onupgradeneeded = function(e){
    var db = e.target.result;

    if(!db.objectStoreNames.contains('customers')){
        var os = db.createObjectStore('customers',{keyPath: "id", autoIncrement:true});
        //Create Index for Name
        os.createIndex('title','title',{unique:false});
    }
}

//Success
request.onsuccess = function(e){
    console.log('Database working Success');
    db = e.target.result;
    //Show Customers
    showCustomers();
}

//Error
request.onerror = function(e){
    console.log('Error: Opening Database!');
}
});


//Add Customer
function addCustomer(){
var title = $('#title').val();
var author = $('#authorInput').val();
var published = $('#publishedYear').val();
var pagesR = $('#pagesRead').val();
var pagesE = $('#allPages').val();
var startD = $('#startDate').val();
var endD = $('#endDate').val();
var img = $('#img').val();

var transaction = db.transaction(["customers"],"readwrite");
//Ask for ObjectStore
var store = transaction.objectStore("customers");

//Define Customer
var customer = {
    title: title,
    author: author,
    published: published,
    pagesR: pagesR,
    pagesE: pagesE,
    startD: startD,
    endD: endD,
    img: img
}

//Perform the Add
var request = store.add(customer);

//Success
request.onsuccess = function(e){
    window.location.href="/index.html";
}

//Error
request.onerror = function(e){
    alert("Sorry, the customer was not added");
    console.log('Error', e.target.error.title);
}

}

function updateProgressBar(progressBar, value) {
value = Math.round(value);
progressBar.querySelector(".progress__fill").style.width = `${value}%`;
progressBar.querySelector(".progress__text").textContent = `${value}%`;
}

const myProgressBar = document.querySelector(".progress");

updateProgressBar(myProgressBar, 10);

//Display Customer
function showCustomers(e){
var transaction = db.transaction(["customers"],"readonly");
//Ask for ObjectStore
var store = transaction.objectStore("customers");
var index = store.index('title');

var output = '';
index.openCursor().onsuccess = function(e){

    var cursor = e.target.result;
    if(cursor){

        output += "<li class='list-group-item list-group-item-action list-group-item-light'>";

        output += "<div class='progress'>";
        output += "<div class='progress__fill'></div>";
        //on the element bellow i want to assign perc value
        output += "<p class='progress__text'>1</p>";
        output += "</div>";

        output += "<img src='"+cursor.value.img+"' width='100px' height='120px'>";
        output += "<h3>"+cursor.value.title+"</h3>";
        output += "<a href='#' class='book-author'>"+cursor.value.author+"</a>";
        output += "<br>"
        output += "<a href='#' class='published'>"+cursor.value.published+"</a>";
        output += "<br>";
        output += "<p class='pages'>"+cursor.value.pagesR+" / "+cursor.value.pagesE+"</p>";
        output += "<br>";
        output += "<p class='date'>"+cursor.value.startD+" - "+cursor.value.endD+"</p>";

        output += "<button class='button-first'>Редактировать</button>";
        output +=  "<button class='button-second'>Удалить</button>";
        output += "</li>";

        cursor.continue();
    }
    $('.list-group').html(output);
}
}

核心问题与修复方案

1. 核心问题分析

  • calculate函数从未被调用,且函数内直接使用的pagesE、pagesR是addCustomer内的局部变量,无法被外部访问
  • 动态生成的每个书籍进度条,没有和数据库中存储的页数数据关联计算
  • document.getElementById('#progress__text')存在选择器错误:getElementById不需要加#前缀

2. 修复步骤

(1)重构calculate函数,接收参数计算进度

function calculate(pagesR, pagesE) {
    const read = Number(pagesR);
    const total = Number(pagesE);
    // 处理非法值,避免除数为0
    if (isNaN(read) || isNaN(total) || total === 0) {
        return { perc: "0", value: 0 };
    }
    const perc = ((read / total) * 100).toFixed(0);
    return { perc: perc, value: parseInt(perc) };
}

(2)在showCustomers渲染时计算并插入进度值

修改动态生成进度条的代码,直接基于当前书籍的数据库数据计算进度:

// 替换原进度条生成代码
const progressData = calculate(cursor.value.pagesR, cursor.value.pagesE);
output += "<div class='progress'>";
output += `<div class='progress__fill' style='width:${progressData.value}%'></div>`;
output += `<p class='progress__text'>${progressData.perc}%</p>`;
output += "</div>";

(3)移除无效全局进度条初始化

如果不需要页面初始的固定进度条,删除以下代码:

const myProgressBar = document.querySelector(".progress");
updateProgressBar(myProgressBar, 10);

(4)修复选择器错误(若需单独更新进度)

如果后续需要单独更新某个进度条,将原错误代码改为:

document.getElementById('progress__text').textContent = perc;
// 或用jQuery:$('#progress__text').text(perc);

3. 额外优化建议

  • 存储书籍数据时,将页数转换为数字类型,避免后续计算出现字符串拼接问题
  • 增加编辑功能时,同步更新对应书籍的进度条显示

内容的提问来源于stack exchange,提问作者Humam Khaleel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:01:15