如何从 JavaScript 读取脚本标签中的 JSON?

IT技术 javascript json
2021-03-21 18:57:56

我有一个动态生成的页面,我想在其中使用静态 JavaScript 并将 JSON 字符串作为参数传递给它。我已经看到 Google 使用的这种方法(请参阅Google 的 +1 按钮:他们是如何做到的?)。

但是我应该如何从 JavaScript 中读取 JSON 字符串?

<html>
  <head>
    <script src="jquery-1.6.2.min.js"></script>
    <script src="myscript.js">{"org": 10, "items":["one","two"]}</script>
  </head>
  <body>
    Hello
  </body>
</html>

在这个 JavaScript 中,我想使用{"org": 10, "items":["one","two"]}HTML 文档中的 JSON 参数我不知道最好用 jQuery 还是不用 jQuery。

$(function() {
    // read JSON

    alert("the json is:")
})
4个回答

我会将脚本声明更改为:

<script id="data" type="application/json">{"org": 10, "items":["one","two"]}</script>

注意类型和 ID 字段。在那之后

var data = JSON.parse(document.getElementById('data').textContent);

在所有浏览器中都能正常工作。

type="application/json"需要,以防止浏览器解析它,而加载。

而我们之所以使用textContent代替innerHTMLinnerText读取原始 Json 文本是因为innerHTML尝试将内容解析为 HTML 这将导致性能变慢和可能的解析错误和 XSS 攻击,并且innerText不会抓取原始文本而是查看对于人类可见的文本,而textContent按原样抓取纯文本(这是您想要的)。请参阅https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent了解更多关于为什么innerHTMLinnerText不好的细节

我喜欢 jquery 的用法。我的意思是,通过使用 vanilla javascript(在这种情况下),您将减少多少毫秒?
2021-04-21 18:57:56
好吧,我希望脚本标记指向 JavaScript,所以它不仅适用于 JSON。JSON 只是脚本的一个参数。
2021-05-07 18:57:56
@WoIIe 因为 jQuery 已被 TS 使用,请检查<script src="jquery-1.6.2.min.js"></script>那里。
2021-05-15 18:57:56
注意这不安全,它允许XSS,codepen.io/anon/pen/xevgEM
2021-05-15 18:57:56
根据 HTML5 规范:dev.w3.org/html5/markup/script.html<script>,已定义 SRC元素不得包含除新行和/或注释之外的任何内容。请参阅上面链接中的“具有 src 属性的脚本元素必须只包含:”。否则 HTML 验证器会抱怨。
2021-05-20 18:57:56

我最终将这段 JavaScript 代码独立于 jQuery。

var jsonElement = document.getElementById('json-script-tag');
var myObject = JSON.parse(jsonElement.textContent);
为什么不给脚本一个 ID 并用 抓取它document.getElementById呢?这样,您就不必记得将其保存到最后。将来任何其他人也不会更改页面。
2021-04-23 18:57:56
此答案的原始版本受到问题中的链接的启发,stackoverflow.com/ questions/ 6713197/...
2021-05-12 18:57:56

读取正在<script id="myJSON">使用的JSON

var manifest= document.getElementById('myJSON').innerHTML; //sets manifest to the text in #myJSON
manifest= JSON.parse(manifest) //Converts text into JSON

您还可以使用方法来指向脚本,如 document.scripts[0]

    //var manifest= JSON.parse(document.getElementById('myJSON').innerHTML); /*Shortend of 2&3*/
var manifest= document.getElementById('myJSON').innerHTML; //Gets text in #myJSON
manifest= JSON.parse(manifest) //Converts it into JSON
document.getElementById('test').innerHTML= manifest.name+ '<br/>'+ manifest.otherOptions; //Displays it
console.log('manifest')
console.log(manifest);
<head>
<script type="application/json" id="myJSON">
  {"name":"Web Starter Kit", "otherOptions":"directly here"}
</script>
</head>
<body>
<p id="test"></p>
</body>

<script id="myJSON">标签也需要type="application/json"属性。
2021-05-08 18:57:56
JSON.parse($('script[src="mysript.js"]').html());

或者发明一些其他方法来识别脚本。

也许而不是.html()你可能需要.text(). 不确定。两个都试试。

这种方法是错误的。如果一个<script>标签有,src那么它绝对不能有任何内容。
2021-05-13 18:57:56
谢谢,当我将 json 更改为 {"org": 10, "items":["one","two"]}
2021-05-20 18:57:56