Клонирование элементов HTML5 в IE 6-8. Кто придумает как обойти баг?

Приятного времени суток.


Обнаружил своеобразный баг.

После добавления

<!--[if lt IE 9]>
		<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
		<![endif]-->



HTML5 элементы в IE 6-8 отображаются нормально.

Но если клонировать узел с HTML5 элементами c помощью .cloneNode(true) или jQuery .clone(true), то все HTML5 элементы будут потеряны.

Как показывает .innerHTML клонированного узла, превращается в <:nav></:nav>.

Если почистить innerHTML с помощью регулярного выражения… элементы просто исчезают без следа.


Есть ли идеи, как можно обойти этот баг, не создавая поэлементно достаточно сложную иерархию узлов?


С уважением и надеждой на ответ.
  • Вопрос задан
  • 7345 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Serator
Немного поигрался в IE8 и нашел решение. Для тех, кто не понял, выложу пример за автора (который то ли поленился, то ли...). Разумеется без jQuery :)

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Sample</title>
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body>
<nav class="demo">
1
</nav>
<div>
2
</div>
<script>
document.querySelector('body').appendChild(document.querySelector('nav').cloneNode(true));
console.log(document.querySelectorAll('nav')[1]);
document.querySelector('body').appendChild(document.querySelector('div').cloneNode(true));
console.log(document.querySelectorAll('div')[1]);
</script>
</body>
</html>


В итоге в консоли видим:

ЖУРНАЛ: undefined
ЖУРНАЛ: [object HTMLDivElement]

Если ie не хочет по хорошему, то мочим его его же оружием:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Sample</title>
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body>
<nav class="demo">
1
</nav>
<div>
2
</div>
<script>
document.querySelector('body').innerHTML+=document.querySelector('nav').outerHTML;
console.log(document.querySelectorAll('nav')[1]);
document.querySelector('body').appendChild(document.querySelector('div').cloneNode(true));
console.log(document.querySelectorAll('div')[1]);
</script>
</body>
</html>


В консоли видим:

ЖУРНАЛ: [object HTMLGenericElement]
ЖУРНАЛ: [object HTMLDivElement]

P.S. На будущее выкладывайте готовые примеры без всяких jQuery и прочих хрени.
Ответ написан
@Serator
ie6:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Sample</title>
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body>
<nav class="demo">
1
</nav>
<div>
2
</div>
<script>
document.body.innerHTML+=document.getElementsByTagName('nav')[0].outerHTML;
alert(document.getElementsByTagName('nav')[1]);
document.body.appendChild(document.getElementsByTagName('div')[0].cloneNode(true));
alert(document.getElementsByTagName('div')[1]);
</script>
</body>
</html>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы