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

Laravel中使用Livewire刷新JS渲染投票统计页面的脚本执行问题

解决Livewire刷新时JavaScript脚本不重新执行的问题

Livewire的DOM更新机制不会自动重新执行页面初始加载时的JavaScript代码,这就是你的投票统计页面只渲染一次的原因。要解决这个问题,你需要将脚本逻辑封装为可复用函数,并通过Livewire的生命周期事件触发重新执行。

步骤1:重构JavaScript代码为可复用函数

把原来的全局变量初始化、DOM渲染、百分比计算逻辑全部封装到独立函数中,避免依赖全局状态:

function initPoll() {
    // 获取最新的Livewire传递的数据
    var question = @json($question);
    var answer1 = @json($answer1);
    var answer2 = @json($answer2);
    var answer3 = @json($answer3);
    var answer4 = @json($answer4);
    var answer5 = @json($answer5);
    var answer6 = @json($answer6);

    // 计算总票数
    var countAnswers = [answer1, answer2, answer3, answer4, answer5, answer6];
    var total = countAnswers.reduce((sum, num) => sum + num, 0);

    // 过滤空选项
    var questionAnswers = [question['a'], question['b'], question['c'], question['d'], question['e'], question['f']];
    const results = questionAnswers.filter(element => element !== '');

    // 构建投票数据对象
    let poll = {
        question: 'Poll \n\n ' + question['question'],
        answers: results,
        pollcount: total,
        answerweight: countAnswers,
        selectanswer: -1
    };

    // 更新DOM元素
    let polldom = {
        question: document.querySelector(".poll .question"),
        answers: document.querySelector(".poll .answers")
    };

    polldom.question.innerText = poll.question;
    polldom.answers.innerHTML = poll.answers.map(function(answer, i) {
        return `
            <div class="answer-text">${answer}</div>
            <div class="answer">
                <span class="percentage_bar"></span>
                <span class="percentage_value"></span>
            </div>
        `;
    }).join("");

    // 渲染百分比结果
    showresults(poll);
}

function showresults(poll) {
    let answers = document.querySelectorAll(".poll .answers .answer");
    for (let i = 0; i < answers.length; i++) {
        let percentage = 0;
        if (poll.pollcount > 0) {
            percentage = Math.round((poll.answerweight[i] * 100) / poll.pollcount);
        }

        answers[i].querySelector(".percentage_bar").style.width = percentage + "%";
        answers[i].querySelector(".percentage_value").innerText = percentage + "%";
    }
}

步骤2:添加Livewire事件监听

通过监听Livewire的生命周期事件,确保页面加载和每次Livewire刷新时都执行初始化函数:

// 页面首次加载时初始化投票
document.addEventListener('DOMContentLoaded', function() {
    initPoll();
});

// Livewire每次更新DOM后重新初始化投票
document.addEventListener('livewire:update', function() {
    initPoll();
});

步骤3:清理冗余代码

移除页面中的body onload="showresults()",因为现在初始化逻辑已经包含了百分比渲染,无需单独触发。

关键说明

  • livewire:update事件会在Livewire完成DOM更新后触发,此时@json($question)等变量已经是最新值
  • 将showresults()改为接收poll参数,避免依赖全局变量,保证每次执行都使用最新数据
  • 使用reduce简化总票数计算,让代码更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:45:31