目标是能够单击链接以打开一个新窗口,该窗口显示来自父窗口的格式化源代码。
通过研究,我能够完成大部分任务,但我需要新窗口来完全显示源代码,就像它在父级、缩进和所有内容中一样。目前,HTML 实体被显示为它们的显示对应物(因此它输出实际商标而不是源的™
)。
正如您将在我的示例中看到的那样,我正在考虑遍历一堆实体并进行字符串替换,但我认为逻辑已关闭,我不知道发生了什么。
特别是实体: • (bull), & (amp), ® (reg), ™ (trade), < (lt), > (gt)
这是到目前为止我拥有的超链接启动的代码,对于任何能够弄清楚在第二行输出什么结束正文标签的人(我很难过):
非常感谢您提前提供任何导致解决方案的方向。
function viewSource( e )
{
e.preventDefault( );
var source = '<!DOCTYPE html>' + "\n"
+ '<html xmlns="http://www.w3.org/1999/xhtml">' + "\n\n"
+ "\t" + document.getElementsByTagName( 'html' )[0].innerHTML + "\n\n"
+ '</html>';
entities = [
new Entity( '<', '<' ),
new Entity( '>', '>' )
];
for ( var i = 0; i < entities.length; i++ )
{
var regex = new RegExp( entities[i].entity, 'g' );
source = source.replace( regex, entities[i].html );
}
source = '<pre>' + source + '</pre>';
var sourceWindow = window.open( '', '_blank' );
sourceWindow.document.write( source );
sourceWindow.document.close( );
if ( window.focus )
{
sourceWindow.focus( );
}
}
更新(仍未解开的谜团):
我尝试了使用 AJAX 请求的建议,但它仍然产生相同的结果(第 11 行显示new Entity( '<', '<'),
)。下面是 AJAX 尝试的样子:
function viewSource( e )
{
e.preventDefault( );
var xmlhttp;
if ( window.XMLHttpRequest )
{
// IE7+, Fx, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest( );
}
else
{
// IE6, IE5
xmlhttp = new ActiveXObject( 'Microsoft.XMLHTTP' );
}
xmlhttp.onreadystatechange =
function ( )
{
if ( xmlhttp.readyState == 4 && xmlhttp.status == 200 )
{
var source = xmlhttp.responseText.replace( /</g, '<' ).replace( />/g, '>' );
source = '<pre>' + source + '</pre>';
var sourceWindow = window.open( '', '_blank' );
sourceWindow.document.write( source );
sourceWindow.document.close( );
if ( window.focus )
{
sourceWindow.focus( );
}
}
};
xmlhttp.open( 'GET', '/', true );
xmlhttp.send( );
}