虽然目前无法使用script
标签,但iframe
如果它来自同一个域,则可以。
<iframe
id="mySpecialId"
src="/my/link/to/some.json"
onload="(()=>{if(!window.jsonData){window.jsonData={}}try{window.jsonData[this.id]=JSON.parse(this.contentWindow.document.body.textContent.trim())}catch(e){console.warn(e)}this.remove();})();"
onerror="((err)=>console.warn(err))();"
style="display: none;"
></iframe>
要使用上述内容,只需将id
andsrc
属性替换为您需要的属性。(id
我们假设在这种情况下等于mySpecialId
)将用于将数据存储在window.jsonData["mySpecialId"]
.
换句话说,对于每个具有id
和使用onload
脚本的 iframe,都会将该数据同步加载到指定的window.jsonData
对象id
中。
我这样做是为了好玩,并表明它是“可能的”,但我不建议使用它。
这是一个使用回调的替代方法。
<script>
function someCallback(data){
/** do something with data */
console.log(data);
}
function jsonOnLoad(callback){
const raw = this.contentWindow.document.body.textContent.trim();
try {
const data = JSON.parse(raw);
/** do something with data */
callback(data);
}catch(e){
console.warn(e.message);
}
this.remove();
}
</script>
<!-- I frame with src pointing to json file on server, onload we apply "this" to have the iframe context, display none as we don't want to show the iframe -->
<iframe src="your/link/to/some.json" onload="jsonOnLoad.apply(this, someCallback)" style="display: none;"></iframe>
在 chrome 中测试,应该在 Firefox 中工作。不确定 IE 或 Safari。