Проблема с парсером HTML в IE

Я пытаюсь создать диалоговое окно, которое будет отображаться только в том случае, если выбран браузер 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, это устранит ошибку, но мне нужно их проверить =/... любые идеи будут оценены =).


person Tsundoku    schedule 19.11.2008    source источник


Ответы (9)


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

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

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


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

person Kornel    schedule 20.11.2008

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

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

$(document).ready(function(){
    some_random_javascript_function();
});
person Community    schedule 17.06.2009
comment
Примечание для будущих читателей: на самом деле вам не нужен jQuery для этого — выполните поиск обработчиков событий load или DOMReady. - person Yi Jiang; 05.10.2010
comment
Если вы собираетесь использовать jQuery, вы можете использовать красивое сокращение синтаксиса для document.ready: $(function() {return false;}); - person Ian Grainger; 27.10.2010

Чтение документа связанный porneL, я нашел простой обходной путь для этой проблемы: добавление параметра «отложить» в сценарий, все работает нормально.

<script defer=true>
person Pablo Alba    schedule 30.09.2010

Как сказал Сергей Кириенко: используйте условные комментарии. Приведенный ниже код будет выполняться только 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]-->
person some    schedule 19.11.2008

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

if (document.evaluate) {
    // go ahead and use it
} else {
    // browser doesn't support it; do something else
}
person Robert J. Walker    schedule 19.11.2008

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

person Community    schedule 19.11.2008

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

У меня были дубликаты div [с id="flashcontent", благодаря копированию и вставке].

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

person robasta    schedule 25.05.2010

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

person David    schedule 26.11.2012

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

Самое простое решение - удалить 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);
});
person Apeli    schedule 24.11.2013