当前位置: 首页 > news >正文

【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可能无法看懂本文!开发中实际遇到的问题,期望能够帮助到需要的人!

相关文章:

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

目录 一、问题背景: 二、实际示例: 三、解决方案: 1. Delphi 代码: 2. javaScript代码: 一、问题背景: 在用Delphi开发程序,无论是移动端还是PC端,都可以很方便的使用TWebBrows…...

04 if进阶

elif 否则如果 如果条件没有满足 会继续进入“否则如果”里面判断 只要满足一个条件 条件判断立即终止 chinese 100 if chinese 100:print("我们去迪士尼玩")elif chinese > 90:print("我们去朱雀森林公园")else:print("回家写作业")if n…...

2023全球数字贸易创新大赛9-12

目录 回答评委提问:先说痛点-再说怎样解决 食品安全溯源是否全流程 星火• 链网...

vue3的两个提示[Vue warn]: 关于组件渲染和函数外部使用

1. [Vue warn]: inject() can only be used inside setup() or functional components. 这个消息是提示我们,需要将引入的方法作为一个变量使用。以vue-store为例,如果我们按照如下的方式使用: import UseUserStore from ../../store/module…...

Ubuntu环境下基于libxl库文件使用C++实现对表格的操作

功能 表格不存在则创建后再进行操作创建sheet添加新的工作表在sheet中增加数据设置单元格样式 相关配置 下载地址:libxl选择 LibXL for Linux 4.2.0 i386 x64 armhf aarch64 安装配置 1,使用 tar zxvf 文件名.tar.gz 进行文件解压2,创…...

Sentinel与SpringBoot整合

好的&#xff0c;以下是一个简单的Spring Cloud整合Sentinel的代码示例&#xff1a; 首先&#xff0c;在pom.xml中添加以下依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel&l…...

如何实现数据通过表格批量导入数据库

文章目录 1. 准备工作2. 创建数据库表3. 编写导入脚本4. 优化和拓展4.1 批量插入的优势4.2 错误处理4.3 数据验证4.4 数据转换 5. 总结 &#x1f389;如何实现数据通过表格批量导入数据库 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&…...

(动手学习深度学习)第13章 计算机视觉---微调

文章目录 微调总结 微调代码实现 微调 总结 微调通过使用在大数据上的恶道的预训练好的模型来初始化模型权重来完成提升精度。预训练模型质量很重要微调通常速度更快、精确度更高 微调代码实现 导入相关库 %matplotlib inline import os import torch import torchvision f…...

训练跳跃(青蛙跳台阶),剑指offer,力扣

目录 题目地址&#xff1a; 题目&#xff1a; 青蛙跳台阶问题 我们直接看题解吧&#xff1a; 相似题目&#xff0c;斐波那契数列&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 审题目事例提示&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 小鸡识补充 题…...

Linux中路由route

route 显示当前路由表信息 route add -net 192.168.10.0 netmask 255.255.255.0 dev ens160去往192.168.10.0/24网段的路由通过ens160网卡出去add 添加路由&#xff08;del表示删除路由&#xff09;-A 设置地址类型&#xff08;默认ipv4 配置ipv6地址时&#xff1a;-A …...

美国国家安全实验室员工详细数据在网上泄露

一个从事出于政治动机的攻击的网络犯罪组织破坏了爱达荷国家实验室&#xff08;INL&#xff09;的人力资源应用程序&#xff0c;该组织周日在电报上发帖称&#xff0c;已获得该核研究实验室员工的详细信息。 黑客组织 SiegedSec 表示&#xff0c;它已经访问了“数十万用户、员…...

一石激起千层浪,有关奥特曼被炒的消息引发了一场热烈的讨论

在毫无征兆的情况下&#xff0c;OpenAI CEO山姆-奥特曼被炒了。 一石激起千层浪&#xff0c;有关奥特曼被炒的消息引发了一场热烈的讨论。 有人将其看成是一场「宫斗」&#xff0c;有人将其看成是OpenAI的董事会与创始人们的一次纠偏。 无论如何&#xff0c;这样一件看似并无…...

Vue 定义只读数据 readonly

readonly 让一个响应式数据变为 **深层次的只读数据**。 isReadonly 判断一个数据是不是只读数据。 应用场景&#xff1a;不希望数据被修改时使用。 readonly 深层次只读&#xff1a; <template><h1>reactive数据</h1><p>姓名&#xff1a;{{ info…...

[Linux] Network: IPv6 link-local 地址是否可用不自动生成

原来有一段时间在做扩充产品的VLAN个数&#xff0c;然后就遇到过一个问题&#xff1a;说这个Linux的默认配置里&#xff0c;会为每一个网络接口添加一个link-local的地址&#xff0c;就是FE80::开头的地址&#xff0c;在RFC-4291里有如下的定义&#xff1a; Link-Local unicas…...

万字解析:十大排序(直接插入排序+希尔排序+选择排序+堆排序+冒泡排序+快速排序+归并排序+计数排序+基数排序+桶排序)

文章目录 十大排序排序算法复杂度及稳定性分析一、 排序的概念1.排序&#xff1a;2.稳定性&#xff1a;3.内部排序&#xff1a;4.外部排序&#xff1a; 二、插入排序1.直接插入排序2.希尔排序 三、选择排序1.直接选择排序方法一方法二直接插入排序和直接排序的区别 2.堆排序 四…...

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

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

“我,24岁,年薪20万”:选对了行业究竟多重要?

那些在职场上顺风顺水&#xff0c;按部就班拿到高薪的人都有什么特点&#xff1f; 今天的主人公Flee告诉我&#xff0c;是稳。 在她的故事里&#xff0c;我看到一个“别人家的姑娘”&#xff0c;是怎样在职场上稳步晋升&#xff0c;大学毕业仅2年&#xff0c;就拿到18.6K月薪&a…...

【shell脚本】全自动完成pxe无人值守批量装机脚本,匹配centos系列

本脚本采用的是搭建ftp服务器、tftp服务器、dhcp服务器来完成文件的传输 ks应答文件为最小化安装&#xff0c;免去图形化&#xff0c;可以实现一键装机~~ #!/bin/bash yum -y install tftp-server dhcp vsftpd syslinux &> /dev/null ###脚本说明&#xff1a;需要输入…...

利用Python进行数据分析【送书第六期:文末送书】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…...

【直播课】11月26日学习PostgreSQL-PGCE认证的朋友们准备好,直播课来了

PG培训认证优势 由工信部中国开源软件联盟PostgreSQL分会&#xff08;简称中国PG分会&#xff09;联合权威认证机构中国电子工业标准化技术协会&#xff0c;是目前国内唯一权威的PG技术等级认证&#xff0c;填补了国内PG技术领域的空白。 PG培训认证等级 PG初级-PGCA PG应用管…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...