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

AJAX获取数据后无法实时更新HTML中div的data-value问题求助

解决AJAX获取数据后无法实时更新ldBar进度条的问题

我来帮你梳理下问题所在,你现在的核心问题是成功拿到了后端数据,但更新data-value后进度条没有实时刷新,主要有几个关键问题需要修正:


1. Flask后端返回格式冗余

你现在的后端代码用了json.dumps再jsonify,这会导致返回的是双重JSON字符串(jsonify本身就会自动序列化Python对象为JSON格式),前端还要额外做JSON.parse,容易引发解析问题。

修正后的后端代码:

@app.route("/fetch_bar",methods=['POST'])
def fetch_bar():
    result = [{'hostname': 'testaa101.com', 'status': '30'}] ### 实际从数据库获取的示例数据
    return jsonify(result)  # 直接传入列表,jsonify会自动处理序列化

2. 前端JS变量逻辑错误

你的循环里用了未定义的index变量,应该替换成循环变量ind;另外selects变量也没有明确定义(推测是页面上对应hostname的选择器元素),这里先修正变量问题:

function bar_progress(){
    $.ajax({
        url:"{{ url_for('fetch_bar') }}",
        type:"post",
        dataType: "json",
        async: true,  // 建议改成true,同步请求会阻塞页面交互
        success:function(response){
            // 后端直接返回JSON,无需再parse
            var len = response.length;
            var bars = document.querySelectorAll(".ldBar");  // 改用class选择多个进度条
            // 假设selects是页面上对应hostname的选择器元素,根据实际情况调整
            var selects = document.querySelectorAll("[name='hostname']"); 
            if (len > 0) {
                for( var ind = 0; ind < len; ind++){
                    // 修正循环变量为ind,匹配当前项
                    if (selects[ind].value == response[ind].hostname) {
                        bars[ind].setAttribute("data-value", response[ind].status);
                        // 关键:调用ldBar的API触发界面刷新
                        const barInstance = new ldBar(bars[ind]);
                        barInstance.set(response[ind].status);
                    }
                }
            }
        }
    })
}

3. 核心问题:ldBar需主动触发更新

这是最关键的一点!ldBar这类进度条插件初始化后不会自动监听data-value属性的变化,仅仅修改属性值不会触发界面刷新。你必须调用它的官方API来更新数值:

  • 单个进度条:创建ldBar实例后调用.set()方法传入新值
  • 多个进度条:循环遍历每个元素,创建实例并执行更新

另外建议把async: false改成async: true,同步AJAX会阻塞页面,严重影响用户体验。


4. HTML模板优化(可选但建议)

你的HTML里所有进度条的id都是ldBar,这不符合HTML规范(id必须唯一),建议改成动态id或用class选择:

<form id="myform" name="myform" action="{{url_for('show_select')}}", method="post">
    {% for entry in entries %}
    .....
    <td>
        <input id="stage" type="button" class="btn-primary" onclick="readTextFile();" name="stage" value="{{entry.stage}}" >
        <!-- 改用class选择,id可选动态生成 -->
        <div id="ldBar-{{ loop.index }}" class="ldBar label-center" data-value="0" data-preset="stripe" data-aspect-ratio="none" style="width:100%;display: block;" ></div>
    </td>
    ......
    {%endfor %}

调整完这些后,你的进度条应该就能实时更新啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:28:17