我想出了一些我正在開發的項目的定製本地化解決方案。我們的想法是,我的HTML可以包含這樣的:「eval是邪惡的」,但我有選擇嗎?
<h2 data-l10n="HELLO" data-l10n-params="['Visitor', new Date()]"></h2>
頁面時啓動的JavaScript函數像這樣運行:
localizeAll: function(sel) {
var selector = sel || document,
$o = $(selector);
$o.find('[data-l10n]').each(
function() {
var $t = $(this),
val = $t.attr('data-l10n'),
params = $t.attr('data-l10n-params'),
po = null;
if (typeof params !== 'undefined') {
po = eval(params);
log(params, po);
}
var res = doLocalize(val, po);
if (res[0] !== '<') {
$t.text(res);
} else {
$t.text(val);
}
});
}
所以基本上我們尋找的是有一個data-l10n
-attribute任何元素請爲每個這些對象調用doLocalize()
。此外,元素可以具有一個data-l10n-params
屬性,它只是一個可以解析爲數組的字符串文字。評估該字符串(params
字符串變爲po
數組),po
作爲可選的第二個參數提供給doLocalize()
。
因此,在Firebug輸出(從log(params, po);
說法)是:
['Vistor', new Date()] ["Vistor", Date {Thu Nov 17 2011 10:10:31 GMT+0100 (CET)}]
所以,是的,我使用eval。是的,我知道「eval是邪惡的」。但偶爾,我需要將參數傳遞給doLocalize()
。
如何在沒有評估的情況下做到這一點?
非常有趣的解決方案。我想知道你爲什麼這樣做。這樣,html類型告訴JS做什麼,而不是JS完成html。我覺得兩者應該更分離,這也會使你的HTML有效(現在不是)。那麼,這種方法有什麼特別的理由嗎? – kasimir
@ kasimir:如果你的意思是'data-'屬性,那麼它們實際上在HTML5中是有效的。 –
@TomaszNurkiewicz:謝謝你指出,我忘記了。 – kasimir