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

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

Message: HTML Parsing Error: Unable to modify the parent container element before the child element is closed (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, это удалит ошибку, но они мне нужны для проверки = / ... любые идеи будут оценены =).

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
35
0
75 231
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

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

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

if (document.evaluate) {
    // go ahead and use it
} else {
    // browser doesn't support it; do something else
}
Ответ принят как подходящий

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

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

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


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

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

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

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

Примечание для будущих читателей: вам на самом деле не нужен jQuery для этого - выполните поиск обработчиков событий load или DOMReady.

Yi Jiang 05.10.2010 06:37

Если вы собираетесь использовать jQuery, вы можете использовать удобное сокращение синтаксиса для document.ready: $ (function () {return false;});

Ian Grainger 27.10.2010 18:47

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

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

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

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

<script defer=true>

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

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

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

Простое решение - оберните код в jquery document.ready -function или аналогичный:

$(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);
});

Другие вопросы по теме