0

構造が次のような外部js(json)ファイル(PhoneGapアプリ)を読み込もうとしています

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

以下のコードを使用して実行時にロードすると、 newlocale 変数はロードされるファイルの名前を保持します。たとえば、ロケールがenglish-USAの場合、var resourcePath = en-US.js. 問題は、このコードを初めて実行したときに「ReferenceError: localstring is not defined」というエラーが表示されることですが、2 回目にロードすると外部文字列がロードされます。その間に、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 に答える