我需要将inlineScriptsTexts
转换为对象,因为我需要从中获取值。但是我不知道如何将这个字符串解析为对象。 [JSON.parse][1]
无法正常工作。有什么解决方案可以将该字符串转换为对象(如在图像上)?
window.onload = function() {
let objExist = false;
let inlineScripts = document.body;
let inlineScriptsBlocks = Array.from(inlineScripts.getElementsByTagName('script'));
inlineScriptsBlocks.forEach(scriptBlock => {
let inlineScriptsTexts = scriptBlock.innerText;
if (inlineScriptsTexts.includes('zvkDL')) {
objExist = true;
console.log(inlineScriptsTexts);
}
});
//console.log(objExist);
}
zvkDL = {
'language' : 'cs',
'currency' : 'czk',
'event': 'akurva',
'ecommerce': {
'purchase': {
'actionField': {
'id': 555,
'revenue': 535535,
'shipping': 3535,
}
}
},
'eventCallback': function() {
setGTMcookie( 555 ); // Jak se bude callback jmenovat nechám na vás. Jen to musí být srozumitelné. Pozor na scope JS callbacku.
},
'eventTimeout' : 2000,
'eventCookie': { 'name': 'dasd', 'expires': 'asdsadd', 'value': 'funguje to', }
};
答案 0 :(得分:0)
JavaScript提供的方法是eval
-用于执行包含JavaScript源代码的字符串。
在这种情况下,由于JSON不支持序列化功能对象,因此无法使用用于使用“ JavaScript对象表示法”中的文本序列化一组受限数据对象的JSON字符串。
eval
有两种主要选择:
Function
构造函数将文本转换为函数,或者<script>
标签将文本写入服务器上的文件并将其下载到浏览器。调用eval
或Function
执行代码的信誉很差,并且在某些代码环境中可能会受到限制。
在采用上述任何一种方法之前,我都将精确地分析问题:字符串从何而来,通过首先创建脚本来更好地在源代码链中进一步解决问题,将克隆现有的源代码,会更好对象而无需序列化它首先是可能的,等等。
如果适用,还请注意:HTMLScriptElement的textContent
仅在元素包含内联代码时才能用于访问代码。 textContent
将不会返回下载的脚本文件的代码内容。
答案 1 :(得分:0)
所以我试图帮助
if (inlineScriptsTexts.includes('zvkDL '+'=')) {
const str = inlineScriptsTexts.trim()
.replace('zvkDL '+'=',"")
.replace(/'/g,'"')
.replace(/\/\/.*?\n/g,"")
.replace(/\};/g,"}")
console.log(str)
console.log(JSON.parse(str));
}
但是该功能是一个大问题
// the reason it won't work:
// this is as good as a representation of the object as can be made
const obj = {
"language": "cs",
"currency": "czk",
"event": "akurva",
"ecommerce": {
"purchase": {
"actionField": {
"id": 555,
"revenue": 535535,
"shipping": 3535,
}
}
},
"eventCallback": function() { setGTMcookie(555); }, // this will NOT be seen by JSON
"eventTimeout": 2000,
"eventCookie": {
"name": "dasd",
"expires": "asdsadd",
"value": "funguje to",
}
}
console.log(JSON.stringify(obj))
/*
window.onload = function() {
let objExist = false;
let inlineScripts = document.body;
let inlineScriptsBlocks = Array.from(inlineScripts.getElementsByTagName('script'));
inlineScriptsBlocks.forEach(scriptBlock => {
let inlineScriptsTexts = scriptBlock.innerText;
if (inlineScriptsTexts.includes('zvkDL '+'=')) {
const str = inlineScriptsTexts.trim().replace('zvkDL '+'=',"").replace(/'/g,'"').replace(/\/\/.*?\n/g,"").replace(/\};/g,"}")
console.log(str)
console.log(JSON.parse(str));
}
});
}*/
<script>
zvkDL = {
'language': 'cs',
'currency': 'czk',
'event': 'akurva',
'ecommerce': {
'purchase': {
'actionField': {
'id': 555,
'revenue': 535535,
'shipping': 3535,
}
}
},
'eventCallback': function() {
setGTMcookie(555); // Jak se bude callback jmenovat nechám na vás. Jen to musí být srozumitelné. Pozor na scope JS callbacku.
},
'eventTimeout': 2000,
'eventCookie': {
'name': 'dasd',
'expires': 'asdsadd',
'value': 'funguje to',
}
};
</script>