当前位置: 首页 > 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应用管…...

告别BDC!手把手教你用ABAP函数WS_DELIVERY_UPDATE实现VL02N交货过账(附完整代码与调试技巧)

从BDC到标准函数&#xff1a;实战解析WS_DELIVERY_UPDATE在交货单过账中的高效应用 在SAP系统开发中&#xff0c;交货单过账&#xff08;VL02N&#xff09;是物流模块的核心操作之一。传统BDC录屏方式虽然直观&#xff0c;但面对复杂业务场景时往往显得笨拙且难以维护。本文将深…...

SQLCoder终极指南:如何用15行代码让AI帮你写SQL查询

SQLCoder终极指南&#xff1a;如何用15行代码让AI帮你写SQL查询 【免费下载链接】sqlcoder 项目地址: https://ai.gitcode.com/hf_mirrors/defog/sqlcoder 想象一下这个场景&#xff1a;你正盯着复杂的数据库表结构&#xff0c;脑子里有个业务问题&#xff0c;却不知道…...

NetHack扩展命令详解:name到teleport的高级功能

NetHack扩展命令详解&#xff1a;#name到#teleport的高级功能 【免费下载链接】NetHack Official NetHack Git Repository 项目地址: https://gitcode.com/GitHub_Trending/ne/NetHack NetHack是一款经典的roguelike游戏&#xff0c;以其丰富的游戏机制和复杂的命令系统…...

28_《智能体微服务架构企业级实战教程》Redis FastMCP服务之操作工具封装

前言 配套视频教程: 👉《智能体微服务架构企业级实战教程》共72节 更多文章专栏内容: 👉《智能体微服务架构企业级实战教程》专栏 本文为Redis FastMCP服务实现了旅行计划的存储工具。在tools/storage.py中定义了三个异步函数:storage_save_travel_plan通过redis_cli…...

3步构建Windows任务栏美学:CenterTaskbar的终极桌面优化指南

3步构建Windows任务栏美学&#xff1a;CenterTaskbar的终极桌面优化指南 【免费下载链接】CenterTaskbar Center Windows Taskbar Icons 项目地址: https://gitcode.com/gh_mirrors/ce/CenterTaskbar 面对Windows系统原生任务栏图标左对齐带来的视觉失衡问题&#xff0c…...

从实验室小白到看懂PET报告:给临床医生和影像科新人的非物理向科普指南

从实验室小白到看懂PET报告&#xff1a;给临床医生和影像科新人的非物理向科普指南 第一次拿到PET报告时&#xff0c;肿瘤科的李医生盯着那个"SUVmax12.3"的数值皱起了眉头——这个数字意味着什么&#xff1f;比上周高了0.5是进展还是误差&#xff1f;左下肺那个&quo…...

集群吞吐下降47%?Docker 27默认调度器已悄然启用Weighted Least Loaded算法——你还没更新权重配置吗?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Docker 27集群调度算法升级教程 Docker 27 引入了全新的可插拔调度器框架&#xff08;Scheduler Plugin Framework&#xff09;&#xff0c;支持在运行时动态替换默认的 spread 算法为更智能的 binpack…...

UltraImage:扩散Transformer的高分辨率图像生成技术

1. 项目背景与核心价值最近在CVPR 2024上看到一篇关于图像生成领域突破性进展的论文&#xff0c;介绍了一种名为UltraImage的新型分辨率外推技术。这项技术基于扩散Transformer架构&#xff0c;能够显著提升生成图像的分辨率上限。传统扩散模型在生成高分辨率图像时往往面临显存…...

2026届学术党必备的六大AI辅助写作助手解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要降低由AI生成的内容所呈现出的机械痕迹&#xff0c;就得从三个方面来对指令进行优化。其一…...

大语言模型在三维空间认知中的突破与应用

1. 项目概述&#xff1a;当大语言模型遇上三维世界去年在调试一个家居布局优化项目时&#xff0c;我发现现有的大语言模型&#xff08;LLM&#xff09;在理解三维空间关系时总会出现令人啼笑皆非的错误——比如建议把沙发悬空挂在电视墙上&#xff0c;或是认为床头柜应该塞进冰…...