IE中的HTML解析器问题

35

我正在尝试创建一个对话框,仅在选择的浏览器为IE(任何版本)时才会出现,但是我遇到了这个错误:

消息:HTML解析错误:无法修改子元素关闭之前的父容器元素(KB927917)

所有这些都在“行/字符/代码”0中,因此我不知道错误在哪里。 我使用的代码是:

 <script type="text/javascript"> 
  <!--  
  if(BrowserDetect.browser.contains("Explorer"))
  {     
    var Nachricht = 'Hemos detectado que está utilizando ' + BrowserDetect.browser + ' ' +
  BrowserDetect.version + '. Puede que algunas funciones no estén habilitadas. <p></p> Si desea experimentar todo el potencial del portal, por favor intente desde otro navegador (browser). <p></p>Gracias
 showDialog('¡Aviso Importante!',Nachricht,'warning',10);
 } 
 </script>

我注意到如果我删除“BrowserDetect.browser”和“.version”,就会消除错误,但我需要它们来检查 = /......任何想法都会受到赞赏=)。

9个回答

27

在文档加载过程中(当浏览器还没有“看到”元素的关闭标签时),您正在修改文档。这会在解析器和IE中造成非常棘手的情况,因此不允许这样做。

IE博客对此进行了解释。

解决方法是修改文档中先加载完成并且浏览器已经看到其关闭标签的另一个元素。


顺便说一下:字符串</不允许出现在<script>元素中。请使用<\/,它是JS字符串中的安全等价替代。


9
我曾经遇到过同样的问题。我的问题是在容纳div没有关闭之前调用了Javascript函数。
为了解决这个问题,我把Javascript函数放在jQuery的ready事件处理程序中进行调用:
$(document).ready(function(){
    some_random_javascript_function();
});

1
未来的读者请注意:您实际上不需要使用jQuery来完成这个操作 - 搜索“load”或“DOMReady”事件处理程序即可。 - Yi Jiang
1
如果你要使用jQuery,你可以使用document.ready的简洁语法快捷方式:$(function() {return false;}); - Ian Grainger

7

阅读由porneL链接的文档,我发现了一个简单的解决方法:在脚本中添加参数“defer”,一切都正常工作。

<script defer=true>

3

如Sergey Kirienko所说:使用条件注释。下面的代码将仅在Internet Explorer中执行。Microsoft在此页面上提供了很好的信息。

<!--[if IE]>
<script type="text/javascript"> 
 showDialog('¡Aviso Importante!','message','warning',10);
 </script>
<![endif]-->

如果您想要特定的版本,您也可以进行测试:
<!--[if lte IE 7]>
    <script type="text/javascript"> 
     showDialog('¡Aviso Importante!','Your are using a too old version of Internet explorer. Please upgrade','warning',10);
    </script>
<![endif]-->

3

浏览器嗅探是一种应尽可能避免的折中方案。最好是嗅探你想要使用的功能。比如说,你想使用document.evaluate()来执行XPath表达式,但你不知道它是否被支持。不要嗅探支持的浏览器,而是这样做:

if (document.evaluate) {
    // go ahead and use it
} else {
    // browser doesn't support it; do something else
}

2

0
也许有点晚,但如果您正在使用SWFObject并且有2个具有相同ID的div,则此错误也会弹出。
我有重复的div,[带有id =“flashcontent”,感谢复制和粘贴]。
通过将div重命名为唯一的ID解决。

0

0

在我的一个网站上,https://apis.google.com/js/plusone.js 的当前版本导致了IE8上的一个bug。

最简单的解决方案是删除Google+。

较为简单的解决方案是将代码包装在jQuery的document.ready函数或类似函数中:

$(document).ready(function(){
     var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
     po.src = 'https://apis.google.com/js/plusone.js';
     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接