讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

updream

一键生成高质量推广成片

剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

如何使用 jQuery Ajax 正确循环获取多个候选人的票数结果

老墨小哥_6775

老墨小哥_6775

发布时间:2026-01-05 12:59:22

|

874人浏览过

|

来源于php中文网

原创

如何使用 jQuery Ajax 正确循环获取多个候选人的票数结果

本文解决 jquery 中因重复 id 导致 ajax 仅获取首个候选人数据的问题,通过改用 class 选择器、批量请求或单次返回数组的方式,实现对多个候选人(如总统候选人)的票数准确异步加载与显示。

在使用 jQuery + PHP 构建动态投票结果展示页时,一个常见却隐蔽的错误是:在循环生成 HTML 元素时重复使用相同的 id 属性(如 id="contestname" 和 id="precount")。由于 HTML 规范要求 id 必须全局唯一,jQuery 的 $('#contestname') 永远只匹配第一个元素,导致后续候选人信息无法读取——这正是你仅看到首位候选人票数、其余空白的根本原因。

✅ 正确做法:用 class 替代 id,批量处理

首先,修改 index.php 中的循环输出,将 id 改为语义化 class,并确保每个候选人区块结构一致:

<h4 class="header-title mb-3">Presidential Result</h4>
<div class="">
  <div class="row text-center">
    <?php
      $sql = "SELECT * FROM contestants WHERE post='president'";
      $query = mysqli_query($conn, $sql);
      while ($row = mysqli_fetch_array($query)) {
    ?>
      <div class="col-md-6">
        <p class="text-muted mb-0 mt-3 contestname"><?php echo htmlspecialchars($row['fullname']); ?></p>
        <h2 class="fw-normal mb-3 precount"><!-- 票数将插入此处 --></h2>
      </div>
    <?php } ?>
  </div>
</div>
⚠️ 注意:使用 htmlspecialchars() 防止 XSS;contestname 和 precount 均为 class,可被多个元素共享。

? JavaScript:批量获取姓名,并统一请求或逐个更新

方案一(推荐):单次请求,后端返回结构化数组(高效、减少请求次数)

修改 Query.js,一次性收集所有候选人姓名,发起一次 Ajax 请求:

function view_pres_count() {
  // 获取所有候选人姓名(去空格、去重可选)
  const names = $('.contestname').map(function() {
    return $(this).text().trim();
  }).get();

  if (names.length === 0) return;

  $.ajax({
    url: 'prescount.php',
    method: 'POST',
    dataType: 'json', // 自动解析 JSON,无需 $.parseJSON
    data: { names: names }, // 传数组:{names: ["Jimmy Carter", "Ulysses Grant"]}
    success: function(data) {
      // data 应为形如 [{html: "1245"}, {html: "987"}] 的数组
      $('.precount').each(function(index) {
        $(this).html(data[index]?.html || '0');
      });
    },
    error: function() {
      console.error('Failed to load vote counts.');
      $('.precount').text('—');
    }
  });
}

对应地,prescount.php 需接收 $_POST['names'],查询数据库并按顺序返回同长度数组:

javascript-typescript-typescript-scaffold
javascript-typescript-typescript-scaffold

你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

下载
<?php
header('Content-Type: application/json; charset=utf-8');
require 'db.php'; // 你的数据库连接

if (!isset($_POST['names']) || !is_array($_POST['names'])) {
  echo json_encode([]);
  exit;
}

$names = array_map(function($n) use ($conn) {
  return mysqli_real_escape_string($conn, trim($n));
}, $_POST['names']);

// 构建 IN 查询(注意:需确保姓名无注入风险,此处已转义)
$placeholders = str_repeat('?,', count($names) - 1) . '?';
$stmt = $conn->prepare("SELECT fullname, COUNT(*) as votes FROM votes v 
                         JOIN contestants c ON v.contestant_id = c.id 
                         WHERE c.fullname IN ($placeholders) AND c.post = 'president' 
                         GROUP BY c.fullname");

// 绑定参数(PHP 8.1+ 可用 ...$names)
$types = str_repeat('s', count($names));
$stmt->bind_param($types, ...$names);
$stmt->execute();
$result = $stmt->get_result();

// 构建按输入顺序排列的结果数组
$nameToVotes = [];
while ($row = $result->fetch_assoc()) {
  $nameToVotes[$row['fullname']] = (int)$row['votes'];
}

// 按前端传入顺序填充响应
$response = [];
foreach ($_POST['names'] as $name) {
  $response[] = ['html' => $nameToVotes[$name] ?? '0'];
}

echo json_encode($response);
?>

方案二:逐个请求(仅适用于候选人极少且无性能要求场景)

若坚持为每人发一次请求,需用 .each() 遍历并闭包保存索引:

function view_pres_count() {
  $('.contestname').each(function(index) {
    const name = $(this).text().trim();
    $.ajax({
      url: 'prescount.php',
      method: 'POST',
      data: { present: name },
      dataType: 'json',
      success: function(data) {
        $('.precount').eq(index).html(data.html || '0');
      }
    });
  });
}

❗ 不推荐:N 个候选人 → N 次 HTTP 请求,易触发并发限制、延迟叠加、服务器压力大。

✅ 最终调用建议

在 DOM 加载完成后初始化数据(例如放在 $(document).ready(...) 内):

$(document).ready(function() {
  view_pres_count(); // 首次加载
  // 可选:每 10 秒刷新一次
  // setInterval(view_pres_count, 10000);
});

? 总结

  • 永远避免在循环中重复使用 id —— 这是 jQuery 选择器失效的根源;
  • 使用 class + .map().get() 批量提取数据,语义清晰且兼容性强;
  • 优先采用「单次请求 + 结构化返回」方案,兼顾性能、可维护性与健壮性;
  • 后端需严格按前端传入顺序组织响应,确保 DOM 更新一一对应;
  • 始终对用户输入和数据库输出做安全过滤(htmlspecialchars, mysqli_real_escape_string 或预处理语句)。

遵循以上实践,即可稳定、高效地展示多位候选人的实时得票结果。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

621

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1256

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2362

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

2168

2023.12.04

jquery实现分页方法
jquery实现分页方法

在jQuery中实现分页可以使用插件或者自定义实现。想了解更多jquery分页的相关内容,可以阅读本专题下面的文章。

513

2023.12.06

jquery中隐藏元素是什么
jquery中隐藏元素是什么

jquery中隐藏元素是非常重要的一个概念,在使用jquery隐藏元素之前,需要先了解css样式中关于元素隐藏的属性,比如display、visibility、opacity等属性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2024.02.23

jquery中什么是高亮显示
jquery中什么是高亮显示

jquery中高亮显示是指对页面搜索关键词时进行高亮显示,其实现办法:1、先获取要高亮显示的行,获取搜索的内容,再遍历整行内容,最后添加高亮颜色;2、使用“jquery highlight”高亮插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

906

2024.02.23

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

309

2026.01.13

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn