3

我很难做一些看起来很简单的事情。我有一个 javascript 对象:

var main = {
    pages : {
        "123" : {
            "content": "<div><p>The div</p></div><nav><p>The nav</p></nav>",
            "foo":"bar"
        },
        "456" : {
            "content": "<div><p>The div</p></div><nav><p>The nav</p></nav>",
            "foo":"bar"
        }
    }
};

我正在尝试以下代码:

$(function(){
        var p = main.pages;
        $.each(p,function(i,el){
            var c = p[i].content;
            var newc = $(c).find('nav').html('<p>New content</p>');
            //console.log(c);
            //console.log(newc);
        });
        //console.log(p)
});

使我的对象看起来像:

var main = {
    pages : {
        "123" : {
            "content": "<div><p>The div</p></div><nav><p>New content</p></nav>",
            "foo":"bar"
        },
        "456" : {
            "content": "<div><p>The div</p></div><nav><p>New content</p></nav>",
            "foo":"bar"
        }
    }
};

但我很难做到。我错过了什么?

我已经在jsfiddle中设置了前一个示例

我确实理解尝试将字符串作为 dom 元素进行操作通常不是一个好主意,但我别无选择,因为该对象来自 RESTful 服务器,并且为此在当前页面中注入 html 没有多大意义。

4

2 回答 2

2

您实际上可以在 jQuery 中构建 HTML,而无需将其附加到 DOM中。

$(function () {
    var p = main.pages;
    //a temporary div
    var div = $('<div>');
    $.each(p, function (i, el) {
        //append to div, find and replace the HTML
        div.append(p[i].content).find('nav').html('<p>New content</p>');
        //turn back into a string and store
        p[i].content = div.html();
        //empty the div for the next operation
        div.empty();
    });
    console.log(p);
});
于 2013-05-11T07:46:28.577 回答
1

因为$(p[i].content)不是一个元素而是两个,所以根据您的代码:

var tmp = $(p[i].content);
tmp.eq(1).html('<p>new content');
console.log(tmp.html());
于 2013-05-11T07:52:49.950 回答