JavaScript,目标:显示准确的源代码
目标是能够单击链接以打开一个新窗口,显示父窗口中的格式化源代码 通过研究,我能够完成大部分任务,但我需要一个新窗口来显示源代码,就像在父窗口、缩进窗口和所有窗口中一样。目前,HTML实体显示为其显示对应项,因此它输出实际商标,而不是源的&trade 我想通过一堆实体循环并进行字符串替换,正如您在我的示例中所看到的,但我认为逻辑是错误的,我不知道发生了什么 特别是实体:•bull,&;reg,™ 贸易,JavaScript,目标:显示准确的源代码,javascript,encoding,html-entities,formatted-text,Javascript,Encoding,Html Entities,Formatted Text,目标是能够单击链接以打开一个新窗口,显示父窗口中的格式化源代码 通过研究,我能够完成大部分任务,但我需要一个新窗口来显示源代码,就像在父窗口、缩进窗口和所有窗口中一样。目前,HTML实体显示为其显示对应项,因此它输出实际商标,而不是源的&trade 我想通过一堆实体循环并进行字符串替换,正如您在我的示例中所看到的,但我认为逻辑是错误的,我不知道发生了什么 特别是实体:•bull,&;reg,™ 贸易,gt 这是我到目前为止发布的超级链接代码,对于任何能够在第二行中找出结束正文标记输出内容的
我尝试了使用AJAX请求的建议,但仍然会产生相同的结果,第11行显示新实体“您没有正确地转义源代码。 您应该使用源代码的文本表示构建DOM元素 使用jQuery:
[tab]
</body>
</html>
所以,感谢所有方向的@SLaks。我能够实现接近我想要的,但仍然有一些小怪癖,我可能不得不接受。我特别尝试避免使用任何库,比如jQuery 仍在讨论的问题如下: -输出源显示的是无最后斜杠的自动关闭标记。因此,例如,显示为。 -出于某种原因,正在将结束正文标记包装到下面的行。它应该呈现为:
function htmlEntity( character )
{
switch ( character.charCodeAt( 0 ) )
{
case 174: return '®'; break;
case 233: return 'é'; break;
case 8211: return '–'; break;
case 8220: return '“'; break;
case 8221: return '”'; break;
case 8226: return '•'; break;
case 8482: return '™'; break;
default: return character;
}
if ( character.charCodeAt( 0 ) > 127 )
{
return '&#' + character.charCodeAt( 0 ) + ';';
}
return character;
}
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>';
var entities = [ '®' ];
for ( i = 0; i < entities.length; i++ )
{
source.replace( entities[i], htmlEntity( entities[i] ) );
}
var temp = '';
for ( i = 0; i < source.length; i++ )
{
temp += htmlEntity( source.charAt( i ) );
}
var pre = document.createElement( 'pre' );
pre.textContent = temp;
source = '<pre>' + pre.innerHTML + '</pre>';
var sourceWindow = window.open( '', '_blank' );
sourceWindow.document.write( source );
sourceWindow.document.close( );
if ( window.focus )
{
sourceWindow.focus( );
}
}
但是,它呈现为:
尽管如此,我仍然对结果感到满意,这应该足够了。但是,如果任何人有任何更好的解决方案,不需要第三方库,那将不胜感激。以下是最新的尝试:
您想要当前的DOM源还是服务器的原始源?我猜是当前的DOM源。这是一个直接的HTML页面,因此没有呈现服务器端代码,也没有可用的解决方案。DOM源代码不区分实体及其字符。嗯,我可能有点困惑。例如,在上面代码的第11行,如果我通过上下文菜单查看一个实际的源代码,它会像上面那样显示。这个JavaScriput输出窗口将其显示为新实体的视图源,显示来自服务器的原始源,而不是DOM的当前状态。如果你想要,你可以使用AJAX。为什么使用jQuery而不使用sane DOM?@Zirak:因为我太懒了,无法查找textContent和innerText。然后创建一个新的文本节点并将其添加到元素中。你是对的;我没想到。但是,jQuery仍然较短。请随意添加一个答案,因为所有女士都知道,尺寸并不重要——性能和清晰度是女士现在可能已经知道的后者。但我不会重复你的答案,我用我的小眼睛在你的循环中发现了一个隐式全局变量I
$('<pre />').text(source).appendTo(document.body);
</body>
</html>
[tab]
</body>
</html>
function htmlEntity( character )
{
switch ( character.charCodeAt( 0 ) )
{
case 174: return '®'; break;
case 233: return 'é'; break;
case 8211: return '–'; break;
case 8220: return '“'; break;
case 8221: return '”'; break;
case 8226: return '•'; break;
case 8482: return '™'; break;
default: return character;
}
if ( character.charCodeAt( 0 ) > 127 )
{
return '&#' + character.charCodeAt( 0 ) + ';';
}
return character;
}
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>';
var entities = [ '®' ];
for ( i = 0; i < entities.length; i++ )
{
source.replace( entities[i], htmlEntity( entities[i] ) );
}
var temp = '';
for ( i = 0; i < source.length; i++ )
{
temp += htmlEntity( source.charAt( i ) );
}
var pre = document.createElement( 'pre' );
pre.textContent = temp;
source = '<pre>' + pre.innerHTML + '</pre>';
var sourceWindow = window.open( '', '_blank' );
sourceWindow.document.write( source );
sourceWindow.document.close( );
if ( window.focus )
{
sourceWindow.focus( );
}
}