如何让print.php等待main.php表单提交刷新完成后再加载?
解决方案:表单POST提交后打开打印页不被浏览器拦截
方案一:提前打开空白窗口,刷新后赋值打印页地址
利用用户主动触发的窗口不会被拦截的特性,先打开空白窗口再提交表单,刷新后给窗口指定打印页地址:
- 给提交按钮绑定点击事件,先打开空白窗口再提交表单:
$('#submitBtn').click(function(e) { // 打开命名的空白窗口,可自定义窗口尺寸参数 const printWin = window.open('', 'printWindow', 'width=800,height=600'); // 提交表单(确保表单已设置正确的action和method="post") $('form').submit(); });
- 在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 } ?>
方案二:提交后显示主动触发的打印按钮(零拦截风险)
如果可以接受用户多一步操作,这个方案最稳妥,完全不会被浏览器拦截:
- 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; } ?>
- 在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 } ?>
方案三:打印页轮询等待提交完成
先打开打印页(用户主动触发),让打印页轮询服务器判断表单是否提交完成,完成后加载打印内容:
- main.php按钮点击事件,先打开打印页再提交表单:
$('#submitBtn').click(function() { // 用户主动打开打印页,不会被拦截 window.open(`print.php?id=<?=$id;?>&view=scoring`, '_blank'); // 提交表单 $('form').submit(); });
- main.php处理POST提交时,设置session标记:
<?php session_start(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 处理表单业务逻辑 $id = 123; // 替换为实际业务中的id变量 // 设置session标记,标记表单提交完成 $_SESSION['submitted_' . $id] = true; } ?>
- 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>
- 新增
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
相关产品推荐
相关产品推荐

