Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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


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

Ответ 2

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

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

$(document).ready(function(){
    some_random_javascript_function();
});

Ответ 3

Считывая doc, связанный с porneL, я нашел простую обходную проблему для этой проблемы: добавив параметр 'defer' в script, все работает нормально.

<script defer=true>

Ответ 4

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

Ответ 5

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

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

Ответ 7

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

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

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

Ответ 9

Текущая версия 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);
});