2012-10-02 17 views
2

我試圖做到這一點的過程:掃描一個元素類的所有HTML,然後在該類上運行JavaScript?

  1. 查找以「i18n_」
  2. 捕獲類名,然後設置類的.html值的變量具有相同的名稱作爲開頭的所有類類。

基本上,我有一個列表,從i18n_開始,所有字符串都從服務器上獲取。例如i18n_t23 =「返回」或其他。我想採取<span class="i18n_t23"></span>並將其值設置爲變量i18n_t23。現在我有一個手工編碼的$(「span.i18n_t189」)。html(i18n_t189)的大量列表;並且越來越累,必須檢查他們是否都在那裏。必須有辦法讓它自動執行此操作。

謝謝!

+0

你能舉一個你如何定義變量的代碼示例嗎? – pete

+0

$ .each(content.nodes,function(index,obj){eval(「i18n_t」+ obj.node.tid +「='」+ obj.node。name_i18n +「';」); }); 我知道eval絕對不是這裏最好的選擇,但我真的只需要儘快把它弄出門。每個i18n_t ##引用一個drupal分類。我想要做的只是在該分類標識的類中設置一個範圍,並使其具有魔力並使這些值出現。問題是多語言。通過使用drupal的分類法系統,我可以在網站上定義翻譯權並讓json將正確的翻譯權下放。 – mike029

回答

0

我會推薦你​​稍微改變你的設置,從而簡化你得到的JavaScript代碼:

<div data-i18="a">a</div> 

<div data-i18="b">b</div> 

var i18 = { a: 'a2', b: 'b2' } 

$('div[data-i18]').each(function(ind, el) { 
    var key = $(el).data('i18') 
    $(el).html(i18[key])   
});​ 

// or in case of global variables 

$('div[data-i18]').each(function(ind, el) { 
    var key = $(el).data('i18') 
    $(el).html(window[key])   
});​ 

所以不是類i18_something要設置自定義的數據屬性數據-I18,並在這兒價值。

+0

我不得不稍微改變它,但它更有意義,它似乎使用data-i18元素而不是錯誤地使用類。謝謝! – mike029

+1

LOL我想如果我們知道你有修改HTML代碼的能力,我們會推薦這樣的東西。你可以做更簡單的事情,只需在當前跨度中添加一個類,然後搜索該類名並遍歷它們即可。 –

5

只需使用:

$('span[class^=i18n_]').text(
    function(){ 
     return this.className; 
    }); 

值得一提的是這臺元素的元素的類名的文本; span沒有value屬性,並且設置它的html()是不必要的(儘管在這種情況下它具有幾乎相同的結果)。

順便說一句,這取決於你所需要的本作,你可以用簡單的CSS模擬這種(在支持「現代」瀏覽器):

span[class=^=i18n_]::before { 
    content: attr(class); 
} 

手段,以應對多個類別:

$('span[class]').filter(
    function(i, e) { 
     var el = $(e), 
      classes = el.attr('class').split(/\s+/); 
     for (var i = 0, len = classes.length; i < len; i++) { 
      var assessed = classes[i].indexOf('i18n_'); 
      if (assessed === 0) { 
       el.data('classMatch',classes[i]); 
       return true; 
      } 
     } 
    }).text(function(){ return $(this).data('classMatch'); });​ 

JS Fiddle demo

,並處理查找(使用返回的類名來檢索對象的指定值的方法:

var lookup = { 
    'i18n_something' : 'Something for the "something" suffixed class.', 
    'i18n_somethingElse' : 'Something for the "somethingElse" version.', 
    'i18n_AndSomethingElse' : 'And...well, you know the drill.' 
}; 

$('span[class]').filter(
    function(i, e) { 
     var el = $(e), 
      classes = el.attr('class').split(/\s+/); 
     for (var i = 0, len = classes.length; i < len; i++) { 
      var assessed = classes[i].indexOf('i18n_'); 
      if (assessed === 0) { 
       el.data('classMatch',classes[i]); 
       return true; 
      } 
     } 
    }).text(function(){ return lookup[$(this).data('classMatch')]; });​ 

JS Fiddle demo

+1

我不是100%確定我理解這個問題,但函數可能想要返回使用該類作爲查找鍵的結果。此外,這將不會像'' – Pointy

+0

@Pointy:是的;我正在根據每個元素一個類的(可笑的天真的)假設進行工作。看一下處理多重類的簡單方法=)至於查找,是的。我沒有意識到問題中'html()'方法中沒有引號。嘆。 –

+0

正則表達式對於性能會更好,但可能沒什麼值得注意的。 –

1

你試試吧 $("*[class*='i18n_']).attr("class")或者唯一的元素。一個類名如此$("*[class^='i18n_']).attr("class")

1

這裏有一種方法:

var _regClassMatch = /i18n_t([0-9]+)/; 
    jQuery.each(jQuery('span'), function() { 
     var _oCurrSpan = jQuery(this); 
     var _sCurrClass = _oCurrSpan.attr('class'); 

     var _mClassMatch = _sCurrClass.match(_regClassMatch); 
     if (_mClassMatch) { 
      alert(_mClassMatch[1]); 
     } 
    }); 

_mClassMatch [1]是你的數值,而_oCurrSpan對象是當前的跨度。只需在document.ready上運行它。

相關問題