虽然目前无法使用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){
console.log(data);
}
function jsonOnLoad(callback){
const raw = this.contentWindow.document.body.textContent.trim();
try {
const data = JSON.parse(raw);
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>
经过镀铬测试,可在Firefox中使用。不确定IE或Safari。