2013-05-21 14 views
0

我有需要显示代码文件的iframe。代码文件具有.txt扩展名,并且应该只将代码显示为文本。这适用于除IE8以外的所有浏览器。 IE8不断将代码文件呈现为HTML。IE8 iframe呈现简单的文本文件为HTML,我需要原始代码

<iframe id="codeFile222" 
    width="100%" height="200px" 
    marginheight="0" frameborder="0" 
    src="http://mrsbos.wikispaces.com/file/view/guessNumber.txt" 
    name="codeFile222" 
    onload="autoResize('codeFile222');changeColor('codeFile222')" 
    > 

任何想法,我能做到这一点,也使其在IE8

+4

什么是来自您的Web服务器的“Content-Type”标头值?这决定了浏览器应该如何显示资源。 – Brad

+0

嗨,我如何知道内容类型是什么?我可以改变这个吗?顺便说一句,它没有像Chrome和Firefox这样的其他浏览器的问题。他们可以拥有不同的内容类型吗? – Jenita

+0

参见Ken的答案。正如他所建议的那样,Fiddler是一个很好的工具,他提供了一个解释,为什么它在这种情况下可能无关紧要。 – Brad

回答

0

Content-Type HTTP标头指示资源(网页,图像或下载)的MIME type。对于HTML页面,MIME类型通常为text/html,对于文本文件,通常是text/plain

服务器不发送text/plain;charset=utf-8为您的文本文件(如,例如,在Firebug的网板进行使用按Ctrl + F5 一个文件的硬性重新加载时显示)。但是,与其他Web浏览器不同,Internet Explorer将在文件中看到HTML,并猜测服务器(Microsoft documentation)。

因为这可能会带来安全隐患,但Microsoft不希望冒险破坏与旧网站的向后兼容性(通过使IE的行为与其他浏览器的行为一致),Internet Explorer 8和更高版本支持X-Content-Type-Options: nosniff标头以禁用在这种情况下的HTML检测。但是,在Wikispaces这样的站点上,您可能无法选择发送标题,并且在任何情况下,标题在Internet Explorer 6和7中都不起作用。

在Wikispaces上,它可能有意义使用所提供的源代码格式设置功能(见wikitext help page):

[[code format="javascript"]] 
alert('hello, world'); 
[[code]] 

如果你想将代码存储在单独的页面上,你可以从人们真的应该阅读页面包括它(Wikispaces include help page) 。这就是所谓的transclusion

[[include page="PAGENAME"]] 

做不到这一点,一个很好的选择可能是HTML转义代码(使用一些文本替换)和<pre></pre>之间插入。然后你将上传一个HTML文件(文件扩展名为.htm.html)。为了解释的目的,这里是一个简单的JavaScript函数,它HTML转义:

function htmlEscape(text) { 
    // Absolutely necessary 
    text = text.replace(/&/g, '&amp;'); // Has to go first 
    text = text.replace(/</g, '&lt;'); 

    // Not needed for your specific case, yet would be good to include 
    text = text.replace(/>/g, '&gt;'); 
    text = text.replace(/"/g, '&quot;'); 
    text = text.replace(/'/g, '&#39;'); // '&apos;' is only OK in XHTML and in HTML5 
    return text; 
} 
+0

turnToText2 = function(id){ if(window.XMLHttpRequest && document.all){ var text = null; var obj =文件。的getElementById(ID); var y = null; y =(obj.contentDocument || obj.contentWindow); var head = y.getElementsByTagName('head')[0]; var texth = head.innerHTML; console.log(“head:”+ head); console.log(“texth:”+ texth); text = y.body.innerHTML; text = texth + text; console.log(“text:”+ text); while(text.indexOf(“<”)!= - 1){ text = text.replace(“<”,“<”); } 而(!text.indexOf( “>”)= - 1){ 文本= text.replace( “>”, “>”); } if(y!= null)y.body.innerHTML = text; } } else { console.log(“NOT IE:”); } } – Jenita

+0

嗨,感谢您的帮助。我现在已经使用了像你所建议的turnToText功能。起初结果只是以纯文本显示HTML标签,而不是脚本。很显然,浏览器已经将脚本标签及其内容放在标签中。所以我可以将它们从那里拉出来,并将它们添加到代码的其余部分。我的功能现在看起来像这样。我只需要在非白人休息空间换行等 – Jenita

+0

非常感谢 加入顺便给结果的更好的布局,我也将利用在wikispaces代码标签,因为它并提高清晰度的不同颜色。所以谢谢你。我也很喜欢切换的效果,我可以用我自己的超链接和iframe中的创造,所以我想这对所有的浏览器作为well.Thanks很多,请参阅下面的我适当的反应。 – Jenita

1

您提供的链接(mrsbos.wikispaces.com/file/view/guessNumber.txt)的工作文字/平原作为内容类型,这样就可以。

要查找的内容类型是什么,你可以用Fiddler或只需右键单击页面,选择页面信息或类似的东西(取决于浏览器)。

我的猜测是,IE浏览器试图聪明地自动检测的内容,看到一个<script>标签,并假设它是HTML。

在这些情况下,您将不得不对内容进行编码,如有可能,还可以在源代码为<pre> -tags的服务器上提供html页面。

0

这个问题已经存在了一段时间,可惜的是没有真正合适的修补程序。有一件事可能会发挥作用,将iframe中的所有内容都包含在使用Javascript的<pre>标记中,但这有些破绽。

有在www.howtocreate.co.uk对这个问题的详细信息,我将重现这里的文章正文:

虽然我们对内容类型HTTP标头的主题,XHTML是 不是唯一一个IE错误。它甚至不正确地处理纯文本 。如果您发送的标题表明您正在使用纯文本,但它包含的东西IE认为是HTML,它将忽略 您的标题,并将其呈现为HTML。因此,您仔细准备的文本文件会被转换为 几乎无法读取的入门段落,并且丢失了某些位并丢失了格式。

他们为什么要这样做?因为偶尔,HTML页面不正确地被网页服务器作为纯文本服务器 。如果发生这种情况,这将使IE浏览器将其呈现为HTML格式。这听起来像一个好主意,但是这是什么 意味着作家谁使这些网页都没有意识到,他们的 页被错误地被服务的文字,因为当他们检查 在IE浏览器,它看起来是工作。使用页面指定的内容类型正确遵守 的浏览器将看到页面源 而不是其内容。而且,这意味着许多文本文件被错误地修改为 ,因为IE认为它们是HTML。

无论哪种方式,有人失去了。但是,如果IE没有忽略文本 内容类型标题,作者会意识到存在问题,而 修复服务器。该页面可以在所有浏览器中使用,并且IE 不会搞砸文本文件。

+0

嗨,谢谢你为什么和如何解释。至少现在在某种程度上是有道理的。无论如何,我很高兴探险家10没有这个问题。 – Jenita

0

我现在已经使用了turnToText功能像你的建议。起初结果只是以纯文本显示HTML标签,而不是脚本。显然,浏览器已经将脚本标签及其内容放在头标签中。所以我可以将它们从那里拉出来,并将它们添加到代码的其余部分。我的功能现在看起来像这样。我只需要在非白人休息空间换行等加入

turnToText2=function(id){ 
    if(window.XMLHttpRequest && document.all){ 

    var text=null; 
    var obj=document.getElementById(id); 
    var y=null; 

    y=(obj.contentDocument|| obj.contentWindow); 


    var head =y.getElementsByTagName('head')[0]; 
    var texth=head.innerHTML; 

    text=y.body.innerHTML; 
    text=texth+text; 

    while(text.indexOf("<")!=-1){ 
    text=text.replace("<","&lt;"); 
    } 
    while(text.indexOf(">")!=-1){ 
     text=text.replace(">","&gt;"); 
    } 

    if(y!=null){ 
    y.body.innerHTML=text; 
    } 

    } else{ 
    console.log("NOT IE:"); 
    } 
    } 

非常感谢

顺便给结果的更好的布局,我也将利用代码标签的wikispaces,因为它确实提高了不同颜色的清晰度。所以谢谢你。我也喜欢切换效果,我可以用我自己的超链接和iframe创建,所以我希望它能够在所有浏览器上运行。