Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery.clone() IE problem

I'm have some that uses jQuery.clone() to get the html of a page and then add it to a pre tag. It works correctly in Firefox and Chrome, but nothing happens in IE:

<!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"></pre>
</body>
</html>

Is there any know bug with IE that prevents this, or am I doing something wrong?

(I need to clone it because I'm doing some changes to it before outputting it)

like image 773
Sindre Sorhus Avatar asked May 20 '10 13:05

Sindre Sorhus


3 Answers

This seems to work in IE, Firefox & Safari. I'm calling the javascript DOM API cloneNode() method instead of jQuery's clone(). Don't know why it works. You should probably do some more browser testing.

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
like image 180
user113716 Avatar answered Nov 15 '22 12:11

user113716


If you want to just show the page text in the page, try this:

$('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>')
   );
});

That works for me in Chrome, Firefox, and IE8.

like image 33
Pointy Avatar answered Nov 15 '22 12:11

Pointy


I have noticed one big difference in what clone does in IE and others. In IE, it appears to clone everything, including script tags. Therefore if you have code inside the script tag that instantiates code, it will be instantiated again. In the case of this question it is probably encountering an infinite loop since it will continually call the code to clone itself.

like image 2
Apocalypse Avatar answered Nov 15 '22 11:11

Apocalypse