是否可以使用函数从脚本访问值?

Is it possible to access a value from a script with a function?

我需要保存来自此脚本的电子邮件:

<script>
  window.renderOptIn = function() {
    window.gapi.load('surveyoptin', function() {
      window.gapi.surveyoptin.render(
        {
          "merchant_id": 0000,
          "order_id": "100101205",
          "email": "tester@example.com",
          "delivery_country": "XX",
          "estimated_delivery_date": "2021-09-03"
        });
    });
  }
</script>

有办法吗?它实际上在代码中,但我想不出获取它的方法。

上下文:

电子商务相关。该脚本位于“谢谢”页面上。我需要将电子邮件保存到一个变量中,以便我可以将其用于 google 的增强型转化跟踪。

因此您可以使用 querySelector 访问脚本标签。如果您可以将 id 附加到 script 标签,这样您就可以轻松获取它,那将是理想的。如果没有,也有解决方法。

您可以使用element.innerHTML访问脚本标签的内容。 然后,您必须应用正则表达式或字符串操作来获取您正在寻找的确切片段。 例如

const script = document.querySelector("#script_id")
const scriptText = script.innerText
const emailString = scriptText.match(/"email":.*,/)[0]
const email = emailString.split(":")[1].trim().replace(/[,(\")]/g,"")

这行得通。您可能需要稍微修改解析函数。但我希望方法是明确的

P.S。这是一种非常 hacky 的方式,应尽可能避免使用此类代码。但是如果非要这么做,我也想不出别的办法了。

访问 document.scripts 并过滤内容

正则表达式或拆分。

const code = [...document.scripts].filter(script => script.textContent.includes('surveyoptin'))
const match = code[0].textContent.match(/(?:render\(.*\s+)({.*\s+)+/s)
const str = match[1].split(");")[0]; // forgot how to ignore trailing stuff after the group: );
console.log(str)
const obj = JSON.parse(str); // fails on 0000
console.log(obj.email)

// alternative - this is inflexible on spacing etc:

console.log(
  code[0]
  .textContent
  .split('"email": "')[1]
  .split('"')[0]
)
<script src="x.js"></script>
<script>const survey = "Survey"; // dummy script</script>
<script>
  window.renderOptIn = function() {
    window.gapi.load('surveyoptin', function() {
      window.gapi.surveyoptin.render(
        {
          "merchant_id": "0000",
          "order_id": "100101205",
          "email": "tester@example.com",
          "delivery_country": "XX",
          "estimated_delivery_date": "2021-09-03"
        });
    });
  }
</script>