Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с DOM, onmouseover 
:(
    Опции темы
newProgrammer
Дата 26.11.2008, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 19.11.2008

Репутация: нет
Всего: нет



Здравствуйте. Помогите, пожалуйста, новичку в программировании. Мне нужно сделать так чтобы при наведении мышью на LI, менялся цвет border у IMG. Делаю так:
Код

<html>
<head>
<script type="text/javascript">
function myFunc() {
    var ul = document.getElementById("menu");
    var lis = ul.getElementsByTagName("li");
    for (var i = 1; i < lis.length; i ++) {
        lis[i].onmouseover = function() {
            var as = lis[i].firstChild;
            as.firstChild.style.border = "1px solid #ffffff";
        }
    }
}
</script>
</head>
<body onload="myFunc()">
<ul id="menu">
 <li>MENU</li>
 <li><a href=""><img src="" alt="" />Item 1</a></li>
 <li><a href=""><img src="" alt="" />Item 2</a></li>
 <li><a href=""><img src="" alt="" />Item 3</a></li>
 <li><a href=""><img src="" alt="" />Item 4</a></li>
</ul>
</body>
</html>

, но у меня ничего не выходит :( А в чем дело никак не разберусь...

Если убрать обработчик onmouseover с функцией, то все работает: все border картинок становятся белыми; ну а мне нужно. чтоб границы меняли цвет только при наведении мышью.

Заранее благодарю.
PM MAIL   Вверх
bars80080
Дата 26.11.2008, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 44
Всего: 315



Код

<html><head>
<style>
#menu a img { border: solid 1px #00ff00; }
</style>
<script>
function func() {
    var el = document.getElementById('menu').getElementsByTagName('li');
    var ell = el.length;
    for(var i = 1; i < ell; i++) {
        el[i].onmouseover = function() { ubor(this); };
        el[i].onmouseout = function() { dbor(this); };
    }
}
function ubor(x) {
    x.childNodes[0].childNodes[0].style.borderColor = '#ff0000';
}
function dbor(x) {
    x.childNodes[0].childNodes[0].style.borderColor = '#00ff00';
}
</script>
</head>
<body onload="func();">
<ul id="menu">
 <li>MENU</li>
 <li><a href="#"><img src="" alt="" />Item 1</a></li>
 <li><a href="#"><img src="" alt="" />Item 2</a></li>
 <li><a href="#"><img src="" alt="" />Item 3</a></li>
 <li><a href="#"><img src="" alt="" />Item 4</a></li>
</ul>
</body>
</html>
надо ещё не забыть, что MENU у тебя тоже в <li>, хотя не имеет потомков
PM MAIL WWW   Вверх
newProgrammer
Дата 26.11.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 19.11.2008

Репутация: нет
Всего: нет



bars80080, огромное тебе спасибо. Работает!  smile
Цитата
надо ещё не забыть, что MENU у тебя тоже в <li>, хотя не имеет потомков
Вот поэтому и 
Код
var i = 1;

Вот только хотелось бы еще понять чем твой скрипт принципиально отличается от моего. То есть отличие это я вижу. Ты обращаешься к LI через this. Мне интересно почему нельзя обратиться к это элементу через индекс массива, в котором он находится (el[i]).

У меня так работает:
Код

el[i].onmouseover = function() {
    this.childNodes[0].childNodes[0].style.borderColor = "#ffffff";
}

А так уже нет:
Код

el[i].onmouseover = function() {
    el[i].childNodes[0].childNodes[0].style.borderColor = "#ffffff";
}


Не знаешь почему так?
PM MAIL   Вверх
bars80080
Дата 26.11.2008, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 44
Всего: 315



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

ты прописываешь событие элементу, следовательно, на момент наведения мыши никаких el[i] не будет. будет вызвана функция в которую надо передать указатель на объект. раз нам надо взять тот самый объект, на который навели мышь - значит достаточно this

во-вторых, лучше использовать вынесенные функции, т.к. это универсальнее и легко корректируется впоследствии под конкретные задачи. меньше правок, меньше усложнённого кода

в-третьих, по поводу всё того же <li>MENU</li>
как точно выразить не знаю, но постараюсь. когда ты работаешь с неким набором объектов, то надо стараться, чтобы в нём было как можно меньше исключений. грубо говоря, набор одинаковых объектов - он до тех пор набор, пока объекты одинаковы.
любое исключение в геометрической прогрессии усложняет систему.
в этом конкретном случае удалось это обойти, благодаря тому, что исключительный элемент торчит в самом начале. а если бы он был в середине? тогда нам пришлось бы делать проверку с условием if(), который бы проверял скажем существование внутренних нодов. а операция, насколько я понимаю не слишком быстрая. умножаем это на количество <li> - получаем (усложнение*5). а если их не 5? (уверен, что не пять). насколько в итоге замедлится скрипт?
что сложного в данном случае вынести MENU за пределы <ul>? тем более не понимаю, ведь это заголовок и он должен стилистически отличаться от пунктов.

во всяком случае, минус здесь очевиден. каждый раз сталкиваясь с этим скриптом, придётся соображать, а почему i = 1, а не 0. а ведь код будет находится далеко от места разметки...

вот такие пироги о "незначительных" ньюансах
PM MAIL WWW   Вверх
newProgrammer
Дата 26.11.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 19.11.2008

Репутация: нет
Всего: нет



Спасибо тебе, bars80080, еще раз. Теперь мне все более или менее понятно.
А насчет первого LI ты прав. Вынесу его из списка в H1.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.