【Delphi】使用TWebBrowser执行JavaScript命令传入JSON参数执行出错解决方案

news2025/1/18 11:58:02

目录

一、问题背景:

二、实际示例:

三、解决方案:

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 代码:

uses
  System.NetEncoding;

procedure ExecuteJavascript(Command,ParamsStr: string);
var
  S : string;
  JSONStr64 : string;
  JavaScriptFunction : string;
begin
  S := 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.coloradmin.cn/o/1239299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LongAccumulator

原子操作之LongAccumulator 和LongAdder的区别在于,LongAdder是在Cell里面只能做加减操作,不能乘除,而LongAccumulator就可以定义乘除操作。原理和LongAdder都是一样的,一个Base和一个Cells数组。 原文跳转地址

Java游戏之飞翔的小鸟

前言 飞翔的小鸟 小游戏 可以作为 java入门阶段的收尾作品 ; 需要掌握 面向对象的使用以及了解 多线程,IO流,异常处理,一些java基础等相关知识。一 、游戏分析 1. 分析游戏逻辑 (1)先让窗口显示出来&#x…

51单片机按键控制LED灯亮灭的N个玩法

51单片机按键控制LED灯亮灭的N个玩法 1.概述 这篇文章介绍按键的使用,以及通过控制LED灯的小实验,发现按键中存在的问题,然后思考并解决这些问题。达到熟练使用按键控制元器件。 2.搭建硬件环境 1.硬件准备 名称型号数量单片机STC12C205…

【办公常识】写好的代码如何上传?使用svn commit

首先找到对应的目录 找到文件之后点击SVN Commit

如何做好项目管理?年薪百万项目大佬一直在用这11张图

大家好,我是老原。 日常工作中,我们会遇到各种大大小小的工作项目,如何能让项目保质保量的完成,是我们项目经理的目标。 项目管理的流程可以说是由一系列的子过程组成的,它是一个循序渐进的过程,所以不能…

排序算法-----快速排序(非递归实现)

目录 前言 快速排序 基本思路 非递归代码实现 前言 很久没跟新数据结构与算法这一栏了,因为数据结构与算法基本上都发布完了,哈哈,那今天我就把前面排序算法那一块的快速排序完善一下,前面只发布了快速排序递归算法,…

智能合约安全漏洞与解决方案

// SPDX-License-Identifier: MIT pragma solidity ^0.7.0;import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/math/SafeMath.sol";/*智能合约安全在智能合约中安全问题是一个头等大事,因为智能合约不像其他语…

LeetCode 2304. 网格中的最小路径代价:DP

【LetMeFly】2304.网格中的最小路径代价:DP 力扣题目链接:https://leetcode.cn/problems/minimum-path-cost-in-a-grid/ 给你一个下标从 0 开始的整数矩阵 grid ,矩阵大小为 m x n ,由从 0 到 m * n - 1 的不同整数组成。你可以…

网工内推 | 合资公司网工,CCNP/HCIP认证优先,朝九晚六

01 中企网络通信技术有限公司 招聘岗位:网络工程师 职责描述: 1、按照工作流程和指引监控网络运行情况和客户连接状况; 2、确保各监控系统能正常运作; 3、快速响应各个网络告警事件; 4、判断出网络故障,按…

【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…

栈和队列【详解】

目录 一、栈 1.栈的定义 2.栈的初始化 3.入栈 4.出栈 5.获取栈顶元素 6.获取栈元素的个数 7.判断栈是否为空 8.销毁栈 二、队列 1.队列的定义 2.入队 3.出队 4.获取队头元素 5.获取队尾元素 6.判断队列是否为空 7.获取队列的元素个数 8.销毁队列 前言&#xf…

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于天鹰优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

pycurl>=7.43.0.5机器学习环境配置问题

去官网下载对应版本.whl文件&#xff0c;注意使用python --version提前查看 python版本信息和64bit还是32bit,下载对应版本。 cd 到该路径下&#xff0c;并pip。6

WPF树形控件TreeView使用介绍

WPF 中的 TreeView 控件用于显示层次结构数据。它是由可展开和可折叠的 TreeViewItem 节点组成的&#xff0c;这些节点可以无限嵌套以表示数据的层次。 TreeView 基本用法 例如实现下图的效果&#xff1a; xaml代码如下&#xff1a; <Window x:Class"TreeView01.Mai…

docker、elasticsearch8、springboot3集成备忘

目录 一、背景 二、安装docker 三、下载安装elasticsearch 四、下载安装elasticsearch-head 五、springboot集成elasticsearch 一、背景 前两年研究了一段时间elasticsearch&#xff0c;当时也是网上找了很多资料&#xff0c;最后解决个各种问题可以在springboot上运行了…

LeetCode(32)串联所有单词的子串【滑动窗口】【困难】(含图解)

目录 1.题目2.答案3.提交结果截图4.图解 链接&#xff1a; 串联所有单词的子串 1.题目 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 w…

Mac中LaTex无法编译的问题

最近在使用TexStudio时&#xff0c;遇到一个棘手的问题&#xff1a; 无法编译&#xff0c;提示如下&#xff1a; kpathsea: Running mktexfmt xelatex.fmt /Library/TeX/texbin/mktexfmt: kpsewhich -var-valueTEXMFROOT failed, aborting early. BEGIN failed–compilation a…

基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码

基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于原子轨道搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xf…

2023年中国油墨树脂主要环节、产量及市场规模分析[图]

油墨树脂是指用于油墨制造中的一种高分子材料&#xff0c;主要用于改善油墨的粘性、流动性、光泽度和耐磨性等性能。其主要成分为合成树脂&#xff0c;如聚酯、聚酰胺、聚丙烯酸酯等。油墨树脂在油墨制造中的应用非常广泛&#xff0c;可以用于各种类型的油墨&#xff0c;包括印…

Java架构师软件架构风格

目录 1 数据流风格1.1 管道过滤器1.2 数据流风格的优点2 调用返回风格2.1 面向对象风格2.2 调用返回风格总结3 独立构件风格3.1 事件驱动系统风格的主要特点3.2 独立构件风格总结4 虚拟机风格4.1 虚拟机风格总结5 仓库风格5.1 仓库风格总结想学习架构师构建流程请跳转:Java架构…