这是我的jsfiddle。
问题是,替换只在第一个匹配的html元素上正确完成,对于其余匹配的元素,它只复制第一个文本中的文本。
我认为问题出在html()
,因为只有Gets the HTML contents of the first element in the set of matched elements
,如jQuery docs中所述。
我应该如何更正代码,以便在所有macthed元素中进行替换?
答案 0 :(得分:1)
我建议使用计数器(i
)来跟踪迭代,最简单的方法是:
var replacers = {
'a': /1/gi,
'b': /2/gi,
'c': /3/gi
};
var el = $("div"),
i = 0;
for (var key in replacers) {
$('div').eq(i).html(function(_,h){
return h.replace(replacers[key], key);
});
i++;
}
但是,对于简化演示之外的用例,这可能有点天真。
答案 1 :(得分:1)
我认为你没有做你想做的事。在您的示例中,您是:
el现在将指向所有div:
var el = $("div");
现在您将第一个元素的内容保存到var html
html = el.html();
for (var key in replacers) {
在循环中,您可以在第一次运行中使用'111'
替换var html(保存'aaa'
的位置)的内容。循环的第二个和第三个文字没有做任何事情,因为html现在包含'aaa'
html = html.replace(replacers[key], key);
}
最后,您将每个div设置为'aaa'
el.html(html);
这是另一个有希望的“直截了当”的例子,说明你如何做到这一点:
var i = 1;
var modified_html;
for (var key in replacers) {
modified_html=$('div:nth-child(' + i + ')').html().replace(replacers[key], key);
$('div:nth-child(' + i + ')').html(modified_html)
i++;
}
我希望我能提供帮助:)。
答案 2 :(得分:0)
您希望循环遍历每个元素,并在该循环内遍历当前elemtn内容的replacers
/* loop all elements*/
$("div").html(function (i, oldHtml) {
/* now loop replacemts on this element*/
for (var key in replacers) {
oldHtml = oldHtml.replace(replacers[key], key);
}
return oldHtml
})
的 DEMO 强>