【Delphi】使用TWebBrowser執行JavaScript命令傳入JSON參數執行出錯解決方案

目錄

一、問題背景:

二、實際示例:

三、解決方案:

1. Delphi 代碼:

2. javaScript代碼:


一、問題背景:

????????在用Delphi開發程序,無論是移動端還是PC端,都可以很方便的使用TWebBrowser控件,從而使用H5,這樣就可以實現非常完美的界面(誰用誰知道)。Delphi只負責提供一個程序框架(基座),整個UI界面通過TWebBrowser使用H5來實現,這樣就可以產生各式各樣的UI,而不在使用原生Delphi的UI控件,因為原生Delphi的UI控件在PC端的VCL還是很好用的,但是到了移動端,那就實在是不好用了。

? ? ? ? 這樣就勢必會有個需求就是Delphi直接執行TWebBrowser中的javaScript函數命令,幸運的是TWebBrowser提供了這樣的功能,這就是TWebBrowser的EvaluateJavaScript函數。

//Delphi procedure EvaluateJavaScript(const JavaScript: string);

參數 JavaScript 可以是定義 JavaScript 語句,也可以是當前頁面已經存在的函數。如果是當前頁面已經存在的函數,而且該函數還有一個JSON字符串參數,那么直接調用EvaluateJavaScript函數將會出現錯誤。

二、實際示例:

假如當前網頁中有一個javaScript函數:

//Delphi 底座調用的函數
function OnDelphiCall(JSONStr) {let jo = JSON.parse(decodedData1);ElMessageBox.alert(jo.Server_Message_Content, jo.Server_Message_Title, {// if you want to disable its autofocus// autofocus: false,confirmButtonText: 'OK',showClose: false,})

以上函數Delphi調用時需要傳遞一個JSON字符串,以便javaScript函數顯示一個模式對話框(element-ui)

{"Server_Message_Title":"提示","Server_Message_Content":"數據保存成功!"
}

vue3中,實現Delphi 調用javaScript函數:

onMounted(() => {

? ? //最新的統一 DelphiCall 函數

? ? window.DelphiCall = OnDelphiCall;

})

Delphi中實際調用函數:

G_WebBrowser.EvaluateJavaScript('DelphiCall("' + JSONStr + '");');

此時,如果直接將以下字符串賦值給 JSONStr,然后Delphi調用,肯定會出現錯誤。

????????{
? ????????? "Server_Message_Title":"提示",
? ????????? "Server_Message_Content":"數據保存成功!"
????????}

????????因為以上字符串中包含{dakkuohao ,雙引號等,將會導致javaScript執行錯誤(將參數當作命令,解析失敗錯誤)

三、解決方案:

????????就是將字JSONStr字符串進行特殊的Base64處理,然后傳遞給javaScript,javaScript接收到參數后進行Base64解碼后使用參數。

1. Delphi 代碼:

usesSystem.NetEncoding;procedure ExecuteJavascript(Command,ParamsStr: string);
varS : string;JSONStr64 : string;JavaScriptFunction : string;
beginS := TNetEncoding.URL.Encode(ParamsStr,[],[]);  //這里取消將空格作為+號處理JSONStr64 := TNetencoding.Base64.Encode(S);// Berlin 版本的會自動增加 回車換行,所以需要替換掉,高版本的不需要JSONStr64 := JSONStr64.Replace(#10,'');JSONStr64 := JSONStr64.Replace(#13,'');//2. 構造javascript 函數JavaScriptFunction := Command + '("' + JSONStr64 + '");'; //  'DelphiCall("' + JSONStr64 + '");';//3. 執行瀏覽器javascript函數G_WebBrowser.EvaluateJavaScript(JavaScriptFunction);
end;

2. javaScript代碼:

//Delphi 底座調用的函數
function OnDelphiCall(JSONStr) {//進行Base64解密let decodedData = window.atob(JSONStr);let decodedData1 = decodeURIComponent(decodedData);let jo = JSON.parse(decodedData1);ElMessageBox.alert(jo.Server_Message_Content, jo.Server_Message_Title, {// if you want to disable its autofocus// autofocus: false,confirmButtonText: 'OK',showClose: false,})onMounted(() => {//最新的統一 DelphiCall 函數window.DelphiCall = OnDelphiCall;
})

如果沒有用過TWebBrowser可能無法看懂本文!開發中實際遇到的問題,期望能夠幫助到需要的人!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160289.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160289.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160289.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Postman如何使用(一):導入導出和發送請求查看響應

一、Postman如何導入導出打包的應用 在Postman中導入導出我們的 測試數據包 和 工作環境 非常的方便: 導出數據包的方法如下: 如果你想學習自動化測試,我這邊給你推薦一套視頻,這個視頻可以說是B站播放全網第一的自動化測試教程…

七天.NET 8操作SQLite入門到實戰 - 第三天SQLite快速入門

前言 今天我們花費一個小時快速了解SQLite數據類型、SQLite常用命令和語法。 七天.NET 8操作SQLite入門到實戰詳細教程 第一天 SQLite 簡介第二天 在 Windows 上配置 SQLite環境 EasySQLite項目源碼地址 GitHub地址:https://github.com/YSGStudyHards/EasySQLite&…

第一百七十六回 如何創建漸變色邊角

文章目錄 1. 概念介紹2. 實現方法3. 代碼與細節3.1 示例代碼3.2 代碼細節 4. 內容總結 我們在上一章回中介紹了"如何創建放射形狀漸變背景"相關的內容,本章回中將介紹"如何創建漸變色邊角".閑話休提,讓我們一起Talk Flutter吧。 1.…

2023-11-22 LeetCode每日一題(網格中的最小路徑代價)

2023-11-22每日一題 一、題目編號 2304. 網格中的最小路徑代價二、題目鏈接 點擊跳轉到題目位置 三、題目描述 給你一個下標從 0 開始的整數矩陣 grid ,矩陣大小為 m x n ,由從 0 到 m * n - 1 的不同整數組成。你可以在此矩陣中,從一個…

一石激起千層浪,有關奧特曼被炒的消息引發了一場熱烈的討論

在毫無征兆的情況下,OpenAI CEO山姆-奧特曼被炒了。 一石激起千層浪,有關奧特曼被炒的消息引發了一場熱烈的討論。 有人將其看成是一場「宮斗」,有人將其看成是OpenAI的董事會與創始人們的一次糾偏。 無論如何,這樣一件看似并無…

網工內推 | 合資公司網工,CCNP/HCIP認證優先,朝九晚六

01 中企網絡通信技術有限公司 招聘崗位:網絡工程師 職責描述: 1、按照工作流程和指引監控網絡運行情況和客戶連接狀況; 2、確保各監控系統能正常運作; 3、快速響應各個網絡告警事件; 4、判斷出網絡故障,按…

數據要素:數字經濟最核心的資源。(存儲,流通,使用)數據資產的價值量化評估,數據要素的特點

目錄 數據要素:數字經濟最核心的資源。(存儲,流通,使用) 數據資產的價值量化評估

淺談對于Android CMakeLists文件的理解

文章目錄 文件結構 文件結構 cmake_minimum_required(VERSION 3.10.2) //設置cmake版本set(CMAKE_LIBRARY_OUTPUT_DIRECTORY${CMAKE_CURRENT_LIST_DIR}/../jniLibs/${ANDROID_ABI}) //設置.so文件輸出路徑 project("add") //編譯目錄add_library( common //生成.so文…

【Linux虛擬內存的配置】

設置Linux虛擬內存 注意:在做項目時,電腦內存不夠用,怎么辦? 這里給大家提供了一種解決方案,用磁盤換內存,具體如下: 虛擬內存swap介紹 如果你的服務器的總是報告內存不足,并且時常因為內存不足而引發服務被強制kill的話,在不增加物理內…

一、爬蟲-爬取豆瓣電影案例

1、環境配置 你需要一個pycharm和requests第三方庫,在安裝完成之后即可繼續瀏覽。 2、操作流程 (1)打開豆瓣電影網站,點擊排行榜,點擊喜劇,檢查 (2)可以看到鼠標每次下移&#xff0…

藍橋杯每日一題2023.11.22

題目描述 題目分析 由題目知其每個品牌積分一定小于315故直接暴力枚舉每個品牌如果符合要求直接輸出即可 &#xff08;答案&#xff1a;150&#xff09; #include<bits/stdc.h> using namespace std; int main() {for(int i 1; i < 315; i ){for(int j 1; j <…

redis運維(十四) hash緩存案例

一 緩存案例 ① 需求 ② 個人理解 策略&#xff1a;不更新緩存&#xff0c;而是刪除緩存大部分觀點認為&#xff1a;1、做緩存不應該是去更新緩存,而是應該刪除緩存2、然后由下個請求去緩存,發現不存在后再讀取數據庫,寫入redis緩存 高并發場景下,到底先更新緩存還是先更…

c語言-操作符詳解(含優先級與結合性)

文章目錄 了解什么是操作數、操作符操作數&#xff1a;操作符 操作符詳解&#xff1a;1.算術操作符&#xff1a; 、- 、* 、/ 、%2.移位操作符: << >>3.位操作符: & | ^4. 賦值操作符: 、 、 - 、 * 、 / 、% 、<< 、>> 、& 、| 、^5. 單?操…

【LeetCode刷題】--39.組合總和

39.組合總和 本題詳解&#xff1a;回溯算法剪枝 class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {int len candidates.length;List<List<Integer>> res new ArrayList<>();if (len 0) {return r…

KyLin離線安裝OceanBase

去OceanBase下載若干文件 1 首先安裝ob-deploy-2.3.1-2.el7.x86_64.rpm rpm -ivh ob-deploy-2.3.1-2.el7.x86_64.rpm# 運行此命令的時候他會報錯 RPM should not be used directly install RPM packages, use Alien instead! 這個需要用Alien去轉換為deb的包&#xff0c;不…

MethodArgumentNotValidException 與 ConstraintViolationException

MethodArgumentNotValidException 和ConstraintViolationException 都是用于處理參數校驗異常的異常類&#xff0c;但它們在不同的上下文中使用。 1. MethodArgumentNotValidException&#xff1a; - MethodArgumentNotValidException 是在 Spring MVC 或 Spring Boot 中處…

一篇五分生信臨床模型預測文章代碼復現——Figure 10.機制及腫瘤免疫浸潤(六)

之前講過臨床模型預測的專欄,但那只是基礎版本,下面我們以自噬相關基因為例子,模仿一篇五分文章,將圖和代碼復現出來,學會本專欄課程,可以具備發一篇五分左右文章的水平: 本專欄目錄如下: Figure 1:差異表達基因及預后基因篩選(圖片僅供參考) Figure 2. 生存分析,…

windows系統玩游戲找不到d3dx9_35.dll缺失的解決方法

分享一個我們在打開游戲或許軟件過程中遇到的問題——“由于找不到d3dx9_35.dll,無法繼續執行代碼”的五個修復方案。這個問題可能會影響到我們的工作和娛樂效率&#xff0c;甚至可能導致工作的延期。因此&#xff0c;我希望通過今天的文章&#xff0c;能夠幫助大家更好地解決這…

電大搜題——打開學習之門的最佳選擇

在快節奏的現代社會&#xff0c;追求知識和學習成為愈發重要的需求。然而&#xff0c;許多人由于時間和機會的限制&#xff0c;無法實現自己的教育夢想。就在這個時候&#xff0c;安徽開放大學廣播電視大學通過推出電大搜題微信公眾號&#xff0c;為廣大學子提供了一個便捷高效…

別低頭,皇冠會掉;別流淚,賤人會笑。

別低頭&#xff0c;皇冠會掉&#xff1b;別流淚&#xff0c;賤人會笑。