0

我试图加载一个外部 js (json) 文件(PhoneGap 应用程序),其结构类似于

   var localString ={
  "tag1": "Username",
  "tag2": "Password",
  "submit": "Submit"
   }

并使用下面的代码在运行时加载它,newlocale 变量保存要加载的文件的名称,例如:如果语言环境是英语-美国,则 var resourcePath = en-US.js。问题是我第一次运行此代码时收到此错误“ReferenceError: localstring is not defined”,但它会在我第二次加载外部字符串时加载它。在这两者之间,我使用 html5 中的“select”标签调用外部文件。有人可以提供一些关于我哪里出错的见解或解决这个问题的任何指示。

var newlocale = window.DeviceCulture.get();
local(newlocale);

function local(lang) {
try {
    var resourcePath = lang + '.js';
    var scriptEl = document.createElement('script');
    scriptEl.type = 'text/javascript';
    scriptEl.src = resourcePath;
    alert(resourcePath);
    document.getElementsByTagName("head")[0].appendChild(scriptEl);
    //$('head').append(scriptEl);

    //var localString = window.localString;
    document.getElementById("07").value = localString['submit'];
 } catch (e) {
    errorEvent(e);
}
}
4

1 回答 1

0

好的,我相信您的问题的根本原因是您在页面加载后将 .js 文件的标记附加到头部。当您第一次加载页面时,脚本标签会按顺序下载和解释,因此 b 可以依赖于 a。但是,您执行此操作的方式是非阻塞的,因此当您到达代码中尝试访问“localString”的下一行时,您加载的脚本并未完全加载。

为了解决这个问题,我会稍微重构你的代码。首先忘记制作本地文件 JavaScript。只需将它们设为纯文本 .json 文件即可。例如:

{
    "tag1": "Username",
    "tag2": "Password",
    "submit": "Submit"
}

然后我会使用 XHR 而不是脚本标签插入来加载该文件。就像是:

var newlocale = window.DeviceCulture.get();
var localString;
local(newlocale);

function local(lang) {
    try {
        var resourcePath = lang + '.json';
        var request = new XMLHttpRequest();
        request.open("GET", resourcePath, true);
        request.onreadystatechange = function(){
            if (request.readyState == 4) {
                if (request.status == 200 || request.status == 0) {
                    localString = JSON.parse(request.responseText);
                    // at this point localString is loaded with the new language
                    document.getElementById("07").value = localString['submit'];
                }
            }
        }
        request.send();
     } catch (e) {
        errorEvent(e);
    }
}

这应该会处理好事情。

于 2012-11-01T21:44:39.353 回答