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)
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
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, '&')
.replace(/</gm, '<')
.replace(/>/gm, '>')
.replace(/\r/gm, '')
.replace(/\n/gm, '<br>')
);
});
That works for me in Chrome, Firefox, and IE8.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With