功能特性
- 支持彈出
alert 提示信息
- 支持多種後續動作:返回上頁、刷新頁面、關閉窗口、跳轉 URL、執行 JS 函數
- 可配置延遲執行時間
- 兼容 Firefox 等瀏覽器的
setTimeout 特性
- 統一輸出 UTF-8 編碼的 JS 代碼
函數簽名
/**
* @param string $Str 提示信息(為空則不彈窗)
* @param string $Typ 動作類型:back|reload|close|function|URL
* @param string $TopWindow 目標窗口/函數名
* @param int $Tim 延遲毫秒(默認 100ms)
*/
function Alert($Str, $Typ = "back", $TopWindow = "", $Tim = 100)
完整實現代碼
<?php
function Alert($Str, $Typ = "back", $TopWindow = "", $Tim = 100) {
echo "<script>\n";
if (!empty($Str)) {
// 雙重換行增強可讀性
echo "alert(\"Warning:\\n\\n{$Str}\\n\\n\");\n";
}
echo "function _r_r_(){\n";
$win = !empty($TopWindow) ? "top" : "self";
switch (strtolower($Typ)) {
case "#": break; // 無操作
case "back":
echo "{$win}.history.go(-1);\n"; break;
case "reload":
echo "{$win}.window.location.reload();\n"; break;
case "close":
echo "window.opener=null; window.close();\n"; break;
case "function":
// 執行父頁面或當前頁面的指定函數
echo "var _T = new Function('return {$TopWindow}')(); _T();\n"; break;
default:
if ($Typ !== "") {
// 視為 URL 跳轉
echo "window.{$win}.location = '{$Typ}';\n";
}
}
echo "}\n";
// 兼容 Firefox: setTimeout 返回值在某些版本為定時器 ID,非 undefined
// 此處採用雙重保險:立即執行 + 定時執行
echo "if (setTimeout('_r_r_()', {$Tim}) == 2) { _r_r_(); }\n";
if ($Tim == 100) {
echo "_r_r_();\n";
} else {
echo "setTimeout('_r_r_()', {$Tim});\n";
}
echo "</script>\n";
exit(); // 終止腳本後續輸出
}
?>
使用示例
<?php
require 'Alert.php';
// 1. 提示並返回上頁
Alert("操作成功!", "back");
// 2. 提示並刷新父頁面
Alert("數據已更新", "reload", "parent");
// 3. 提示並跳轉指定 URL
Alert("登錄成功", "https://example.com/dashboard");
// 4. 提示並執行父頁面 JS 函數 refreshList()
Alert("刪除完成", "function", "parent.refreshList", 500);
// 5. 僅彈窗不跳轉(延遲 3 秒關閉)
Alert("僅提示信息", "#", "", 3000);
?>
注意事項與現代替代
- 阻塞執行:
exit() 會強制終止腳本,確保在輸出前調用,或改為返回 JS 字符串由調用者輸出。
- XSS 風險:
$Str、$Typ、$TopWindow 直接拼接進 JS,必須確保來源可信或經過 json_encode 轉義。
- 現代模式:前後端分離架構下,後端返回 JSON 狀態碼,前端框架(Vue/React/Layer/SweetAlert2)負責彈窗與路由跳轉,不再由 PHP 直接輸出 JS。