在运行时加载JSON文件

Gsquare

我有带脚本的HTML文件

<script src="tralBA.json" type="text/javascript"></script>

其中tralBA.json:

var datiTral = {  
    "tral": 
    [
        {"trl_id": "BA_01", "longitude": 16.58, "latitude": 41.09},
        {"trl_id": "BA_02", "longitude": 16.578, "latitude": 41.112}, 
        {"trl_id": "BA_03", "longitude": 16.544, "latitude": 41.09}, 
        {"trl_id": "BA_04", "longitude": 16.556, "latitude": 41.08},        
        {"trl_id": "BA_05", "longitude": 16.580, "latitude": 41.085},       
        {"trl_id": "BA_06", "longitude": 16.590, "latitude": 41.096}
]}

和一个JS文件:

.......
var clusterTral = {};
clusterTral.tral = null;
clusterTral.tral = datiTral.tral; 

我已经正确地够了clusterTral.tral。

稍后,我需要在运行时定义和使用我的tralBA.json文件。我尝试通过以下功能来做到这一点

函数showClusterTral(pv){

var filename = "tral" + pv + ".json";
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', filename);
document.head.appendChild(script);  
clusterTral.tral = datiTral.tral;
.....

}

但出现错误“未捕获的ReferenceError:未定义datiTral”如何解决?谢谢你。

战胜袋熊

出现此问题的原因是,当执行引用该值的代码时,script标记仍在加载。可以通过在调用脚本文件后立即引用已加载变量的值来证明,然后一秒钟后再引用一次(您可能需要在配置中更改超时值)。立即测试日志“ [undefined]”,而延迟日志显示tral对象的值。

function showClusterTral(pv) {

var filename = "tral" + pv + ".json";
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', filename);
document.head.appendChild(script);  
var clusterTral = {};
try {
    clusterTral.tral = datiTral.tral;
    console.log('Immeditate tral=' + JSON.stringify(clusterTral.tral))
    }
catch (err) {
    console.log('Immeditate tral=[not defined]')
    }
setTimeout(function(){
    clusterTral.tral = datiTral.tral;
    console.log('Delayed tral=' + JSON.stringify(clusterTral.tral))
    }, 1000)
}

showClusterTral("BA")  // kick off the function

换句话说,我们请求的脚本获取是异步的-JS从下一行继续进行,而无需等待脚本到达。答案将是某种类型的ajax请求。

注意:以这种方式加载脚本称为脚本注入,在“ JSONP”标语下进行了很多讨论,该标语用于克服同源策略。尽管可以“完成这种样式跨域脚本注入,但您应该考虑一些黑帽修改预期的无辜源脚本带来的风险。基本上不要注入您无法控制的脚本。

因此,对于解决方案-快速阅读有关该主题Dave Walsh Blog即可得出以下答案。请注意,此必需的JQuery-您未指定它必须是纯JS解决方案,因此希望这对您来说是可行的:

function showClusterTral(pv) {

var clusterTral = {};

jQuery.getScript("tral" + pv + ".json")
    .done(function() {
        /* yay, all good, do something */
        clusterTral.tral = datiTral.tral;
        console.log('Delayed tral=' + JSON.stringify(clusterTral.tral))     
    })
    .fail(function() {
        /* boo, fall back to something else */
        console.log("Some error in the path maybe ?")   
});

}

showClusterTral("BA") // kick off the function

此处的区别在于,传递变量的使用现在取决于函数触发done派生getScript(),这意味着在将文件加载到浏览器JS上下文中之前,我们不会从加载的脚本中引用变量。还有一个fail处理程序,我们可以用来优雅地处理任何意外的问题,这些问题意味着脚本不会加载。

我不能将其添加为片段,因为它引用的是外部文件,但是如果您将上述内容放在网页中,tralBA.json然后按照OP的定义保存文件,则一切正常。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章