Jump to content
  • 0

Ошибки в IE при работе с style.display и странное HTML Object


xShift
 Share

Question

Здравствуйте!

 

Решил недавно написать свой framework на подобие jQuery с возможностью удобной выборки селекторов и последующей с ними работы. Все прекрасно получилось и замечательно работает за исключением пары глючных модулей для вкладок и ротации контента.

 

Собственно, проблема заключается в хитроподобном баге Internet Explorer, который до сих пор(тестил в последней версии IE Edge) проглатывания первого элемента массива с указателями на HTML Object'ы документа при попытке переключения z-index элементов прокрутки.

 

Код:

	// Micro module rotate some contents 	// [element] :: ( #parents fixed container -> .slide selector )	rotate: function(e,c,t) {		var e = this.htmlObj(e);		var t = t || 3000;		var ind = 0;		setInterval(function() {				e[ind].rotate = true;				e[ind].style.zIndex++;				$.callback(c, e[ind]);				if(ind++ >= e.length - 1) {					for(var i in e) e[i].style.zIndex = 0;					ind = 0;				};		}, t); 	},

К счастью, все написано в нативном компактном виде и никаких лишних багов быть не может, но при прокрутке элементов первый HTML Object проскакивает цикл как надо, а затем странным образом сглатывается эксплорером и прокрутка прекращается. Во всех остальных браузерах код ведет себя замечательно.

	// rotations api	$.rotate('#presentation p', function(){		//$.log(this);	}, 1500);

Вот кусок верстки с самими элементами HTML:

		<div id="presentation">			<p>Evolution JS — это не просто фреймворк и удобное API для скоростной разработки клиентских приложений, но и целый набор вспомогательных модулей с неограниченным потенциалом для творчества.</p>			<p>На данный момент внутренний движек и все фильтро-математические функции уже готовы для того, чтобы комфортно писать на JavaScript и не задумываться о сложных вещах, а также самостоятельно разрабатывать ядро Evolution.</p>		</div>

И сам код CSS для эллеметов:

/* rotation */#presentation {	border-radius: 8px;	position: relative;	margin: 20px 0;	padding: 12px;	height: 90px;	width:95%;}#mainContents #presentation p {	box-shadow: 0 0 5px #999;	background: #FFFFFF;	position: absolute;	border-radius:8px;	padding: 10px;	top: 0px;}

Кроме прокрутки я также столкнулся с подобным багом IE при создании микромодуля вкладок, который был обнаружен случайно при тестировании поделки:

	// Micro tabs module	// p - control selectors   ( like  [ul > li] )	// e - switchable contents ( like [div] )	// first .class "active"	// transform control [id] to switchable [class] 	tabs: function(p,e,c) {		var e = this.htmlObj(e);		var p = this.htmlObj(p);		p[0].classList.add('active');		// cleans the active marker		var tabActions  = function(s,r) {			var s = s || 0;			for(var t in r) {				if( t != s ) {					p[t].tabs = true;					r[t].tabs = true;					p[t].classList.remove("active");					r[t].style.position = 'absolute';					r[t].style.left = '-9999px';				}			}		}; tabActions(null,e);		$.click(p, function(t){			var cur = $.dom('.'+ t.id)[0];			cur.tabs = true;			cur.style.position = '';			$.toggleClass(t,"active");			var p = $.stripNum(t.id) - 1;			tabActions(p,e);			$.callback(c, cur);		});	},

В тщетных попытках заставить IE корректно комплитить действия с display:none HTML Object я напоролся на вилы. Элемент согласно детализации в консоли браузера выходит из состояния display:none в display: block или display: inline-block, о чем свидетельствует расконсоливание объект.style.display, но эти в наглядной версии элемент продолжает оставаться скрытым и нив какую не возвращается на самом деле. То есть консоль говорит, что изменения произошли, но ничего не изменилось на самом деле.

 

Помимо этого, проблема актуальна только для первого элемента стека. При кликах на последние элементы - все корректно обрабатывается и исчезает, но появляться обратно не хочет.

 

Собственно, из-за ошибок с style.display.none было решено использовать позиционирование элементов в абсолютном смысле для скрытия не совсем здоровым костылем, но и при этом браузер отказался корректно отрабатывать клики по вкладкам:

				if( t != s ) {					p[t].tabs = true;					r[t].tabs = true;					p[t].classList.remove("active");					r[t].style.position = 'absolute';					r[t].style.left = '-9999px';				}

Сам стиль вкладок таков:

/* tabs */#tabs,#tabs-2 {	text-align: center;	list-style: none;	margin:15px 0;}#tabs-2 ul,#tabs ul {	font-family: Verdana;	display: block;	width: auto;	padding: 0;	margin: 0;}#tabs-2 li.tab,#tabs li.tab {	border-top: 2px double #4A7BD2;	border-radius: 10px 10px 0 0;	display: inline-block;	border:1px solid #999;	margin: 0 0 -1px 0;	padding: 7px 15px;	background: #999;	color: #FDFFFA;}#tabs-2 li.active,#tabs li.active {	box-shadow: 0px 0px 5px rgb(148, 148, 148);	border-top: 3px double #FFF340;	color: #FFF340;	}#tabs-2 div,#tabs div {	border: 2px solid #999;	background: #F4F4F4;	border-radius: 4px;	text-align:left;	}

А их код следующий:

<div id="tabs-2"><ul>	<li id="tbs-1" class="tab">API</li>	<li id="tbs-2" class="tab">CSS</li></ul><div class="tbs-1"><code><pre>//tabs engine$.tabs('#tabs-2 li', '#tabs-2 div', function() {	$.log(this);});</pre></code></div><div class="tbs-2"><code><pre>/* tabs */#tabs,#tabs-2 {	text-align: center;	list-style: none;	margin:15px 0;}</pre></code></div></div>

Для запуска использовано API:

	//tabs engine	$.tabs('#tabs-2 li', '#tabs-2 div', function() {		//$.log(this);	});

Сам фреймворк со всеми используемыми функциями прикладываю во вложении. Помогите пожалуйста побороть ошибки IE и сделать Evo полностью кроссбраузерным. Очень хочется вывести игрушку из beta версии в stable и выложить в internet.

 

Может быть кто-то сможет написать очень компактный аналог или что-то заменить в коде чтобы это стало рабочим в Internet Exploer?

 

скачать примеры: FE framework EVO v.1.2 beta source + API

Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Короче, в чём заключается баг ИЕ? Зачем километры кода? Соберите конкретный пример бага без использования вашего фреймворка.

 

Начал писать выборку по селекторам, как у sizzle - так и увлекся.

 

Суть:

 

Есть HTML Object с ID=test. Если его свойство display сделать none, то применить к нему каких либо изменений в состоянии none не получается, хотя изменения состояния фиксируются в console.log. Если объект скрыть однажды, то вернуть его с помощью display = block почему то не получается.

 

Есть ли какое-то решение для этого?

 

update:

 

Простите, нашел глупый косяк со свойством length. Оно пролазило в HTML Objects коллекцию после получения по тегам. Ошибку сразу увидел во всех браузерах на Windows, но она почему-то совершенно не появлялась, когда использовал свой движек для выборки селекторов и совсем не появлялась в Safari когда писал код:

		var e = document.getElementsByTagName('p');		var t = 3000;		var ind = 0;		setInterval(function() {				e[ind].style.zIndex++;				if(ind++ >= e.length - 1) {					for(var i in e) {						if( i <  e.length ) {							// через раз в массив пролазит свойство length, которое не является HTML Object							e[i].style.zIndex = 0;												}					}					ind = 0;				};		}, t); 
Edited by xShift
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By Боков Глеб
      Компоновка: типичный блок .Wrapper, который имеет ширину 100% от ширины окна, и центровщик (margin: 0 auto;) с указанными min-width и max-width:
      В IE следующий баг: Wrapper почему-то заканчивается раньше, чем надо, а центровщик с содержимым перекрывает следующую такую же компоновку ниже:

      Такой баг был замечен уже практически на свёрстанном лендинге, а потому было очень трудно сделать минимальный работающий пример. Я постарался убрать весь лишний HTML для данного примера, но CSS тоже самое было сделать очень трудно.
      Если Вы запустите пример в IE (ещё раз повторюсь, что в других браузерах всё нормально), то увидите следующее:

      На StackOverflow уже несколько недель никто не может найти решение (оно и понятно: в разметке-то ошибок нет, это просто баг IE, но с ним надо что-то делать, потому что пользователи IE, увы, ещё превышают критическую отметку 10%). Вот только что удалось выяснить: если контейнеру .FlexPageLayoutWithFixedHeaderAndBottomFooter-Wrapper для основного содержимого (под header) задать min-height вместо height, то отображение станет нормальным. К сожалению, такое решение не годится потому, что исчезнет "прилипание" header-а кверху. Можно, конечно, прилепить его и другими способами, но хотелось бы избежать задания его абсолютной высоты, так как это противоречит концепции адаптивной вёрстки.
    • By serzh82saratov
      Всем привет! Я тут новичок, не пинайте сразу если что.
      Требуется аналог position sticky для IE (в режиме совместимости с 7).
      Надо чтобы в одну строку текст с кнопками и с пунктирной линией проходящей под ними посередине в любой ситуации прилипал к левой и правой границе окна, то есть чтобы не участвовал в горизонтальной прокрутке, но прокручивался вертикально. Также при растягивании окна, текст за которым следуют кнопки находились слева на 20%.

      То есть если сдвинуть скролл, строка с красной полоской должна остатся на месте, если растянуть окно, то красная полоса растягивается, "( Title )" немного сдвигается вправо.
      Надеюсь более менее объяснил, заранее спасибо.
      Забыл сказать, таких линий на форме 10 - 20 штук.
    • By Koss
      Здравствуйте! 
      Проблема следующая: есть некий корпоративный портал (уже довольно древненький и написанный задолго до меня), с него есть обычная ссылка <a> на карту, которая открывается в новой вкладке. Карта нарисована как svg и вставлена непосредственно в саму страницу через тег <svg> (вновь открываемую). Проблема в том, что при переходе по ссылке непосредственно с портала, IE11 не отображает svg и не корректно отображает стили для блоков с текстом. Все остальные браузеры отображают все полностью и правильно. Самое главное, что отдельно (правда на другом веб-сервере [может это важно]) эту страницу с картой IE11 отображает просто замечательно. Но стоит обратиться к ней через ссылку с главной страницы портала, не работает. Предполагаю, что проблема непосредственно с порталом. Где-то какие-то стили не те, или еще что... Может кто поопытнее подскажет, в какую сторону хоть копать...
      При написании портала использованы:      - jquery.fancybox-1.3.4.css
                                                                                                   - AC_RunActiveContent.js
                                                                                                  - swfobject_modified.js
                                                                                                  - jquery-1.4.3.min.js
                                                                                                  - jquery.easing-1.3.pack.js
                                                                                                  - jquery.fancybox-1.3.4.js
                                                                                                  - jquery.fancybox-1.3.4.pack.js
      Может где-то в них проблема?
       
    • By Rumpelstistskin
      Возникла необходимость сделать слайдер с множественным фоном, в котором по нажатию на кнопку один из фонов меняется. И всё замечательно работало, пока я не решил его проверить в IE11. В Chrome и FireFox всё работает. А в ИЕ фон слайдера либо реагирует на некоторые из кнопок, либо не реагирует на них вообще. В чём же может быть проблема?
      Код
       
      UPD. Забавная штука: если названия изображений, расположенных в списке фонов первыми, различаются между собой, то начинает изменяться и изображение, следующее ниже (которое мне и необходимо менять по нажатию кнопки). Это как-нибудь можно обойти?
    • By abrahadabra
      Сегодня, 12 января, корпорация Microsoft прекращает поддержку Internet Explorer версий 8, 9 и 10.
        
      http://habrahabr.ru/post/274595/
       
      Теперь добавилось формальных оснований не тратить свои драгоценные ресурсы на поддержку не самых лучших браузеров.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy