javascript - 如何使用 JavaScript 将完整的 HTML 字符串作为变量读取和更新
问题描述
我有一个 JSON 对象,它包含作为字符串的 HTML 以及带有 ID 和要更新的值的元素数组。(i.e ID= Source, Value= Destination)
var myDynamicJSON = {
"Variables": [{
"Source": "txtCustomerName",
"Destination": "Chintan Khetiya"
},
{
"Source": "txtInvoiceDate",
"Destination": "6/21/2021, 3:29:01 PM"
}
],
"invoiceEmail": "<!doctype html><html> <head> <meta name="viewport" content="width=device-width" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Email</title> <style> .emailBody { width: 100%; } .messageBodyUserNameFont { margin: 0; font-size: 18px; color: rgb(255, 140, 0); padding: 10px 0 10px 0; display: inline; } .messageBodyTextFont { margin: 0; font-size: 14px; color: rgb(50, 50, 50); line-height: 1.5; display: inline; } </style> </head> <body class="emailBody"> <p id="txtCustomerName" class="messageBodyUserNameFont">,</p> <p id="txtInvoiceDate" class="messageBodyTextFont"></p> </body></html>"
}
我创建了一个函数来读取myDynamicJSON
执行循环的变量,以通过源和目标 JSON 对象查找和更新元素值。
for (var i in myDynamicJSON.Variables.length) {
var item = myDynamicJSON.Variables.[i];
document.getElementById(item.Source).innerHTML = item.Destination;
}
现在,如何将 JSON 的相同字符串对象更新为完整的 HTML。
我试过了
myDynamicJSON.Variables = myDynamicJSON.Variables.getElementById(item.Source).innerHTML = item.Destination;
(在循环内)但它没有给我更新的 HTML 变量
我的预期输出:(用数组值更新了 JSON 字符串)
"invoiceEmail": "<!doctype html><html> <head> <meta name="viewport" content="width=device-width" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Email</title> <style> .emailBody { width: 100%; } .messageBodyUserNameFont { margin: 0; font-size: 18px; color: rgb(255, 140, 0); padding: 10px 0 10px 0; display: inline; } .messageBodyTextFont { margin: 0; font-size: 14px; color: rgb(50, 50, 50); line-height: 1.5; display: inline; } </style> </head> <body class="emailBody"> <p id="txtCustomerName" class="messageBodyUserNameFont">**Chintan Khetiya**</p> <p id="txtInvoiceDate" class="messageBodyTextFont">**6/21/2021, 3:29:01 PM**</p> </body></html>"
谢谢你的时间!
解决方案
注意你有太多的 /body /html 标签
注意:我将其更改<body class="emailBody">
为<div class="emailBody">
我们可以按照@VLAZ 的建议使用 DOMParser
var myDynamicJSON = {
"Variables": [{
"Source": "txtCustomerName",
"Destination": "Chintan Khetiya"
},
{
"Source": "txtInvoiceDate",
"Destination": "6/21/2021, 3:29:01 PM"
}
],
"invoiceEmail": "<!doctype html><html> <head> <meta name=\"viewport\" content=\"width=device-width\" /> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /> <title>Email</title> <style> .emailBody { width: 100%; } .messageBodyUserNameFont { margin: 0; font-size: 18px; color: rgb(255, 140, 0); padding: 10px 0 10px 0; display: inline; } .messageBodyTextFont { margin: 0; font-size: 14px; color: rgb(50, 50, 50); line-height: 1.5; display: inline; } </style> </head> <body class=\"emailBody\"> <p id=\"txtCustomerName\" class=\"messageBodyUserNameFont\">,</p> <p id=\"txtInvoiceDate\" class=\"messageBodyTextFont\"></p> </body></html>"
}
const doc = new DOMParser().parseFromString(myDynamicJSON.invoiceEmail, "text/html")
myDynamicJSON.Variables.forEach(vari => doc.querySelector("#"+vari.Source).textContent = vari.Destination)
console.log(doc.documentElement )
或 @Teemu 建议的DOMImplementation
var myDynamicJSON = {
"Variables": [{
"Source": "txtCustomerName",
"Destination": "Chintan Khetiya"
},
{
"Source": "txtInvoiceDate",
"Destination": "6/21/2021, 3:29:01 PM"
}
],
"invoiceEmail": "<!doctype html><html> <head> <meta name=\"viewport\" content=\"width=device-width\" /> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /> <title>Email</title> <style> .emailBody { width: 100%; } .messageBodyUserNameFont { margin: 0; font-size: 18px; color: rgb(255, 140, 0); padding: 10px 0 10px 0; display: inline; } .messageBodyTextFont { margin: 0; font-size: 14px; color: rgb(50, 50, 50); line-height: 1.5; display: inline; } </style> </head> <body><div class=\"emailBody\"> <p id=\"txtCustomerName\" class=\"messageBodyUserNameFont\">,</p> <p id=\"txtInvoiceDate\" class=\"messageBodyTextFont\"></p></div> </body></html></body></html>"
}
let HTML = myDynamicJSON.invoiceEmail;
let doc = document.implementation.createHTMLDocument("Email");
let head = doc.querySelector("head");
head.innerHTML = HTML.match(/<head>(.*?)<\/head>/)[1]
let body = doc.querySelector("body");
body.innerHTML = HTML.match(/<body>(.*?)<\/body>/)[1]
myDynamicJSON.Variables.forEach(vari => body.querySelector("#"+vari.Source).textContent = vari.Destination)
console.log(doc.documentElement)
推荐阅读
- php - 如果直接“新”使代码耦合,那么当我使用工厂时它也适用吗?
- dynamics-crm - 无法在 CRM 插件中加载文件或程序集“Microsoft.IdentityModel.Clients.ActiveDirectory”
- jestjs - 如何在 React Admin 控制器中对权限进行单元测试?
- decentralized-applications - 去中心化应用程序是否在我的设备上存储了完整的底层区块链?
- input - Verilog:从模块本身内部分配给模块输入可以吗?
- angular - 如何检测波纹何时在 Angular 4+ 中完成动画?
- reactjs - React/Redux 无法更新初始状态/未定义问题
- c# - 实体框架 - 仅将数组属性的特定数组元素包含到 HTTP 响应中
- python - Jupyter Ipywidgets - 如何在重新打印输出之前清除单元格输出
- python - Pandas:计算两个数据帧之间的总百分比差异