首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

ThinkPHP 控制器輸出 JavaScript 失效?literal 標籤一招解決

     編輯:PHP 綜合知識

現象重現

在控制器直接 echo 或 $this->success() 後輸出 <script>,瀏覽器卻只顯示純文字 window.top.location.href='...',標籤被吞噬。

根因分析

ThinkPHP 模板引擎 (或輸出過濾機制) 會對輸出內容進行標籤解析/過濾。控制器直接輸出的 <script> 被視為模板標籤而被移除或轉義。

解決方案:<literal> 包裹

<?php
// 錯誤示範
echo "<script>window.top.location.href='{$url}';</script>";
// 輸出變成:window.top.location.href='...'; (標籤消失)

// 正確做法
echo '<literal><script>alert("退出成功");top.location.href="login";</script></literal>';

完整登出範例

<?php
class AuthController extends Controller {
    public function logout() {
        session('[destroy]');
        $url = U('Login/index');
        // 使用 literal 確保 script 標籤完整輸出到瀏覽器執行
        echo '<literal><script>parent.location.href="' . $url . '";</script></literal>';
        exit;
    }
}

其他可行方案對比

方案優點缺點
<literal> 包裹零改動、相容現有邏輯需記得加標籤
模板檔 success.html 內寫 JS關注點分離需修改跳轉模板
AJAX 回應 JSON + 前端處理跳轉現代 SPA 模式、體驗佳需前端配合改造
HTTP Header Location 重導向無 JS 依賴無法跨 frame (top) 跳轉

最佳實踐建議

  1. 新專案採用 AJAX + JSON 模式,控制器回傳 {url: '...'},前端統一處理跳轉。
  2. 舊專案快速修復:控制器輸出 JS 時務必用 <literal>。
  3. 若使用 $this->success(),自訂 Public/success.html 內寫 <script>parent.location='{$jumpUrl}';</script> 更乾淨。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved