Почему следующий способ создания элементов DOM не работает с jQuery в IE7 и IE8? - PullRequest
3 голосов
/ 09 сентября 2011

Иногда полезно создавать элементы DOM в виде объектов jQuery для использования в качестве селекторов и контекста.

Следующее работает в и IE7, IE8 и во всех других браузерах, использующих jQuery 1.6.2 / 3 - но обратите внимание, что document.createElement используется для этой работы. В IE7 и IE8.

   jQuery('body').append('<div id="basic-render-test"> </div>');

   var new_object = {};
   new_object.wrapper = '<span id="adfasdfasdfwersadfas3rs">';
   //alert(typeof new_object.wrapper);

   if (jQuery.browser.msie && jQuery.browser.version <= 8.0){ 
       new_object.el = document.createElement(new_object.wrapper);
   } else  {
       new_object.el = jQuery(new_object.wrapper);
   }

   new_object.render_into = "#basic-render-test";
   jQuery(new_object.render_into).append( new_object.el );
   some_html = '<DIV id="type-m" class="translate"> HELLO IE</DIV>';
   jQuery(new_object.el).html( some_html );

Заявленный тип DOM - HTML 5

<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Ответы [ 2 ]

6 голосов
/ 09 сентября 2011

Вам необходимо предоставить действительный HTML-код для его правильного создания.В вашем примере тэг span не закрыт, что приводит к неверному коду при оценке в IE, в то время как другие браузеры стремятся исправить его автоматически.

Заменить

new_object.wrapper = '<span id="adfasdfasdfwersadfas3rs">';

на

new_object.wrapper = '<span id="adfasdfasdfwersadfas3rs"></span>';

Этот пример отлично работает как в IE 7, так и в 8

2 голосов
/ 09 сентября 2011

При просмотре кода jQuery требуется другой путь к коду, если то, что вы передаете в функцию jQuery, представляет собой простой тег типа "<span>" в сравнении с тем, что вы передаете. Когда это простой тег, jQuery вызывает createElement() on it, pretty much like your workaround code. Когда это не простой тег, jQuery вызывает createDocumentFragment(), а затем выбирает намного более сложный путь, включающий временный div, установку HTML в innerHTML и т. Д. *

Если вы делаете свой HTML простым тегом, а затем добавляете атрибут id к объекту после его создания, он должен следовать по пути кода createElement.

Чтобы обойти это, измените это:

new_object.wrapper = '<span id="adfasdfasdfwersadfas3rs">';

к этому:

new_object.wrapper = '<span id="adfasdfasdfwersadfas3rs"></span>';

Из этой документации jQuery :

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

Ваш HTML не был связан с закрывающим тегом.

...