替换JS语言文件会加载旧值

Replacing JS language file loads old values

本文关键字:加载 文件 JS 语言 替换      更新时间:2023-09-26

我在应用程序中实现了一个简单的本地化切换。我通过从组合(或其他)中选择laguage,然后将JS语言文件与另一个切换来实现这一点。

function setLang(lang) {
    setCookie('vegindex_lang', lang, 365);
    // Find language 'script' element and replace according to lang
    var elements = document.getElementsByTagName('script');
    for (var i = 0; i < elements.length; i++) {
        if (elements[i].id && elements[i].id == 'lang') {
            var src = 'JavaScript/Localisation/strings_' + lang + '.js';
            document.head.replaceChild(newElement(src), elements[i]);
            loadStrings();
            break;
        }
    }
}
function newElement(src) {
    var s = document.createElement("script");
    s.type = "text/javascript";
    s.src = src;
    s.id = 'lang';
    return s;
}
function loadStrings() {
    // Wizard wrapper window
    wizardWrapper.setTitle(wizard_title);
    // Wizard panel
    wizardButtonDisclaimer.setText(wizard_button_disclaimer);
    wizardButtonBack.setText(wizard_button_back);
    wizardButtonNext.setText(wizard_button_next);
    // Reload wizard
    wizardWrapper.doLayout();
}

语言文件的典型内容:

var wizard_title = 'This is english';
var wizard_button_disclaimer = 'Disclaimer';
var wizard_button_back = 'Back';
var wizard_button_next = 'Next';

它工作正常,但总是加载前一种语言。那就是:

  • 第一次语言切换-什么都没发生
  • 第二次语言切换-语言切换到我第一次选择的语言

看起来新注入的脚本文件在添加后就不可用了。有人知道为什么会发生这种事吗?

这可能是因为您注入了脚本标记,然后立即调用loadStrings()。不过,语言文件可能仍在(向下)加载。

这被称为竞赛条件。这种情况的发生取决于你的互联网速度和其他一些依赖性,你应该尽量避免这种情况。

例如,您可以通过使用像labJS这样的脚本加载程序来避免这种情况(http://labjs.com/),需要JS(http://requirejs.org/),或任何其他。这将允许您加载脚本并等待它,然后当它成功加载时,执行loadStrings()-方法。

我只是想发布更正后的setLang函数,其中包括一个使用RequireJS:的实现

function setLang(lang) {
    setCookie('vegindex_lang', lang, 365);
    // Find language 'script' element and replace according to lang
    var elements = document.getElementsByTagName('script');
    if (lang != langfile) {
        for (var i = 0; i < elements.length; i++) {
            if (elements[i].id && elements[i].id == 'lang') {
                var src = 'JavaScript/Localisation/strings_' + lang + '.js';
                document.head.replaceChild(newElement(src), elements[i]);
                // 'require' vil fire loadStrings() as soon as 'src' file loads
                require([src], function () {
                    loadStrings();
                });
                break;
            }
        }
    }
}