Проблема с парсером HTML в IE - PullRequest
35 голосов
/ 19 ноября 2008

Я пытаюсь создать диалоговое окно, которое будет появляться, только если выбран браузер IE (любая версия), однако я получаю эту ошибку:

Сообщение: ошибка синтаксического анализа HTML: невозможно изменить родительский элемент контейнера до закрытия дочернего элемента (KB927917)

Это все в «Line / Char / Code» 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 голосов
/ 20 ноября 2008

Вы изменяете документ во время его загрузки (когда браузер не «увидел» закрывающий тег для этого элемента). Это вызывает очень сложную ситуацию в парсере, и в IE это не разрешено.

IE блог имеет объяснение этого.

Решение состоит в том, чтобы изменить другой элемент, который был ранее в документе и был загружен полностью (где браузер уже видел закрывающий тег для него).


Кстати: строка </ не допускается в элементе <script>. Используйте <\/, который является безопасным эквивалентом в строках JS.

9 голосов
/ 18 июня 2009

У меня была такая же проблема. Моя проблема заключалась в том, что я вызывал функцию Javascript, прежде чем содержащий div был закрыт.

Чтобы устранить проблему, я вызываю функцию Javascript в обработчике событий jQuery ready:

$(document).ready(function(){
    some_random_javascript_function();
});
7 голосов
/ 30 сентября 2010

Читая doc , связанный с помощью porneL, я нашел простое решение этой проблемы: добавив параметр 'defer' в скрипт, все работает нормально.

<script defer=true>
3 голосов
/ 19 ноября 2008

Обнюхивание браузера - это помеха, которую следует избегать, когда это возможно. Лучше всего понюхать возможность , которую вы хотите использовать. Допустим, вы хотите выполнить выражение XPath с помощью document.evaluate (), но не знаете, поддерживается ли оно. Вместо того, чтобы прослушивать поддерживаемые браузеры, сделайте следующее:

if (document.evaluate) {
    // go ahead and use it
} else {
    // browser doesn't support it; do something else
}
3 голосов
/ 19 ноября 2008

Как сказал Сергей Кириенко: используйте условные комментарии. Код ниже будет выполняться только через 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]-->
2 голосов
/ 19 ноября 2008

Лучшим способом решения IE являются условные комментарии Вам даже не нужно использовать JavaScript. См. Например http://www.positioniseverything.net/articles/ie7-dehacker.html.

0 голосов
/ 25 ноября 2013

Текущая версия https://apis.google.com/js/plusone.js вызвала эту ошибку в IE8 на одном из моих сайтов.

Самое простое решение - удалить Google +.

Простое решение - оберните код в документ jquery.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);
});
0 голосов
/ 26 ноября 2012

JavaScript очень легко работает с navigator.appName. (см. http://de.selfhtml.org/javascript/objekte/navigator.htm) Вы можете создать if-запрос с этим. Очень просто, просто попробуйте!

0 голосов
/ 25 мая 2010

Возможно, немного поздно, но эта ошибка также появляется, если вы используете SWFObject и имеете 2 делителя с одинаковым идентификатором.

У меня были повторяющиеся div, [с id = "flashcontent", спасибо copy & paste].

Решено путем переименования div с уникальными идентификаторами.

...