【问题标题】:Allow user to choose language of a postal form and adapt the select options accordingly in jQuery允许用户选择邮政形式的语言并在 jQuery 中相应地调整选择选项
【发布时间】:2013-08-04 15:03:43
【问题描述】:

我必须创建一个表单,提示用户输入他们的邮政编码、州和街道地址。但首先,用户应该能够在<select> 中选择他们的语言,并且标签和选择选项(例如他们的标题)必须以他们选择的语言进行设置。

在语言之后,他们应该能够在一个简短的列表中选择他们的国家,并且邮政编码的正则表达式验证当然必须与所选国家匹配。

我想在没有插件的情况下做到这一点。 最干净的方法是什么?

到目前为止我的想法:

//Get the selected language and country
function which(){
    lang = $('#language').prop('selectedIndex');
    country = $('#country').prop('selectedIndex');
    if(lang == 1){
        pickedLang = "en";
    }else if(lang == 2){
        pickedLang = "de";
    }else if(lang == 3){
        pickedLang = "fr";
    }

    if(country == 1){
        pickedCountry = "US";
    }else if(country == 2){
        pickedCountry = "UK";
    }else if(country == 3){
        pickedCountry = "DE";
    }else if(country == 4){
        pickedCountry = "FR";
    }else{
        pickedCountry = 0;
    }
}

然后,更改标签和选项以匹配所选语言:

$('#language').change(function(){
    if(pickedLang == "en"){
        $('.country label').text('Country');
        $('.language label').text('Language');
        $('#country option').eq(0).text('Pick a country');
        $('#country option').eq(1).text('United States');
        $('#country option').eq(2).text('United Kingdom');
        $('#country option').eq(3).text('Germany');
        $('#country option').eq(4).text('France');

        $('.gender label').text('Title');
        $('#gender option').eq(0).text('Choose...');
        $('#gender option').eq(1).text('Mr.');
        $('#gender option').eq(2).text('Ms.');
        $('#gender option').eq(3).text('Miss');

        $('.name label').text('Name:');
        $('.first-name label').text('First name:');
        $('.street label').text('Street:');
        $('.number label').text('Number:');
        if(pickedCountry == "UK"){
            $('.postcode label').text('Post Code:');
        }else{
            $('.postcode label').text('Zip Code:');
        }
        $('.state label').text('State:');
        $('.city label').text('City:');
    }else if [...]

但我真的觉得这可以以某种方式简化和清洁。

编辑: 感谢 Nicklas,我现在清理了代码并决定使用 JSON 来存储不同语言的所有标签。

{
"en": [
{
    "languageLabel":    "Language",
    "countryLabel":     "Country",
    "nameLabel":        "Name",
    "emailLabel":       "E-mail",
    "streetLabel":      "Street",
    "nbrLabel":         "N°",
    "zipLabel":         "Zip",
    "stateLabel":       "State",
    "cityLabel":        "City",
    "sendLabel":        "Send"  
}
],

"fr": [
{
    "languageLabel":    "Langue",
    "countryLabel":     "Pays",
    "nameLabel":        "Nom",
    "emailLabel":       "Adresse e-mail",
    "streetLabel":      "Rue",
    "nbrLabel":         "N°",
    "zipLabel":         "CP",
    "stateLabel":       "Province",
    "cityLabel":        "Ville",
    "sendLabel":        "Envoyer"   
}
],

"de": [
{
    "languageLabel":    "Sprache",
    "countryLabel":     "Land",
    "nameLabel":        "Name",
    "emailLabel":       "E-Mail-Adresse",
    "streetLabel":      "Straße",
    "nbrLabel":         "N°",
    "zipLabel":         "PLZ",
    "stateLabel":       "Staat",
    "cityLabel":        "Stadt",
    "sendLabel":        "Senden"    
}
]
}

jQuery:

var labels;
    $.getJSON("path-to-json-file",function(data){
            labels=data;
    }); 


    ////////// DETECT CHANGES IN THE SELECTBOXES
    $('#language, #country').change(function(){
        which();
        var currentLabels = labels[pickedLanguage];
        $('#language-container label').text(currentLabels.languageLabel);
        $('#country-container label').text(currentLabels.countryLabel);
    });

但是,控制台返回错误并说它无法读取未定义的属性“fr”(或任何其他语言)。由于我对 JSON 的使用完全不熟悉,恐怕我在某个地方搞砸了。

【问题讨论】:

  • 另外,在您尝试访问labels 之前,请确保ajax 请求已经真正完成。如果请求没有完成,那么labels当然不会包含任何内容。
  • 并跳过 JSON 对象内的方括号(数组声明符)。按照您现在的方式,您必须引用 currentLabels[0].languageLabel 等等。
  • 这很酷。如果您用其他国家/地区充实了您的 JSON 表,您是否愿意分享它,这样我(和其他用户)就不必从头开始重新创建它。

标签: jquery forms select dynamic options


【解决方案1】:

尝试通过制作所有变量的字典来清理它:

var langOptions = {
    en: {
        countryLabel:  'Country',
        languageLabel: 'Language',

        ...
    }
}

那么当你需要访问合适的时候:

var myOptions = langOptions[pickedLang];

然后您可以始终以相同的方式访问它们,而无需无穷无尽的 if 语句:

$('.country label').text(myOptions.countryLabel);
$('.language label').text(myOptions.languageLabel);

进一步,考虑以 json 格式存储 langOptions 对象并使用 jQuery.getJSON() 通过 ajax 加载它。这应该会产生更清晰的代码。

编辑:一个用法示例,澄清一下: http://jsfiddle.net/9Npg2/

【讨论】:

  • 非常感谢您的回答!你肯定让我走上了正确的道路。我从未使用过 JSON,所以我决定试一试以了解它是如何工作的。但恐怕我做错了(见原帖的编辑)。
  • 这是一个如何使用它的例子:jsfiddle.net/9Npg2。希望一切都解决了!
  • 我检查了一下,似乎是正确的。但是,我认为错误是脚本无法将 JSON 数据存储到标签变量中,因此它说它是未定义的。我尝试将 JSON 存储在变量中的位置是否正确?
  • 是的,我刚刚用可能的问题评论了您的问题。 $.getJSON 是一个异步请求,因此在请求加载之前不应调用label 变量。考虑在getJSON 回调中声明change 监听器。
猜你喜欢
  • 1970-01-01
  • 2011-06-03
  • 2017-02-25
  • 1970-01-01
  • 2021-06-20
  • 2020-09-11
  • 1970-01-01
  • 2023-03-18
  • 2019-05-14
相关资源
最近更新 更多