Метод третий самый простой для работы с теми, что вы перечислили.Не беспокойтесь об эффективности преобразования строк.Вы должны иметь миллионы статей для этого, чтобы иметь реальное значение.Имейте в виду, что если вы создаете этот HTML на сервере, JSON должен быть закодирован для того, чтобы HTML был действительным.Вы можете кодировать base-64 с помощью .btoa()/.atob()
, чтобы сделать это легко.Если для установки данных в DOM используется свойство .dataset
, DOM позаботится о его правильном хранении в качестве объекта.
Четвертый вариант - использовать блок <pre>
с display: none;
.Это хорошо работает, если вы строите свой список на сервере.Я использую этот метод в написанной мной теме tumblr, http://stiff -theme.tumblr.com / , потому что у меня очень мало контроля над выходом сервера.Вы можете оставить код JSON без кода и легко преобразовать его в объект с помощью $.parseJSON()
.
HTML:
{ "title": "titel1", "detailurl": "article1.html" }
Сценарий:
var articles = $.parseJSON( $( 'pre' ).text() );
Пятый метод - просто использовать HTML-разметку и CSS для стилизации.Создайте разметку большой версии вашей статьи, которая содержит все.Затем используйте класс, чтобы скрыть, изменить размер и положение для отображения списка меньшего размера.Мне больше всего нравится этот метод для проблемы, которую вы пытаетесь решить.
Демо: http://jsfiddle.net/ThinkingStiff/ngE8s/
HTML:
<ul id="articles">
<li>
<article>
<img src="large-image-url.png">
<h1>Title</h1>
<section>
<p>article body</p>
...
</section>
</article>
</li>
...
</ul>
<div id="display"><div>
CSS:
#articles {
display: inline-block;
list-style-type: none;
padding: 0;
margin: 0;
vertical-align: top;
width: 200px;
}
#articles li {
border-bottom: 1px solid lightgray;
cursor: pointer;
display: block;
height: 32px;
overflow-y: hidden;
}
#articles img {
float: left;
height: 30px;
margin-right: 4px;
width: 30px;
}
#articles h1 {
font-size: 13px;
margin: 0;
}
#display {
display: inline-block;
vertical-align: top;
width: 400px;
}
#display img {
float: left;
height: 150px;
margin-right: 8px;
width: 150px;
}
#display h1 {
margin: 0;
}
p {
font-size: 18px;
}
Сценарий:
document.getElementById( 'articles' ).addEventListener( 'click', function( event ) {
var article = event.target.closestByTagName( 'article' );
if( article ) {
var display = document.getElementById( 'display' ),
large = article.cloneNode( true );
display.removeChild( display.firstChild );
display.appendChild( large );
};
}, false );
Element.prototype.closestByTagName = function ( tagName ) {
return this.tagName && this.tagName.toUpperCase() == tagName.toUpperCase()
? this
: this.parentNode.closestByTagName && this.parentNode.closestByTagName( tagName );
};
Вывод:
