如何使用Javascript而不是jQuery动态填充带有JSON数据的html元素?

时间:2011-11-29 17:03:56

标签: javascript html json

我有以下JSON数据snippit:

{"items": [
 {
   "title": "sample 1",
   "author": "author 1"
 },
 {
  "title": "sample 2",
  "author": "author 2"
 }
]}

如何使用以下数据填充以下html元素:

<div class="news-story">
 <h5>sample 1</h5>
 <p>By: author 1</p>
 <h5>sample 2</h5>
 <p>By: author 2</p>
</div>

我想用Javascript而不是jQuery来完成这个。

7 个答案:

答案 0 :(得分:13)

循环遍历它们并使用DOM函数:

var news = document.getElementsByClassName("news-story")[0];
var items = json.items;
for(var i = 0; i < items.length; i++) {
    var h5 = document.createElement("h5");
    h5.innerHTML = items[i].title;
    news.appendChild(h5);
    var p = document.createElement("p");
    p.innerHTML = items[i].author;
    news.appendChild(p);

}

http://jsfiddle.net/AWRAW/

getElementsByClassName在9之前的IE版本中不起作用。如果你需要支持那些,那么你最好不要使用jQuery。

答案 1 :(得分:6)

var div = document.getElementsByClassName('news-story')[0],
    h5 = div.getElementsByTagName('h5'),
    p = div.getElementsByTagName('p'),
    data = JSON.parse( my_JSON_data );

data.items.forEach(function(v,i) {
    h5[i].innerHTML = v.title;
    p[i].innerHTML = "By: " + v.author;
});

<强> JSFIDDLE DEMO


如果您需要支持旧版浏览器,则可以使用典型的for语句而不是forEach方法。

for( var i = 0; i < data.items.length; ++i ) {
    var v = data.items[i];
    h5[i].innerHTML = v.title;
    p[i].innerHTML = "By: " + v.author;
}

我建议为news-story元素使用ID而不是类,因此您可以使用getElementById代替(除非您当中有几个)

如果这是不可能的,您可能需要为getElementsByClassName使用兼容性功能from MDN


如果你需要创建内部元素,那么这是一种方式:

var div = document.getElementsByClassName('news-story')[0],
    data = JSON.parse( my_JSON_data ),
    html;

html = data.items.map(function(v,i) {
    return '<h5>' + v.title + '</h5>' +
           '<p>By: ' + v.author + '</p>';
}).join('');

div.innerHTML = html;

<强> JSFIDDLE DEMO


@ Xeon06使用createElement()显示了他的答案,这可以说是一种更好的方法。

我是这样做的:

var div = document.getElementsByClassName('news-story')[0],
    frag = document.createDocumentFragment(),
    data = JSON.parse( my_JSON_data );

data.items.forEach(function(v,i) {
    frag.appendChild( document.createElement('h5') ).innerHTML = v.title;
    frag.appendChild( document.createElement('p') ).innerHTML = "By: " + v.author;
});
div.appendChild( frag );

<强> JSFIDDLE DEMO

当然,您可以修改它以使用for语句:

var div = document.getElementsByClassName('news-story')[0],
    frag = document.createDocumentFragment(),
    data = JSON.parse( my_JSON_data );

for( var i = 0; i < data.items.length; ++i ) {
    var v = data.items[i];
    frag.appendChild( document.createElement('h5') ).innerHTML = v.title;
    frag.appendChild( document.createElement('p') ).innerHTML = "By: " + v.author;
}
div.appendChild( frag );

使用documentFragment的好处是,您可以通过片段而不是多个附加对DOM进行单个附加。这样可以提供更好的性能,尤其是当您拥有大量数据时。

答案 2 :(得分:3)

迟到总比没有...我最近做了一个lib来做这件事!

FragBuilder是库..用法非常简单:对于您发布的示例,您需要稍微更改JSON以使其更具语义...

var frag = [{"items": [
 {
   "title": "sample 1",
   "author": "author 1"
 },
 {
  "title": "sample 2",
  "author": "author 2"
 }
]}];

会变成

var frag = [ { "childNodes" : [ { "childNodes" : [ { "textContent" : "sample 1" } ],
          "tagName" : "H5"
        },
        { "childNodes" : [ { "textContent" : "By: author 1" } ],
          "tagName" : "P"
        },
        { "childNodes" : [ { "textContent" : "sample 2" } ],
          "tagName" : "H5"
        },
        { "childNodes" : [ { "textContent" : "By: author 2" } ],
          "tagName" : "P"
        }
      ],
    "className" : "news-story",
    "tagName" : "DIV"
  } ];

然后通过调用FragBuilder(frag)

生成DocumentFragment

如果您发现使用HTML更容易模板然后转换为JSON https://gist.github.com/2313580(注意,标记之间的空格不会被处理并导致失败),还有一个反向函数。

答案 3 :(得分:1)

我发现创建DOM元素最可靠的方法是使用element.innerHTML属性。基本上,您在页面上要渲染新HTML的位置有一个DIV或SPAN。然后,您将使用document.getElementById("DIV-ID")在javascripting中获取该范围,然后将DIV的innerHTML属性设置为您将从JSON对象生成的新HTML。还有许多其他JavaScript函数可以创建元素,但我发现它们并不总是可靠的,并且并不总是具有最佳的跨浏览器支持。

http://www.w3schools.com/jsref/prop_html_innerhtml.asp

答案 4 :(得分:1)

没有jQuery的示例:

<html>
    <head>
        <title>test</title>
    </head>
    <body>
       <div class="news-story">
            <h5>sample 1</h5>
            <p>By: author 1</p>
            <h5>sample 2</h5>
            <p>By: author 2</p>
        </div> 
        <script type="text/javascript">
            var json = {
                "items": [
                    {
                    "title": "sample x",
                    "author": "author x"
                    },
                    {
                    "title": "sample y",
                    "author": "author y"
                    }
                ]
            };

            var bindDataToHTML = function(data, element) {
                 var h5 = null;
                 var p = null;
                 h5 = element.getElementsByTagName("h5");
                 p  = element.getElementsByTagName("p");
                 h5[0].innerText = data.items[0].title;
                 h5[1].innerText = data.items[1].title;
                 p[0].innerText = data.items[0].author;
                 p[1].innerText = data.items[1].author;
            };

            document.getElementsByClassName = function(cl) {
                var retnode = [];
                var myclass = new RegExp('\\b'+cl+'\\b');
                var elem = this.getElementsByTagName('*');
                for (var i = 0; i < elem.length; i++) {
                    var classes = elem[i].className;
                    if (myclass.test(classes)) { retnode.push(elem[i]); }
                }
                return retnode;
            };

            // For sample purpose, let's imagine this method is a callback
            // for a request that provides you with your json data
            var doRequest = function() {
                var data = json;
                var element = null;

                var x = document.getElementsByClassName("news-story");

                if((null != x) && (0 < x.length)) {
                    element = x[0];
                }
                bindDataToHTML(data, element);
            };

            (function() {
                doRequest();
            })();

        </script>
    </body>
</html>

答案 5 :(得分:0)

尝试使用JsRender和JsViews或者mustache / ember

答案 6 :(得分:0)

$(document).ready(function () {
    loadfunctionAjax();
});
var loadfunctionAjax = function () {
    $.ajax({
        type: 'GET',
        url: '/Site/SocialLink',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) {
            var HTML = '';
            for (var i = 0; i < data.length; i++) {
                item = data[i];
                HTML += '<li><a class="" target="_blank" href="' + item.FALink + '"><i class="fa ' + item.FAIcon + '"></i>' + item.Name + '</a ></li > ';
            }
            $('#footerSocialNav').append(HTML);
        }
    });
}