我制作一个小笑脸剧本,它的作用是将:: 1 ::改为图像html为div。
代码如下:
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>
我的问题在哪里?
答案 0 :(得分: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;
})
})
答案 1 :(得分: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世界中更常见)。