2016-03-01 51 views
-4

我看到在https://itunesconnect.apple.com登录页面怪脚本:IE和奇怪的评论行为:为什么要为IE打开两次评论?

<script> 
    //Some js 
    <!-- 
    if(navigator.appVersion.indexOf('MSIE')>=0)document.write(unescape('%3C')+'\!-'+'-') 
    //--></script> 
    <noscript>Some text<noscript> 

据我了解,IE浏览器是这样的:

<script> 
    //Some js 
    <!-- 
    <!-- 
    //--></script> 
    <noscript>Some text<noscript> 

,并对其他人来说是这样的:

<script> 
    //Some js 
    <!-- 
    //--></script> 
    <noscript>Some text<noscript> 

但是目的是什么? (这个问题是关于双“<! - - ”而不是noscript标签) 为什么在IE的脚本标签中打开两次HTML注释?

+0

这可能值得您阅读:https://developer.mozilla.org/en/docs/Web/HTML/Element/noscript –

+0

对不起,我应该指定问题不是关于该标记。 (但也许这个标签是相关的,) – Tom

+0

'%3c' - >'<'... –

回答

1

document.write在之后立即添加它的参数它被调用的脚本标签,而不是在标签中。

在您的示例中,在script标记之后立即放置起始注释标记,可以使页面上标记的所有其余部分对通过if条件的浏览器不可见。即该页面的其余部分将被视为评论。产生的代码看起来是这样的:

<script> 
    //Some js 
    <!-- 
    if(navigator.appVersion.indexOf('MSIE')>=0)document.write(unescape('%3C')+'\!-'+'-') 
    //--> 
</script> 
<!--<noscript>Some text<noscript> 
<p>All the markup in this page will be a part of the comment in IE, if JS is enabled.</p> 

在你发现这个页面,唯一的目的似乎是隐藏的脚本后,noscript标签。但是,在页面被解析之后,它将有效地隐藏在带有JS的noscript之后附加到body之后的所有元素。

+0

是的!它可能与IE8中的该错误有关(即使JavaScript已启用,样式化的noscript也有副作用):http://mottr.am/2009/11/30/ie8-noscript-bug-fix/(我让你更新你的回答在我验证它之前) – Tom

+0

如果我没有记错的话,它在页面的末尾,所以它只会禁用脚本,如果JavaScript打开。如果javascript关闭,javascript不会被执行;)所以它不会隐藏无脚本元素 – Tom

+1

@Tom我快速浏览了Apple页面上的标记。该标签似乎只隐藏'noscript'(并且结束'body'和'html',创建基本无效的HTML)。看起来它真的只在IE8的错误页面上,尽管这是一个糟糕的黑客攻击。 IE也有其他的错误,例如。在X-UA meta之前定义DTD的样式标签。另请参阅我对安德鲁答案的评论(对不起,错别字)。 – Teemu

1

这是没有必要打开评论的两倍。 (第二开口标记实际上被视为注释身体的一部分),据微软开发者网络和它们所提供的documentation,标准的HTML注释的风格:

<!-- 
Insert HTML comment here. 
--> 

条件注释也支持用在下面的样式使用括号:

<!--[if expression]> 
HTML 
<![endif]--> 

<![if expression]> 
HTML 
<![endif]> 

更新

回来时,客户端脚本是新的浏览器,旧的浏览器可能不支持了正在使用的脚本。如果浏览器无法识别该脚本,则该脚本将以文本形式打印出来,因此需要采取一种解决方法,以防止旧浏览器将脚本打印为网页上的文本。该页面底部的注释从您提供的链接中可以看出,这些解决方法之一是防止脚本打印的一个示例。

<!-- 
    script here 
//--> 

如果脚本是由浏览器的支持,然后<!--将被解释为单行注释,并//-->也将是一个单行注释,因为//开始在一个单行注释脚本。否则,如果脚本是由浏览器不支持,那么//不会被解释为注释的脚本中(浏览器会认为这只是普通文本),所以<!-- ... // -->会被理解为一个多行注释。这样,如果浏览器支持脚本,它将被读作脚本,否则,它只会被注释掉。

+0

是的。但有人花时间为IE写了特定的js,它困扰着我:为什么? (全面披露:我在苹果网站上看到它) – Tom

+2

您能提供一个链接到您看到它的页面吗? – Andrew

+0

你可以在登录页面的底部看到它https://itunesconnect.apple.com – Tom