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

如何在点击链接时使用Bootstrap/AdminLTE动态生成模态对话框

实现方案

整体逻辑和你猜测的一致,通过自定义属性存储唯一标识,JS监听触发事件后请求后端获取对应内容渲染到模态框即可,以下是分步实现代码:

步骤1:修改表格链接代码,添加自定义属性存储设备标识

给a标签添加data-did存储唯一设备ID、data-hostname存储主机名,同时添加专属类名方便JS识别:

if ($numrows){
            while( $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC) ) {
        
            echo '  <tr>';
            echo '      <td>' . $row['did'] . '</td>';
            // 修改此行
            echo '      <td><a href="javascript:void(0)" class="device-modal-trigger" data-did="'.$row['did'].'" data-hostname="'.$row['hostname'].'" data-toggle="modal" data-target="#modal-default">' . $row['hostname'] . '</a></td>';
            echo '      <td>' . $row['os'] . '</td>';
            echo '      <td><span class="badge bg-success">Online</span></td>';
            echo '    </tr>';
            
            }
        }

步骤2:添加JS逻辑实现动态内容加载

AdminLTE默认自带jQuery,直接监听Bootstrap模态框的原生显示事件即可:

// 放在页面底部,或者DOM加载完成的回调里
$('#modal-default').on('show.bs.modal', function (event) {
  // 获取触发当前模态框的点击元素
  const triggerElement = $(event.relatedTarget);
  // 读取存在自定义属性里的设备信息
  const deviceId = triggerElement.data('did');
  const deviceHostname = triggerElement.data('hostname');
  const currentModal = $(this);

  // 先更新模态框标题,正文先显示加载态
  currentModal.find('.modal-title').text(`${deviceHostname} 设备详情`);
  currentModal.find('.modal-body').html('<p class="text-muted">内容加载中...</p>');

  // 发起AJAX请求获取对应设备的模态框内容
  $.post('get_device_modal.php', { did: deviceId }, function(response) {
    currentModal.find('.modal-body').html(response);
  }).fail(function() {
    currentModal.find('.modal-body').html('<p class="text-danger">内容加载失败,请刷新后重试</p>');
  });
});

步骤3:编写后端接口返回对应设备内容

新建get_device_modal.php文件,接收设备ID参数查询后返回对应HTML内容:

<?php
// 强制校验参数合法性,避免SQL注入
$deviceId = isset($_POST['did']) ? intval($_POST['did']) : 0;
if ($deviceId <= 0) {
    echo '<p class="text-warning">无效的设备ID</p>';
    exit;
}

// 这里替换为你自己的数据库连接配置
$serverName = "你的数据库地址";
$connectionInfo = ["Database" => "你的数据库名", "UID" => "数据库账号", "PWD" => "数据库密码"];
$conn = sqlsrv_connect($serverName, $connectionInfo);
if (!$conn) {
    echo '<p class="text-danger">数据库连接失败</p>';
    exit;
}

// 使用参数化查询避免注入风险
$sql = "SELECT * FROM 你的设备表名 WHERE did = ?";
$params = [$deviceId];
$stmt = sqlsrv_query($conn, $sql, $params);

if ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    // 这里自定义你要在模态框里显示的内容结构
    echo '<div class="device-info">';
    echo '<p><strong>设备ID:</strong>'.$row['did'].'</p>';
    echo '<p><strong>主机名:</strong>'.$row['hostname'].'</p>';
    echo '<p><strong>操作系统:</strong>'.$row['os'].'</p>';
    // 其他需要展示的字段直接在这里输出即可
    echo '</div>';
} else {
    echo '<p class="text-warning">未找到对应设备信息</p>';
}

// 释放资源关闭连接
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

可选优化

如果模态框要展示的内容已经在当前页面的表格查询结果里,完全可以不用发起AJAX请求,直接把所有要展示的字段都存在a标签的data-*自定义属性里,JS直接读取后渲染到模态框即可,性能更高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:27:03