替换所有出现的数组元素

时间:2013-11-22 00:52:06

标签: jquery replace

这是我的jsfiddle

问题是,替换只在第一个匹配的html元素上正确完成,对于其余匹配的元素,它只复制第一个文本中的文本。

我认为问题出在html(),因为只有Gets the HTML contents of the first element in the set of matched elements,如jQuery docs中所述。

我应该如何更正代码,以便在所有macthed元素中进行替换?

3 个答案:

答案 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++;
}

JS Fiddle demo

但是,对于简化演示之外的用例,这可能有点天真。

答案 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++;
}

http://jsfiddle.net/JtMAj/

我希望我能提供帮助:)。

答案 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