Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Требуется объект (?) (https://javascript.ru/forum/events/26585-trebuetsya-obekt.html)

Erika 14.03.2012 01:40

Требуется объект (?)
 
Привет спецам)
Возможно вам это, как два пальца но, я только начала изучение JavaScript
По этому, для меня пока это сложно...
Суть проблемы в том, что есть массив элементов (".elem") в количестве 6 штук. Мне надо чтоб при наведении на ячейку выводилось инфо о статье, а при отведении (onmouseout) вновь все было по старому, в ячейке отображалось первью статьи.
Я придумала код и он работает но, IE в низу страницы показывает ошибку.
Мне ошибки не надо, по этому вот и ищу способ ее избежать.
function show_lib(x, y) {
    var all_table = document.querySelectorAll('.all-table')[1];
    var n_table = all_table.querySelectorAll('.main-table');
    for (i = 0; i < n_table.length; i++) {
        if (i == x - 1) {
            if (y == 1) {
                n_table[i].getElementsByTagName('span')[0].style.display = "none";
                n_table[i].getElementsByTagName('span')[1].style.display = "block";
            }
            if (y == 2) {
                n_table[i].getElementsByTagName('span')[1].style.display = "none";
                n_table[i].getElementsByTagName('span')[0].style.display = "block";
            }
        }
    }

Octane 14.03.2012 01:49

Какая версия IE? querySelectorAll есть только в IE8+

devote 14.03.2012 01:51

какая версия ИЕ?

devote 14.03.2012 01:51

Octane,
опередил меня :)

Erika 14.03.2012 02:04

Отвечаю всем и сразу)))
IE8++
Для нижней таблицы [2] все работает и ошибок не выдает. Но, для [1] - объект требует... Какой (?) все вродь на месте)

devote 14.03.2012 02:20

var all_table = document.querySelectorAll('.all-table')[1];
var n_table = all_table ? all_table.querySelectorAll('.main-table') : [];

Erika 14.03.2012 02:22

Спасибо, сейчас кофе допью и попробую)

Erika 14.03.2012 02:25

Все равно ругается...( Ладно, утро вечера мудренее. Проснусь - буду думать)

devote 14.03.2012 02:26

ну значит только на эти инструкции может ругаться .getElementsByTagName('span')

Erika 14.03.2012 02:29

Я и по другому пробовала. querySelectop('.lib-header') && querySelector('.header-article')

Erika 14.03.2012 02:32

Хотя IE по идее не должен на *TagName() ругаться. Это ведь его родная функция вродь...

devote 14.03.2012 02:43

Цитата:

Сообщение от Erika (Сообщение 162983)
Хотя IE по идее не должен на *TagName() ругаться. Это ведь его родная функция вродь...

Да но может просто он не находи никаких span и возвращает null а вы пытаетесь обратится к несущественному объекту

Erika 14.03.2012 04:52

Дело в том, что находит. Я же написала в первом посте, что код работает.
Просто меня смутило то, что в [1] он работает но, ругается в IE.
В то время, как при применении к элементу [2] та же функция полностью работает и не ругается не в одном арбузе.
(x)HTML дерево построено правильно, коды обоих таблиц одинаковые, количество элементов в селекторах равны.

nikita.mmf 14.03.2012 09:41

querySelectorAll в IE8, вроде бы, корректно работает только у document. Во всяком случае в jquery пользуются им только от document

devote 14.03.2012 10:39

Цитата:

Сообщение от nikita.mmf (Сообщение 163038)
querySelectorAll в IE8, вроде бы, корректно работает только у document. Во всяком случае в jquery пользуются им только от document

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

nikita.mmf 14.03.2012 13:49

devote,
jquery 1.7.1
// qSA works strangely on Element-rooted queries
				// We can work around this by specifying an extra ID on the root
				// and working up from there (Thanks to Andrew Dupont for the technique)
				// IE 8 doesn't work on object elements
				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
					var oldContext = context,
						old = context.getAttribute( "id" ),
						nid = old || id,
						hasParent = context.parentNode,
						relativeHierarchySelector = /^\s*[+~]/.test( query );

					if ( !old ) {
						context.setAttribute( "id", nid );
					} else {
						nid = nid.replace( /'/g, "\\$&" );
					}
					if ( relativeHierarchySelector && hasParent ) {
						context = context.parentNode;
					}

					try {
						if ( !relativeHierarchySelector || hasParent ) {
							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
						}

					} catch(pseudoError) {
					} finally {
						if ( !old ) {
							oldContext.removeAttribute( "id" );
						}
					}
				}

devote 14.03.2012 13:54

nikita.mmf,
И? что читать код не умеем?
context.querySelectorAll

любой контекст кроме тега object

nikita.mmf 14.03.2012 13:58

devote,
сорри, ошибся, мне всегда казалось, что в строке
return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
написано document, а не context

devote 14.03.2012 14:14

единственный баг в querySelecor это то что делать запрос нужно от парента, если это не document. Тоесть:
<!doctype html>
<html>
    <head>
    </head>
    <body>
        <div id="mycontext">
            <span></span>
        </div>
        <script type="text/javascript">
            var div = document.getElementById( 'mycontext' );
            var elems = div.querySelectorAll( div.nodeName + " span");
            alert( [ elems[0], elems[0].nodeName ] );
        </script>
    </body>
</html>
Это такой некий своеобразный баг, который впринципе не сильно влияет на выборку.

Erika 15.03.2012 06:40

Спасибо ребят)
Я уже выяснила где зарыта сАбака)
Тема off


Часовой пояс GMT +3, время: 11:18.