Как полностью создать HTML из объекта js?

Я работаю над поиском способа использования javascript для создания сообщений в блогах для моего сайта. Я неплохо разбираюсь в javascript, однако я не использовал многие элементы DOM, кроме document.getElementById(). Я ищу поддержку в том, как реализовать способ превратить объект JS в сообщение. Вот пример объекта:

var posts = {     //My object

firstPost: {      //An example post
  index: 1,       //Identifies order of posts: 1 is oldest... >1 newest
  id: "first", //An id for the post
  date: {         //Date will be listed next to name on post
    month: 11,
    day: 2,
    year: 2018
  },
  name: "My Post",              //Name of the post
  text: "Text for the post...", //Actual Post
  image: 'blogImage.png'        //An image for the post
}

И теперь я хочу передать его через функцию, как показано ниже, для создания HTML:

function assemblePost( index, id, month, day, year, text, image) {
   //DOM GOES IN HERE
} 

Вот пример того, как выглядит HTML, когда я набираю его вручную:

<div class = "card" id = "first"> <!-- Card element links to css -->
    <h2>My Post</h2> <!-- Name of the post -->
    <h5>Posted November 2nd, 2018</h5> <!-- Date of the post -->
    <div class = "img" style = "height:200px;"><img src = "/blogImage.png" ></div>
    <p>Text for the post..."</p> <!-- Actual Post -->
</div>

Я не совсем уверен, как подойти к этому, потому что:

  1. Класс «карта» ссылается на CSS, и я не уверен, как реализовать это с помощью DOM.
  2. Я не уверен, может ли DOM редактировать стиль, так как в этом примере высота изображения равна 200, но в другом изображении она может быть другой.
  3. Для многих других моих постов у меня может быть несколько абзацев и/или списков. По крайней мере, мне нужен был способ создать одну строку текста. Возможно, для списков массив был бы наиболее полезен в моем объекте, однако я не уверен, как обращаться к нескольким абзацам.

Я понимаю, что это много объяснений, примеров и рекомендаций, но я действительно ценю вашу помощь! Спасибо!

Рассмотрим handlebarsjs.com

dave_slash_null 08.04.2019 04:49

Проще и чище хранить дату в виде строки даты в формате ISO, а не в виде объекта с отдельными свойствами. Можно получить их, когда вы используете методы Date API и передаете строку iso

charlietfl 08.04.2019 04:51

Также чаще используется массив объектов, где каждый элемент массива представляет собой один пост.

charlietfl 08.04.2019 04:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто делайте это шаг за шагом.

var posts = [ //My object (array of posts)

  { //An example post
    index: 1, //Identifies order of posts: 1 is oldest... >1 newest
    id: "first", //An id for the post
    date: { //Date will be listed next to name on post
      month: 11,
      day: 2,
      year: 2018
    },
    name: "My Post", //Name of the post
    text: "Text for the post...", //Actual Post
    image: 'blogImage.png' //An image for the post
  },
  { //An example post
    index: 2, //Identifies order of posts: 1 is oldest... >1 newest
    id: "first", //An id for the post
    date: { //Date will be listed next to name on post
      month: 11,
      day: 2,
      year: 2018
    },
    name: "My another Post", //Name of the post
    text: "Text for another post...", //Actual Post
    image: 'blogImage.png' //An image for the post
  }
];
const container = document.getElementById('div-posts');
posts.forEach(function(post) {
  let div = document.createElement('div');
  div.className = 'card';
  div.id = 'post_' + post.index; //or post.id provided itis unique
  //create more elements instead of ".innerHTML" if you wish
  div.innerHTML = '<h2>' + post.name + '</h2>' +
    '<h5>' + (new Date(post.date.year, post.date.month, post.date.day).toDateString()) + '</h5>' +
    '<div class = "img"><img src = "/' + post.image + '" ></div>' +
    '<p>' + post.text + '</p>';
  container.appendChild(div);
});
.card {
  border: solid 1px #ccc;
  width: 400px
}

.img img {
  max-width: 100%
}
<div id = "div-posts"></div>

Спасибо! Это сработало прекрасно! Я понял, что это позволяет использовать только один абзац, поэтому я просто превратил переменную text из строки в массив, установив каждый элемент массива в строку каждого абзаца. Затем я вставил цикл for, чтобы добавлять каждый абзац по мере создания поста: for(n = 0; n < post.text.length; n +=1) { div.innerHTML += '<p>' + post.text[n] + '</p>'; }. Это дает больше гибкости в создании как можно большего или меньшего количества текста, как я хочу.

Malmadork 10.04.2019 14:30

Есть ли способ использовать DOM для доступа к идентификатору после его передачи через функцию? Я пытался использовать document.getElementById();, чтобы получить к нему доступ, но это не сработало. Я пытаюсь использовать это для создания элемента холста в моем сообщении. Однако привязка контекста холста к тегу путем вставки "</p><canvas id='canvas'></canvas><p> перед моим текстом только создала элемент, но идентификатор не мог быть связан с ним. Я также попытался вставить его в функцию публикации, чтобы сделать тег холста всякий раз, когда идентифицируется номер индекса. Интересно, знали ли вы, как связать идентификатор с DOM, поскольку раньше это не работало?

Malmadork 11.04.2019 04:39
var c = document.createElement('canvas'); c.id = 'myId'; div.appendChild(c);
Alex Kudryashev 11.04.2019 06:47

Другие вопросы по теме