2011-11-17 31 views
0

我想出了一些我正在開發的項目的定製本地化解決方案。我們的想法是,我的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()

如何在沒有評估的情況下做到這一點?

+0

非常有趣的解決方案。我想知道你爲什麼這樣做。這樣,html類型告訴JS做什麼,而不是JS完成html。我覺得兩者應該更分離,這也會使你的HTML有效(現在不是)。那麼,這種方法有什麼特別的理由嗎? – kasimir

+1

@ kasimir:如果你的意思是'data-'屬性,那麼它們實際上在HTML5中是有效的。 –

+0

@TomaszNurkiewicz:謝謝你指出,我忘記了。 – kasimir

回答

4

我認爲你的問題是你有效地在HTML中嵌入JavaScript(這是違反unobtrusive JavaScript原則)。

在你的地方,我會添加一個額外l18n-params.js文件具有以下內容:

var dataL10Nparams = { 
    HELLO = ['Visitor', new Date()] 
} 

現在,而不是從HTML屬性讀取PARAMS和評估只要致電:

dataL10Nparams['HELLO'] 
+0

使用你的想法時,不能想到任何缺點。非常感謝! – Jacob

2

如果您只在HTML屬性中提供參數化值,請考慮使用JSON.parse()而不是評估。

+0

JSON.parse()是我的第一個選擇,但它不會處理參數中的JavaScript,所以像'{「key」:「value」,「now」:new Date()}''不能被解析。 – Jacob