2012-03-26 26 views
0

即時通訊製作一個小笑臉腳本,它所做的是將:: 1 ::轉換爲div的圖像html。變量數組+正則表達式不能一起工作?

的代碼如下:

var smileys = { 
    '1': 'http://domain.com/smiley1.gif', 
    '2': 'http://domain.com/smiley2.gif', 
    '3': 'http://domain.com/smiley3.gif' 
}; 

function checksmileys(){ 
x$('.message').each(function() 
    var start = '<img src="'; 
    var end = '">'; 
    x$(this).html(x$(this).html().replace(/::(\d+)::/g, start + smileys['$1'] + end)); 
}); 

Checksmileys功能由用戶事件觸發。

但是它不能夠得到數字(這是id)出一個句子。 它不停地在如下生產這種<img src="undefined">

我的HTML例子:

<div id="chat"> 
    <ul> 
    <li class="message">Hi john</li> 
    <li class="message">what are you doing</li> 
    <li class="message">::1:: nothing</li> 
    <li class="message">hi</li> 
    <li class="message">nice to meet you ::1::</li> 
    </ul> 
</div> 

哪裏是我的問題嗎?

回答

2

我猜你需要這裏的功能:

html = html.replace(/::(\d+)::/g, function($0, $1) { return start + smileys[$1] + end }) 

html()函數形式就派上用場了

$(this).html(function(_, oldhtml) { 
    return oldhtml.replace(/::(\d+)::/g, function($0, $1) { 
     return start + smileys[$1] + end; 
    }) 
}) 
+0

是的,這是答案謝謝 – sm21guy 2012-03-26 07:34:00

+0

+1偉大的解決方案,對我來說新的知識:D – 2012-03-26 07:39:53

0

在JavaScript中,屬性名沒有前綴,如他們經常在PHP做。您在smileys對象創建的屬性的名稱是1,不$1,所以更改smileys['$1']smileys['1']

更新:從您的評論如下,你似乎試圖用$1來指代捕獲組。只有當$1是你傳遞的字符串的一部分,但前的公式start + smileys['$1'] + end評估調用replace,然後加入到它的工作原理。 smileys['$1']將是未定義的。

既然你試圖做一個查詢,最好的辦法是在做查找功能來傳遞:

x$(this).html(x$(this).html().replace(/::(\d+)::/g, function(m, c1) { 
    return start + smileys[c1] + end; 
})); 

c1是第一個捕獲組的文本。 More


你已經把它稱爲一個數組,我猜是因爲你已經習慣了從PHP的術語「關聯數組」。您的smileys對象只是一個對象,而不是數組。在JavaScript中,當我們說「陣列」,是指通過[]new Array,其中有具體的操作爲一定的階級屬性名稱(用數字)的創造的,一個特殊的length屬性,一些方便的陣列相似的功能。你已經與smileys所做的是完全正常的,並完全正常,我們就傾向於不使用單詞「陣列」它(「地圖」是比較常見的JS世界)。

+0

沒有,$ 1是從正則表達式這裏的。它得到1 :: 1 :: – sm21guy 2012-03-26 07:31:35

+0

@ sm21guy:不,它不是。要在正則表達式中使用,它必須是要傳入'replace'的字符串的一部分。但它不是,在調用'replace'之前評估它的一部分,然後傳遞給它。代碼中的「$ 1」是您在「笑臉」上查找的房產的名稱。使用上面的代碼,'smileys ['$ 1']'將會是'undefined'。沒有任何事情可以用'替換'來完成。 – 2012-03-26 07:33:07

+0

@ sm21guy:我已經更新了答案,告訴你如何去做你正在做的事情。 – 2012-03-26 07:36:58