如何捕获隐藏为特定元素的 textContent 的 object/array 中的数据?
How do I capture the data within an object/array that is hidden as a textContent of a specific element?
<div id="ProductModal_10207555">
<span class="ari-form">
<span class="datasource hidden">
"{
"itemid": "REF12345",
"locationid": "54321",
"leadValue": 15149,
"productSku": "SKU12345",
"itemYear": "2019",
"itemMake": "Adidas",
"itemModel": "Ultraboost",
"itemPrice": "9.00",
}"
</span>
</span>
</div>
这是表单中的隐藏对象,我想提取其中的数据。当我尝试进行 DOM 抓取时,我得到了一个字符串值,它只显示了我在该特定对象中看到的所有文本。
"{"itemid": "REF12345","locationid": "54321","leadValue":
15149,"productSku": "SKU12345","itemYear": "2019","itemMake":
"Adidas","itemModel": "Ultraboost","itemPrice": "9.00",}"
我希望从中捕获“ itemYear ”、“ itemMake ”和“ itemModel ”,并希望将整个字符串发送到 Google 标签管理器的数据层,我可以在其中捕获每个这些变量及其值分别在 Google 跟踪代码管理器中。有没有办法通过本机 javascript 执行此操作,因为这是 GTM 支持的语言?
站点内还有其他 span class="datasource hidden" 所以我特意将父元素放在那里,因为这是我们识别元素的方式.
对不起,如果这可能是一个快速的。我还在学习。谢谢。
它的格式是 JSON 除了 开头和结尾的 "
以及 ,
之前 }
,所以一旦得到元素的textContent
,就可以切出"
s,最后一个逗号,然后解析:
const { textContent } = document.querySelector('#ProductModal_10207555 .datasource.hidden');
const json = textContent.match(/{[\s\S]+(?=,)/)[0] + '}';
const obj = JSON.parse(json);
console.log(
obj.itemYear,
obj.itemMake,
obj.itemModel
);
<div id="ProductModal_10207555">
<span class="ari-form">
<span class="datasource hidden">
"{
"itemid": "REF12345",
"locationid": "54321",
"leadValue": 15149,
"productSku": "SKU12345",
"itemYear": "2019",
"itemMake": "Adidas",
"itemModel": "Ultraboost",
"itemPrice": "9.00",
}"
</span>
</span>
</div>
{.+(?=,)
表示:匹配一个{
,然后匹配尽可能多的字符,直到走到最后一个,
.
这是一种非常奇怪的数据存储方式。普通 JSON 会更有意义。
或者,对于 ES5 中的等价物:
var textContent = document.querySelector('#ProductModal_10207555 .datasource.hidden').textContent;
var json = textContent.match(/{[\s\S]+(?=,)/)[0] + '}';
var obj = JSON.parse(json);
console.log(
obj.itemYear,
obj.itemMake,
obj.itemModel
);
<div id="ProductModal_10207555">
<span class="ari-form">
<span class="datasource hidden">
"{
"itemid": "REF12345",
"locationid": "54321",
"leadValue": 15149,
"productSku": "SKU12345",
"itemYear": "2019",
"itemMake": "Adidas",
"itemModel": "Ultraboost",
"itemPrice": "9.00",
}"
</span>
</span>
</div>
<div id="ProductModal_10207555">
<span class="ari-form">
<span class="datasource hidden">
"{
"itemid": "REF12345",
"locationid": "54321",
"leadValue": 15149,
"productSku": "SKU12345",
"itemYear": "2019",
"itemMake": "Adidas",
"itemModel": "Ultraboost",
"itemPrice": "9.00",
}"
</span>
</span>
</div>
这是表单中的隐藏对象,我想提取其中的数据。当我尝试进行 DOM 抓取时,我得到了一个字符串值,它只显示了我在该特定对象中看到的所有文本。
"{"itemid": "REF12345","locationid": "54321","leadValue": 15149,"productSku": "SKU12345","itemYear": "2019","itemMake": "Adidas","itemModel": "Ultraboost","itemPrice": "9.00",}"
我希望从中捕获“ itemYear ”、“ itemMake ”和“ itemModel ”,并希望将整个字符串发送到 Google 标签管理器的数据层,我可以在其中捕获每个这些变量及其值分别在 Google 跟踪代码管理器中。有没有办法通过本机 javascript 执行此操作,因为这是 GTM 支持的语言?
站点内还有其他 span class="datasource hidden" 所以我特意将父元素放在那里,因为这是我们识别元素的方式.
对不起,如果这可能是一个快速的。我还在学习。谢谢。
它的格式是 JSON 除了 开头和结尾的 "
以及 ,
之前 }
,所以一旦得到元素的textContent
,就可以切出"
s,最后一个逗号,然后解析:
const { textContent } = document.querySelector('#ProductModal_10207555 .datasource.hidden');
const json = textContent.match(/{[\s\S]+(?=,)/)[0] + '}';
const obj = JSON.parse(json);
console.log(
obj.itemYear,
obj.itemMake,
obj.itemModel
);
<div id="ProductModal_10207555">
<span class="ari-form">
<span class="datasource hidden">
"{
"itemid": "REF12345",
"locationid": "54321",
"leadValue": 15149,
"productSku": "SKU12345",
"itemYear": "2019",
"itemMake": "Adidas",
"itemModel": "Ultraboost",
"itemPrice": "9.00",
}"
</span>
</span>
</div>
{.+(?=,)
表示:匹配一个{
,然后匹配尽可能多的字符,直到走到最后一个,
.
这是一种非常奇怪的数据存储方式。普通 JSON 会更有意义。
或者,对于 ES5 中的等价物:
var textContent = document.querySelector('#ProductModal_10207555 .datasource.hidden').textContent;
var json = textContent.match(/{[\s\S]+(?=,)/)[0] + '}';
var obj = JSON.parse(json);
console.log(
obj.itemYear,
obj.itemMake,
obj.itemModel
);
<div id="ProductModal_10207555">
<span class="ari-form">
<span class="datasource hidden">
"{
"itemid": "REF12345",
"locationid": "54321",
"leadValue": 15149,
"productSku": "SKU12345",
"itemYear": "2019",
"itemMake": "Adidas",
"itemModel": "Ultraboost",
"itemPrice": "9.00",
}"
</span>
</span>
</div>