Как изменить HTML в массиве?

277
06 апреля 2017, 20:13

Формирую данные с сервера динамически и храню промежуточные данные задачи в массиве примерно в таком виде.

<div class="text">Задача раз</div>
<div class="date">Сегодня</div>
<div class="acept">Готово</div>

Код с помощью которого формирую данные

function getAndRenderTasks(){
$.getJSON("/tasks/api/v1.0/tasks",  function (data) {
var tasks = [] // Место хранения всех задач
$.each( data, function(key, val) { 
    var taskData = [] // промежуточные данные
    for (var i = 0; i < val.length; i++) { 
        $.each(val[i], function(key1, val1){ 
            taskData.push( "<div class='"+key1+"'>"+val1+"</div>") 
        })
    }
    tasks.push( "<div taskId='"+key+"'>"+taskData.join('')+"</div><hr>") 
})
$( "<div/>", { 
    "class": "my-new-list",
    html: tasks.join("")
  }).appendTo( "body")
})
}

Проблема в том, что прежде чем отрендерить список задач мне необходимо в некоторые из div задачи, добавить еще данные, типа ссылок, иконок и так далее... как мне сделать это с помощью js что бы получилось что то типа:

<div class="t$event.id">
    <div class="event-text acept">
        <a alt="Редактировать"
          title="Редактировать" href="/editevent/1">
          <i class="edit icon"></i></a>
    </div>
    <div class="event-details">
            <i class="info icon"></i>$event.details
    </div>
    <div class="event-time">
        <i class="wait icon"></i>
       23:33-23:45
         <a class="close-task"
             eventid="$event.id"
             alt="Отметить как выполненное"
             title="Отметить как выполненное"
             href="#">
             <i class="checkmark box icon"></i>
         </a>
         <a class="move-to-next-date"
            eventid="$event.id"
            alt="Перенести на завтра"
            title="Перенести на завтра"
            href="#">
            <i class="external share icon"></i>
         </a>
         <a class="delete-task"
            eventid="$event.id"
            alt="Удалить"
            title="Удалить"
            href="#">
             <i class="remove circle icon"></i>
         </a>
    </div>
    <hr>
</div>

Буду очень благодарна

Answer 1

Если я правильно понял задачу, то вот так:

function getAndRenderTasks() {
  $.getJSON("/tasks/api/v1.0/tasks", function(data) {
    var tasks = [] // Место хранения всех задач
    $.each(data, function(key, val) {
      var taskData = [] // промежуточные данные
      for (var i = 0; i < val.length; i++) {
        $.each(val[i], function(key1, val1) {
          var $elem = $("<div class='" + key1 + "'>" + val1 + "</div>");
          // Изменяете в элементе что нужно
          taskData.push( $elem.get(0).outerHTML );
        })
      }
      var $task = $("<div taskId='" + key + "'>" + taskData.join('') + "</div><hr>");
      // Изменяете в элементе что нужно
      tasks.push( $task.get(0).outerHTML );
    })
    $("<div/>", {
      "class": "my-new-list",
      html: tasks.join("")
    }).appendTo("body")
  })
}
Answer 2

На самом деле вопрос скорее обширный, нежели наоборот. Потому что есть много способов сделать то, что вы хотите. Если я правильно понял чего вы хотите))

1. Способ: создавать элементы на лету, добавлять в них необходимые атрибуты и вставлять уже их в родительские элементы

В примере ниже создается ссылка, добавляется к ней заголовок, href и добавляется через appendChild (это на чистом js. Для jquery будет скорее всего append) в body.

var a = document.createElement('a'); 
var linkText = document.createTextNode("my title text"); 
a.appendChild(linkText); 
a.title = "my title text"; 
a.href = "http://example.com"; 
 
document.body.appendChild(a);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div id="div1"></div>

А так добавили в див..

var mydiv = document.getElementById("myDiv"); 
var aTag = document.createElement('a'); 
aTag.setAttribute('href',"yourlink.htm"); 
aTag.innerHTML = "link text"; 
mydiv.appendChild(aTag);
<div id="myDiv"></div>

Так можно создавать и добавить узлы друг в друга, сделать это в цикле: создать одну общую переменную и добавлять в нёё всё и затем эту финальную переменную добавить в шаблон

2. Способ (из него будет следовать 3 способ): Заводить строковую переменную, в неё складывать все данные, которые есть в цикле (включая атрибуты элементов и прочее) и затем добавить всё это в шаблон:

var content = ''; // это накопительная переменная 
 
for (var i = 0; i < 3; ++i) { 
 
  var div = '<div class="key' + i + '">' + getLink(i) + ' divval="' + i + '"</div>'; 
  content += div; 
} 
 
$('#content').html(content); 
 
 
function getLink(event_id) { 
  return '<a class="close-task"' + 
             'eventid="' + event_id + '"' + 
             'alt="Отметить как выполненное"' + 
             'title="Отметить как выполненное"' + 
             'href="#">Ссылка № ' + event_id + 
             '<i class="checkmark box icon"></i>' + 
         '</a>'; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div id="content"><div>

Смысл состоит в том, чтобы разбить код на составные куски (на те, из чего состоит генерируемый блок) и дальше по кусочкам их генерировать и вставлять в один основной блок и далее уже в шаблон.

3. Способ - использовать шаблонизаторы, например Handlebars.js или mustache.js или много других. Смысл их, в принципе, вытекает из способа №2, когда у вас есть готовые шаблоны, которые будут вставляться в определенные блоки и затем вставляться в основной шаблон, при этом не захламляя сам скрипт такими "строковыми накоплениями"

READ ALSO
Dota 2 API ошибка &ldquo;Uncaught SyntaxError: Unexpected token&rdquo;

Dota 2 API ошибка “Uncaught SyntaxError: Unexpected token”

В проекте использую AngularJS, серверного кода не использую, только Front-End

330
Вирус на WordPress, редиректит на рекламу

Вирус на WordPress, редиректит на рекламу

Добрый деньОбратился хороший знакомый, попросил убрать вирус с его сайта, не знаю как он туда попал

341
Как ограничить rotation объекта в three.js?

Как ограничить rotation объекта в three.js?

Я загрузил и вывел объект, подключил управление с помощью trackballcontrols

194
Не работает часть программы в javascript

Не работает часть программы в javascript

alert(d / c) не работает, выводит белый экран

205