IE appendChild из массива не работает

У меня есть особенность истории для конкретного div на моем сайте. До сих пор все работало нормально, я вставлял HTML как строки из javascript и заново отображал их с помощью.innerHTML. Теперь я пытаюсь очистить javascript от всех строк HTML, и у меня есть эта проблема: просмотр истории div работает в FF, Chrome и некоторых других, но не в IE (8-11), не могу понять, почему. Это cloneNode() или проблема с ссылками, которую я не вижу?

Ниже приведен небольшой скрипт для воспроизведения поведения, с которым вы можете поиграть здесь: http://jsfiddle.net/yvecai/7e8tksm3/

Мой код работает следующим образом: каждый раз, когда я отображаю что-то в Mydiv, я клонирую его и добавляю в массив.

Функция prev() или next() добавляет соответствующие узлы из массива для отображения.

Сценарий сначала создает 5 содержимого '1' ... '5', которое пользователь может отобразить с помощью функций prev() и next(). В IE, когда вы идете prev(), затем next(), отображаются только первая и последняя записи. В других браузерах проблем нет.

var cache = [];
var i = 0;

function next() {
  var hist = document.getElementById('history');
  i += 1;
  if (i > 4) {
    i = 4
  };
  hist.innerHTML = '';
  hist.appendChild(cache[i]);
}

function prev() {
  var hist = document.getElementById('history');
  i -= 1;
  if (i < 0) {
    i = 0
  };
  hist.innerHTML = '';
  hist.appendChild(cache[i]);
}

function cacheInHistory(div) {
  cache.push(div.cloneNode(true));
}

function populate() {
  for (i = 0; i < 5; i++) {
    var hist = document.getElementById('history');
    hist.innerHTML = '';

    var Mydiv = document.createElement('div');
    Mydiv.innerHTML = i;
    hist.appendChild(Mydiv);
    cacheInHistory(Mydiv);
  }
  i = 4
}

1 ответ

Я попытался упростить ваш код:

В функции заполнить (onload) создать и заполнить массив кешем. В качестве последней операции добавьте вашего ребенка.

В вашей следующей или предыдущей функции используйте replaceChild вместо добавления и удаления innerHTML.

var cache=[];
var i = 0;

function next(){
  var hist = document.getElementById('history');
  i = (++i > 4) ? 4 : i;
  hist.replaceChild(cache[i], hist.children[0]);
}
function prev(){
  var hist = document.getElementById('history');
  i = (--i < 0) ? 0 : i;
  hist.replaceChild(cache[i], hist.children[0]);
}

function cacheInHistory(div){
  cache.push(div.cloneNode(true));
}
function populate(){
  var hist = document.getElementById('history');
  for (i=0 ; i<5 ; i++){
    hist.innerHTML='';

    var Mydiv = document.createElement('div');
    Mydiv.innerHTML = i;
    cacheInHistory(Mydiv);
  }
  i = 4
  hist.appendChild(cache[i]);
}
<body onload="populate();">
<div id="prev" onclick="prev()">
    prev
</div>
<div id="next" onclick="next()">
    next
</div>
<hr/>
<div id="history">
</div>
</body>

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