我有这个奇怪的情况,我必须使用javascript根据页面语言管理一些小文本。想象一下,你需要根据html lang属性替换模板的某些部分。所以我创建了多维数据对象,并决定采用以下方式。一切正常,但我觉得这不是最好的做法,也许我可以避免使用开关:
jsbin版本: http://jsbin.com/EvEciVa/2/
$(function(){
var lang = $('html').attr('lang'),
text;
var obj = {
'en' : {
'title' : 'Title english',
'url' : 'en.html'
},
'fr' : {
'title' : 'Title french',
'url' : 'fr.html',
}
};
switch(lang){
case'fr':
text = [obj.fr.title,obj.fr.url];
break;
default:
text = [obj.en.title,obj.en.url];
}
$('body').prepend('<a href="'+text[1]+'">'+text[0]+'</a>');
});
问题是:至于我有lang属性值(语言),也许我可以避免使用switch和重复的情况,而是我可以将lang值实现为变量来访问数据对象,就像这样{{ 1}}当然,在我的情况下它不会起作用。
我很感激任何意见。谢谢。
答案 0 :(得分:4)
为了避免使用switch
语句,您可以设置如下默认值:
var lang = $('html').attr('lang') || 'en';
这意味着en
是默认设置,如果设置了lang
,则会被覆盖。然后,您可以使用括号表示法来访问对象:
$('body').prepend('<a href="' + obj[lang].url + '">' + obj[lang].title + '</a>');
答案 1 :(得分:2)
在这种情况下你真的不需要数组:
$('body').prepend('<a href="'+obj[lang].url+'">'+obj[lang].title+'</a>');
答案 2 :(得分:1)
使用括号表示法
text = [obj[lang].title,obj[lang].url];
我会丢弃数组,只是将标题/ url放在字符串中。
var data = obj[lang];
$('body').prepend('<a href="' + data.url + '">' + data.text + '</a>');
答案 3 :(得分:0)
我会将本地化对象分配给另一个变量并从那里开始工作。这样,所有本地化代码都可以引用同一个对象而无需处理语言逻辑,如果需要,可以在以后切换到外部本地化文件。
$(function(){
var lang = $('html').attr('lang') || 'en',
text;
var obj = {
'en' : {
'title' : 'Title english',
'url' : 'en.html'
},
'fr' : {
'title' : 'Title french',
'url' : 'fr.html',
}
};
var translations = obj[lang];
$('body').prepend('<a href="'+translations.url+'">'+translations.text+'</a>');
});
另外,正如Rory所说,设置默认值是一个非常好的主意。
答案 4 :(得分:-1)
要避免使用switch
语句,您只需检查对象中是否显示属性语言,然后选择英语:
var lang = $('html').attr('lang');
if (! (lang in obj))
lang = "en";
// then:
'<a href="' + obj[lang].url + '">' + obj[lang].title + '</a>'
或者,也许更容易,使用较短的
var localisation = obj[ $('html').attr('lang') ] || obj.en;
'<a href="' + localisation.url + '">' + localisation.title + '</a>'