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

如何让print.php等待main.php表单提交刷新完成后再加载?

解决方案:表单POST提交后打开打印页不被浏览器拦截

方案一:提前打开空白窗口,刷新后赋值打印页地址

利用用户主动触发的窗口不会被拦截的特性,先打开空白窗口再提交表单,刷新后给窗口指定打印页地址:

  1. 给提交按钮绑定点击事件,先打开空白窗口再提交表单:
$('#submitBtn').click(function(e) {
    // 打开命名的空白窗口,可自定义窗口尺寸参数
    const printWin = window.open('', 'printWindow', 'width=800,height=600');
    // 提交表单(确保表单已设置正确的action和method="post")
    $('form').submit();
});
  1. 在main.php的PHP逻辑中,判断POST提交完成后,输出JS代码给已打开的窗口赋值地址:
<?php
// 处理表单POST提交的业务逻辑
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 此处编写表单处理代码,如保存数据、获取$id等
    $id = 123; // 替换为实际业务中的id变量

    // 输出JS代码,定位到之前打开的窗口
    ?>
    <script>
        // 通过窗口名获取已打开的窗口实例
        const printWin = window.open('', 'printWindow');
        if (printWin && !printWin.closed) {
            // 跳转至目标打印页
            printWin.location.href = 'print.php?id=<?=$id;?>&view=scoring';
        } else {
            // 处理窗口意外关闭的情况
            alert('打印窗口已关闭,请重新操作');
        }
    </script>
    <?php
}
?>

方案二:提交后显示主动触发的打印按钮(零拦截风险)

如果可以接受用户多一步操作,这个方案最稳妥,完全不会被浏览器拦截:

  1. main.php处理POST提交时,设置临时cookie标记:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 处理表单业务逻辑
    $id = 123; // 替换为实际业务中的id变量

    // 设置临时cookie,标记需要触发打印
    setcookie('need_print', '1', time() + 300, '/'); // 5分钟有效期
    setcookie('print_id', $id, time() + 300, '/');

    // 跳转回main.php,避免表单重复提交
    header('Location: main.php');
    exit;
}
?>
  1. 在main.php页面中,检测cookie并显示打印按钮:
<?php
// 检测是否有打印需求
if (isset($_COOKIE['need_print']) && $_COOKIE['need_print'] === '1') {
    $printId = $_COOKIE['print_id'];
    // 清除cookie,避免重复显示打印提示
    setcookie('need_print', '', time() - 3600, '/');
    setcookie('print_id', '', time() - 3600, '/');
    ?>
    <div style="padding:1rem; background:#f5f5f5;">
        <button id="printBtn" style="padding:.5rem 1rem; cursor:pointer;">点击打开打印页面</button>
    </div>
    <script>
        $('#printBtn').click(function() {
            window.open(`print.php?id=<?=$printId;?>&view=scoring`, '_blank');
        });
    </script>
    <?php
}
?>

方案三:打印页轮询等待提交完成

先打开打印页(用户主动触发),让打印页轮询服务器判断表单是否提交完成,完成后加载打印内容:

  1. main.php按钮点击事件,先打开打印页再提交表单:
$('#submitBtn').click(function() {
    // 用户主动打开打印页,不会被拦截
    window.open(`print.php?id=<?=$id;?>&view=scoring`, '_blank');
    // 提交表单
    $('form').submit();
});
  1. main.php处理POST提交时,设置session标记:
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 处理表单业务逻辑
    $id = 123; // 替换为实际业务中的id变量
    // 设置session标记,标记表单提交完成
    $_SESSION['submitted_' . $id] = true;
}
?>
  1. print.php页面实现轮询逻辑:
<?php
session_start();
$id = $_GET['id'];
$isLoaded = isset($_GET['loaded']);
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>等待打印</title>
    <script>
        function checkSubmitStatus() {
            // 发起请求检查表单提交状态
            fetch(`check_submit.php?id=<?=$id;?>`)
                .then(res => res.json())
                .then(data => {
                    if (data.isSubmitted) {
                        // 提交完成,跳转至加载打印内容的地址
                        window.location.href = `print.php?id=<?=$id;?>&view=scoring&loaded=1`;
                    } else {
                        // 未完成,0.5秒后再次查询
                        setTimeout(checkSubmitStatus, 500);
                    }
                })
                .catch(err => {
                    console.error('检查提交状态失败:', err);
                    setTimeout(checkSubmitStatus, 1000);
                });
        }

        // 仅在未加载打印内容时启动轮询
        <?php if (!$isLoaded) { ?>
        window.onload = checkSubmitStatus;
        <?php } ?>
    </script>
</head>
<body>
    <?php if ($isLoaded && isset($_SESSION['submitted_' . $id]) && $_SESSION['submitted_' . $id]) { ?>
        <!-- 此处放置打印内容 -->
        <h1>打印内容展示</h1>
        <?php
        // 清除session标记,避免重复加载
        unset($_SESSION['submitted_' . $id]);
        ?>
    <?php } else { ?>
        <div style="text-align:center; margin-top:2rem;">
            <p>正在等待数据提交完成...</p>
        </div>
    <?php } ?>
</body>
</html>
  1. 新增check_submit.php接口,用于查询提交状态:
<?php
session_start();
$id = $_GET['id'];
$isSubmitted = isset($_SESSION['submitted_' . $id]) && $_SESSION['submitted_' . $id];

echo json_encode(['isSubmitted' => $isSubmitted]);
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:32:51