2013-02-21 261 views
3

我试图以子弹的形式显示特定的json数据。每个数据为<li>,每个标题<p>,让这些标题为link。最后,考虑到点击标题显示相关内容该指数在第二<div>。我已经在下面有一段代码(还没有工作)。JSON - 根据json索引显示数据

的Html

<div id="page1"> 
    <ul id="courses"></ul> 
</div> 
<div id="page2"> 
    <p id="content"></p> 
</div> 

JS代码

var jsonString = '[{"chapter":"General","title":"News forum","content":"Text1"}, 
{"chapter":"CHAPTER 1","title":"1.1 Introduction","content":"Text2"}, 
{"chapter":"CHAPTER 1","title":"1.2 Main Idea","content":"Text3"}, 
{"chapter":"CHAPTER 2","title":"2.1 Architecture","content":"Text4"}, 
{"chapter":"CHAPTER 3","title":"3.1 Liter.overview","content":"Text5"}]'; 

var myData = JSON.parse(jsonString); 

$(document).ready(function() { 
    var $clist = $('#courses'); 
    for(var i in myData) { 
     $('<li><h3>' +this.[i].chapter+ '</h3><p><a href="#page2" onclick="dContent(i)">' +this.title+ '</a></p></li>').appendTo($clist); 
    } 

    function dContent() { 
     var $ccontent = $('#content'); 
     $(this.[i].content).appendTo($ccontent); 
    } 
}); 

预期结果:

- General 
    News forum   // onclick display 'Text1' in <p id="content"> 
- CHAPTER 1 
    1.1 Introduction // onclick display 'Text2' in <p id="content"> 
    1.2 Main Idea  // onclick display 'Text3' in <p id="content"> 
- CHAPTER 2 
    2.1 Architecture // onclick display 'Text4' in <p id="content"> 
- CHAPTER 3 
    3.1 Liter.overview // onclick display 'Text5' in <p id="content"> 

任何帮助,将不胜感激。

UPDATE:这是JSFIDDLE项目。

+0

您将需要捕捉'i'在它自己的范围,循环,用生成函数或存储数据在其他地方(如_data - * _属性)创建您想要的onclick监听器。 – 2013-02-21 20:22:55

+0

什么是不工作? – 2013-02-21 21:02:18

+0

@FelixKling没有结果打印。请看看** jsfiddle **(链接在上面)版本。 – Dozent 2013-02-21 22:55:31

回答

1
var jsonString = '[{"chapter":"General","title":"News forum","content":"Text1"},{"chapter":"CHAPTER 1","title":"1.1 Introduction","content":"Text2"},{"chapter":"CHAPTER 1","title":"1.2 Main Idea","content":"Text3"},{"chapter":"CHAPTER 2","title":"2.1 Architecture","content":"Text4"},{"chapter":"CHAPTER 3","title":"3.1 Liter.overview","content":"Text5"}]'; 
var myData = JSON.parse(jsonString); 

var dContent = function(event) { 
    $ccontent.html($(this).data('content')); 
} 

var $clist = $('#courses'); 
var $ccontent = $("#content"); 
var html = ''; 
var chapterList = []; 

$clist.on('click', 'li', dContent); 

$.each(myData, function(index, item) { 
    if ($.inArray(item.chapter, chapterList) === -1) { 
     chapterList.push(item.chapter); 
     html += '<li data-content="'+ item.content +'"><h3>' + item.chapter + '</h3><p><a href="#page2">' + item.title + '</a></p></li>'; 
    } 
    else { 
     html += '<li data-content="'+ item.content +'"><p><a href="#page2">' + item.title + '</a></p></li>' 
    } 
}); 
$clist.html(html); 
+0

已检查您的代码,但结果为空。你可以检查我创建的jsfiddle项目(链接在上面) – Dozent 2013-02-21 23:15:46

+0

这里有一个链接工作 - http://jsfiddle.net/andyzinsser/5p3xu/ – andyzinsser 2013-02-22 00:05:35

+0

啊对不起,我忘了启用JQuery,现在它是工作,非常感谢。顺便可以避免重复第1章并合并这两个标题(标题1.1和1.2)?在此先感谢 – Dozent 2013-02-22 00:14:28

0

您的JSON结构无效。正确的结构如下:

[ 
    { 
     "chapter": "General", 
     "title": "News forum", 
     "content": "Text1" 
    }, 
    { 
     "chapter": "CHAPTER 1", 
     "title": "1.1 Introduction", 
     "content": "Text2" 
    }, 
    { 
     "chapter": "CHAPTER 1", 
     "title": "1.2 Main Idea", 
     "content": "Text3" 
    }, 
    { 
     "chapter": "CHAPTER 2", 
     "title": "2.1 Architecture", 
     "content": "Text4" 
    }, 
    { 
     "chapter": "CHAPTER 3", 
     "title": "3.1 Liter.overview", 
     "content": "Text5" 
    } 
] 

注意逗号这里3.1 Liter.overview","content":"Text5"},在你的JSON结构,在这里失败

代码为修订ANSWER

var jsonString = '[{"chapter": "General","title": "News forum","content": "Text1"},{"chapter": "CHAPTER 1","title": "1.1 Introduction","content": "Text2"},{"chapter": "CHAPTER 1","title": "1.2 Main Idea", "content": "Text3"},{"chapter": "CHAPTER 2","title": "2.1 Architecture","content": "Text4"},{"chapter": "CHAPTER 3","title": "3.1 Liter.overview","content": "Text5"}]'; 

var myData = JSON.parse(jsonString); 
$(document).ready(function() { 
    function dContent() { 
     $("#content").css("border","2px solid red").css("height","100px"); 
     $("#content").html($(this).data('value')); 
    } 
    $("#courses").on('click','li', dContent) 
    $.each(myData, function(index,item) { 
    $("#courses").append("<li class='li' data-value="+item.content+">"+item.chapter+" <p>"+item.title+"</p></li>"); 

    }) 



}); 

DEMO ON JSFIDDLE

+0

感谢您的提示,这是只有错字...已经纠正 – Dozent 2013-02-21 22:51:44

0

this.[i].chapter应可能是myData[i].chapter。事实上,这是一个语法错误。

然后您应该重新考虑您的其他用途this是否正确。

0

将此复制到您的JSFiddle中,并检入jQuery,将使其工作。

var jsonString = '[{"chapter":"General","title":"News forum","content":"Text1"},{"chapter":"CHAPTER 1","title":"1.1 Introduction","content":"Text2"},{"chapter":"CHAPTER 1","title":"1.2 Main Idea","content":"Text3"},{"chapter":"CHAPTER 2","title":"2.1 Architecture","content":"Text4"},{"chapter":"CHAPTER 3","title":"3.1 Liter.overview","content":"Text5"}]'; 

var myData = JSON.parse(jsonString); 

$(document).ready(function() { 
    var $clist = $('#courses'); 

    $.each(myData, function(i,o){ 
     $('<li><h3>' +o.chapter+ '</h3><p>' + 
      '<a href="#page2" onclick="dContent(\''+o.content+'\')">' + 
      o.title + '</a></p></li>').appendTo($clist); 
    }); 

    window.dContent = function(content) { 
     var $ccontent = $('#content'); 
     $ccontent.append(content); 

    } 
}); 
+0

真正的感谢,作品像一个沙姆沙伊赫。 – Dozent 2013-02-21 23:50:47

+0

只有一个问题:如何避免'章节'的重复名称,即我想将'1.2主要想法'推入'第1章'中,因为它是本章的一部分。提前致谢。 – Dozent 2013-02-22 00:00:19

+0

http://jsfiddle.net/rutZA/6/更新我的小提琴所以它的工作 – andyzinsser 2013-02-22 00:02:10

1

我已经写了一个脚本来做到这一点,包括把同一章节的内容放在一起。你可以看到一个demo fiddle here

我使用原生JavaScript的大部分,除了jQuery的$(a).on('click', ..$(document).ready,以确保兼容性。为什么这么久?因为我用DOM方法构建了<ul>,而不是html字符串。这使得缓存和追加元素变得很容易。最后,内容通过生成器功能添加。我这样做的方式意味着页面将使用更多内存,但您可以在内容部分中显示任何字符串,该字符串在JavaScript中有效。您可能需要使用whitespace: pre-wrap;来设置样式,以按预期方式显示新行。

总之,这里是代码

var jsonString = '[{"chapter":"General","title":"News forum","content":"Text1"},\ 
{"chapter":"CHAPTER 1","title":"1.1 Introduction","content":"Text2"},\ 
{"chapter":"CHAPTER 1","title":"1.2 Main Idea","content":"Text3"},\ 
{"chapter":"CHAPTER 2","title":"2.1 Architecture","content":"Text4"},\ 
{"chapter":"CHAPTER 3","title":"3.1 Liter.overview","content":"Text5"}]'; 
// the \ at line ends is to escape the new line in the string literal 

var myData = JSON.parse(jsonString); 

$(document).ready(function() { 
    var courses_ul = document.getElementById('courses'), // cache elements 
     content_elm = document.getElementById('content'), 
     i, li, h3, p, a, // vars for loop 
     chapters = {}, chap; // cache chapters 
    for (i = 0; i < myData.length; ++i) { 
     chap = myData[i].chapter; // shorthand since we'll use it a few times 
     // make <p>, <a> 
     p = document.createElement('p'); 
     a = document.createElement('a'); // could append <a> to <p> here if you want 
     a.setAttribute('href', '#page2'); 
     a.appendChild(document.createTextNode(myData[i].title)); 
     // set up click 
     $(a).on('click', (function (content) { // generator - will give scope to 
      return function() { // this returned event listener. 
       content_elm.innerHTML = ''; 
       content_elm.appendChild(document.createTextNode(content)); 
      }; 
     }(myData[i].content))); // chose `content` not `i` so no reliance on `myData` 
     // now check cache if chapter exists - 
     if (chap in chapters) { // retreive <li> for chapter from cache 
      li = chapters[chap]; // from cache 
      // append <p>, <a> 
      li.appendChild(p).appendChild(a); 
     } else { // if not in cache 
      li = document.createElement('li'); // make a new <li> 
      chapters[chap] = li; // and cache 
      // make & append <h3> 
      h3 = document.createElement('h3'); 
      h3.appendChild(document.createTextNode(chap)); 
      li.appendChild(h3); 
      // append <p>, <a> and to <ul> 
      courses_ul.appendChild(li).appendChild(p).appendChild(a); 
     } 
    } 
});