jQuery.clone () IE проблема - PullRequest
6 голосов
/ 20 мая 2010

У меня есть некоторые, которые используют jQuery.clone (), чтобы получить HTML страницы, а затем добавить его в предварительный тег.Он работает правильно в Firefox и Chrome, но в IE ничего не происходит:

<code><!DOCTYPE html>
<html>
<head>
<script class="jsbin" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<meta charset=utf-8 />
<title>JS Bin</title>
<!--[if IE]>
  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<script>
$(function(){

  $('button').click(function(){
    var $clone = $('html').clone();
    $('#output').text($clone.html());
  });

});
</script>
<style>
  article, aside, figure, footer, header, hgroup, 
  menu, nav, section { display: block; }
</style>
</head>
<body>
  <button>run test</button>
  <pre id="output">

Есть ли какая-либо известная ошибка в IE, которая предотвращает это, или я делаючто-то не так?

(мне нужно клонировать его, потому что перед его выводом я делаю некоторые изменения)

Ответы [ 3 ]

7 голосов
/ 20 мая 2010

Это похоже на работу в IE, Firefox и Safari. Я вызываю javascript DOM API cloneNode() метод вместо jQuery's clone(). Не знаю, почему это работает. Возможно, вам следует провести еще несколько тестов браузера.

var $scripts = $('script');            // Cache all scripts in the document

var html = $('html').get(0).cloneNode(true);  // Clone HTML using DOM API

var $html = $(html);                     // Make jQuery object from cloned HTML

$('script', $html).each(function(i) {       // Loop through scripts in $html
    this.text = $scripts.get(i).innerHTML;  //  replacing content with that
});                                         //  from the cached $scripts

$('#output').empty().text($html.html());    // Append to #output
2 голосов
/ 20 мая 2010

Если вы хотите просто показать текст страницы на странице, попробуйте это:

$('button').click(function(){
  $('#output').empty().html(('<html>\n  ' + $('html').html() + '\n</html>')
     .replace(/&/gm, '&amp;')
     .replace(/</gm, '&lt;')
     .replace(/>/gm, '&gt;')
     .replace(/\r/gm, '')
     .replace(/\n/gm, '<br>')
   );
});

Это работает для меня в Chrome, Firefox и IE8.

1 голос
/ 11 апреля 2013

Я заметил одну большую разницу в том, что делает клон в IE и других. В IE он, кажется, клонирует все, включая теги скрипта. Поэтому, если у вас есть код внутри тега script, который создает экземпляр кода, он будет создан снова. В случае этого вопроса он, вероятно, сталкивается с бесконечным циклом, поскольку он будет постоянно вызывать код для клонирования самого себя.

...