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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> hover элементов формы на javascript 
:(
    Опции темы
GZep
Дата 3.11.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Приветствую Вас!

Вот, значит, какая проблема:

Есть движок, у которого все элементы формы при наведении должны менять класс(css), а при убирании курсора, соответственно наоборот.

Вот, значит, как у меня сейчас сделано:
Код

<html>
<head>
<style type="text/css">
<!--
//Для субмита, ресета и простой кнопки
.input_button {
    color: #C0C0C0;
    background: #000000;
    font: 14px Comic Sans MS;
    margin: 0px;
    border: 0px;
    height: 20px;
}
.input_button:hover {
    background: #606060;
    color: #FFFFFF;
}

//Для всех остальных элементов
.input_field {
    border: 1px solid #FFFFFF;
    color: #C0C0C0;
    background: #000000;
    font: 14px Comic Sans MS;
}
.input_field:hover {
    background: #606060;
    color: #FFFFFF;
}
// -->
</style>
<script language="JavaScript" type="text/javascript">
<!--
// -->
</script>
</head>


Только вот проблема, в ИЕ такая фишка не проходит... smile 

Придумал решение: Написать яваскрипт ф-цию, которая циклом прохожилась по всем элементам форм и ставит им на onrollover соответствующий класс и обратно, на onrollout. Пробовал сам написать, только не работает. Помогите, пожалуйста!


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
Nicholas_S
Дата 3.11.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GZep, если с использованием JS, то так:

Код

<input type="checkbox" class="class1" onMouseOver="this.className = 'class2'" onMouseOut="this.className = 'class1'">




--------------------
...все в мире относительно
PM   Вверх
GZep
Дата 3.11.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



А можно написать функцию, которая проходилась бы циклом по элементам и задавала им onMouseOver и onMouseOver?


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SelenIT
Дата 3.11.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



GZep, не надо ничего обходить циклом - ловите событие (при его всплытии) на уровне самой формы, и анализируйте объект-источник. В простейшем случае (как в данном примере, когда стили у кнопок и полей при наведении меняются одинаково) - примерно так:
Код

function f(event,dir) {
   var el = event.target||event.srcElement;
   if (el.tagName.toLowerCase() == 'input' || el.tagName.toLowerCase() == 'textarea') {
      if (el.className && el.className.indexOf('input_') > -1) {
         if (dir==1) {
            el.className += ' hover';
         } else {
            el.className = el.className.replace(' hover', '');
         }
      }
   }
}

Код

<style type="text/css">
...
.hover {
    background: #606060;
    color: #FFFFFF;
}
</style>
...
<form onmouseover="f(event,1)" onmouseout="f(event,0)">



--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
GZep
Дата 3.11.2006, 16:07 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Спасибо, но меня все-таки интересует вариант с циклом... smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SelenIT
Дата 3.11.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



GZep, да что Вы на этом цикле зациклились-то, простите за каламбур? Насколько я могу судить, делать это циклом сейчас "не модно и не современно".


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Nicholas_S
Дата 3.11.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GZep, ноу проблема:

Код


var inpts = getElementById('formID').getElementsByTagName('input');
for (var i=0, i<inpts.length; i++)
{
  if (inpts[i].type.toLowerCase()=='checkbox')
  {
      inpts[i].onmouseover = function () {this.className = 'class2';}
      inpts[i].onmouseout   = function () {this.className = 'class1';}
  }
}




--------------------
...все в мире относительно
PM   Вверх
SelenIT
Дата 3.11.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



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


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
GZep
Дата 3.11.2006, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Nicholas_S, то, что нужно! Спасибо! Прошу извинить меня за настырность с этим циклом. Мне правда неловко! Всем Спасибо. Сейчас напишу универсальную ф-цию и выложу её для народа...
 smile 

Это сообщение отредактировал(а) GZep - 3.11.2006, 16:35


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
Nicholas_S
Дата 3.11.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



SelenIT, ...нужно!  smile

Добавлено @ 17:25 
...блин, почему у меня кешируется все и не обновляется, ниче не пойму...


--------------------
...все в мире относительно
PM   Вверх
AKS
Дата 3.11.2006, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



SelenIT, 
Цитата

Вы на этом цикле зациклились...

Прямо в "яблочко", как говорится! ;) Что ж, поделюсь с Вами своими "впечатлениями" по теме, т.к. автора темы, похоже, Вам "спасти" не удалось... ;)
Чуть-чуть переделал Ваш пример, ведь судя по таблице стилей, нужно на самом деле совсем немного (по "вашим следам" - легче топать ;) ):
Код

function f(e) {
  var el = e.target || e.srcElement, n = el.className;
  if(n.indexOf('input_') > -1)
    el.className = (e.type == 'mouseover') ? n + ' hover' : 
      n.replace(' hover', '');
}

Вызов:
Код

<form onmouseover='f(event)' onmouseout='f(event)'>

PM MAIL   Вверх
SelenIT
Дата 3.11.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



AKS, здорово. Только я бы постраховался и проверил n на существование...

И еще очень хочется навесить вызовы из скрипта же, не трогая HTML - к сожалению, этому я еще не научился, может быть, поможете?

В принципе, в данном конкретном случае кроссбраузерность не нужна (в других браузерах CSS справляется сам), так что можно и не передавать событие при вызове, тогда весь JS легко выносится из HTML (и оформляется в виде .htc, к примеру). Но интересно динамическое навешивание обработчиков в общем случае, когда ссылка на event обязательна...

Это сообщение отредактировал(а) SelenIT - 3.11.2006, 18:21


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
12345c
Дата 3.11.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

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



А что мешает делать так?

Код
<style>//Для субмита, ресета и простой кнопки
.fhover input{
    color: #C0C0C0;
    background: #000000;
    font: 14px Comic Sans MS;
    margin: 0px;
    border: 0px;
    height: 20px;
}
.fhover:hover input, .fhover2 input {
    background: #606060;
    color: #FFFFFF;
}
</style>
<form>
<div class=fhover onmouseover=this.className='fhover2' onmouseout=this.className='fhover'>
  <input type=text >
  <input type=text >
  <input type=checkbox >
</div></form>
hover становится несколько излишним, но для перестраховки не мешает.

Можно сделать и через behavior-стиль для IE: http://js2.ru/example/JsPrimeryCode-84.htm (пример - таблица)

Т.е. вопрос к автору темы - зачем стремиться к циклам, если без них работает?

Это сообщение отредактировал(а) 12345c - 3.3.2008, 13:18


--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
AKS
Дата 3.11.2006, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



SelenIT, 
 
Цитата

интересно динамическое навешивание обработчиков в общем случае

Так ведь в функцию передается первым параметром ссылка на объект Event. 
Цитата

n на существование...

Зачем? 
Код

alert(''.indexOf('input_')); // -1

PM MAIL   Вверх
SelenIT
Дата 3.11.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



12345c, насколько я понял, автору нужно подсвечивать только один элемент, а не группу. Поэтому вариант с контейнером, по-моему, мимо. А вот behavior - по-моему, самое то.

AKS, с проверкой действительно я перемудрил - мне казалось, что при отсутствии класса у элемента n останется undefined, не подумал, что оно преобразуется в пустую строку...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 3.11.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



SelenIT, вот, собрал из "домашних заготовок", для данного случая (пусть у формы будет id='forma'):
Код

function f(e) {
  var el = e.target || e.srcElement, n = el.className;
  if(n.indexOf('input_') > -1)
    el.className = (e.type == 'mouseover') ? n + ' hover' : 
      n.replace(' hover', '');
}
function a(o, e, f) {
  e = (e instanceof Array) ? (arguments.callee(o, e[1], f), e[0]) : e; 
  (o.attachEvent) ? o.attachEvent(e, f) : (o.addEventListener) ? 
    o.addEventListener(e.substr(2), f, false) : '';
}
a(window, 'onload', function() {
  a(document.getElementById('forma'), ['onmouseover', 'onmouseout'], f);
});

PM MAIL   Вверх
SelenIT
Дата 3.11.2006, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



AKS, большое спасибо!
Опять этот "Коля" (callee)... видно, пришла пора мне познакомиться с ним поближе, в XXI веке без него никак smile


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 3.11.2006, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



SelenIT, "Колей" Zeroglif "ласково" называет caller'а - вызывающий объект, короче сказать, то самое, куда в функции укажет this. А здесь у нас arguments.callee - указатель на текущую функцию (удобная штучка ;) ).
PM MAIL   Вверх
SelenIT
Дата 3.11.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



Мда, вот как у меня, оказывается, все запущено - такие базовые вещи путаю...  smile 
буду срочно исправляться!


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 3.11.2006, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



SelenIT, arguments.callee незаменим в анонимных функциях. Вот пример, только что взял у "себя" с Xpoint (можно было бы так функцию f "присобачить"):
Код

(function(e) {
  (window.attachEvent || (e = e.substr(2), window.addEventListener))
  (e, function(o, e) { o = (o.tagName) ?  o : document.getElementById('forma'); 
    if(!e) arguments.callee(o, 'onmouseover');
    ((e = e || 'onmouseout', o.attachEvent) || (e = e.substr(2),
      o.addEventListener))(e, f, !1); }, !1);
})('onload');


Добавлено @ 19:50 
SelenIT, что-то я глянул "со стороны" на фразу "взял у себя" - нехорошо! Основная идея в этом примере (obj.method || obj.another_method)() - от Zeroglif!
PM MAIL   Вверх
SelenIT
Дата 3.11.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



AKS, мощно, внушает  smile 
Выходит, именно этой arguments.callee мне последнее время и не хватало. А я-то все пытался какими-то обходными маневрами this переназначить...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 3.11.2006, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



SelenIT, не-е-е, this не переназначить ни "обходными маневрами", ни какими другими - он "упрямый". Так что берегите время, оставьте его в покое ;) ...
PM MAIL   Вверх
GZep
Дата 4.11.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Значит так... smile 

Сразу скажу, что от цикла я отказывать не буду.(без цикла у меня уже есть давно пример кода)

А вот, что у меня получилось нахимичить с циклом(не смейтесь тока smile )
Код

<html>
<head>
<style type="text/css">
<!--
//Класс для "не кнопок"(текст, список и т.д.
.input_field {
    color: #C0C0C0;
    background: #000000;
    border: 1px solid #FFFFFF;
    font: 14px Comic Sans MS;
}
//Тоже самое, тока при наведении мышки
.input_field_hover {
    color: #FFFFFF;
    background: #606060;
    border: 1px solid #FFFFFF;
    font: 14px Comic Sans MS;
}
//Класс для кнопок("батон", "ресет", "субмит")
.input_button {
    color: #C0C0C0;
    background: #000000;
    font: 14px Comic Sans MS;
    margin: 2px;
    border: 1px;
    height: 20px;
}
//Тоже самое, тока при наведении мышки
.input_button_hover {
    color: #FFFFFF;
    background: #606060;
    font: 14px Comic Sans MS;
    margin: 2px;
    border: 1px;
    height: 20px;
}
// -->
</style>
<script language="JavaScript" type="text/javascript">
<!--
document.body.onload=function() {
    content_form_elements = document.getElementsByTagName('input');
//цикл for ( ; ; ) не работает!!! Не пойму почему!!
    //for(i=0;i<(content_form_elements.length-1);i++) {
//А вот мой тупейший способ с for in почему то заработал
    i=0;
    for (c in content_form_elements) {
// Переменная "с" - это...эээ...часть моего гениального плана по захвату мира...
        //alert (content_form_elements[i].type);
//Вот, обратите внимание на следующею строчку, без неё код после ф-ции в опере не выполняется, как при ошибке
        if (i==(content_form_elements.length-1)) break;
//ну, радио и чеки боксы пропускаем
        if (content_form_elements[i].type=='checkbox' || content_form_elements[i].type=='radio') {
            i++;
            continue;
        }
//мясо(кнопки) в одну сторону
        if (content_form_elements[i].type=='button' || content_form_elements[i].type=='submit' || content_form_elements[i].type=='reset') {
            content_form_elements[i].className = 'input_button';
            content_form_elements[i].onmouseover = function () {
                this.className = 'input_button_hover';
            }
            content_form_elements[i].onmouseout = function () {
                this.className = 'input_button';
            }
//насекомых(не кнопки) в другую
        } else {
            content_form_elements[i].className = 'input_field';
            content_form_elements[i].onmouseover = function () {
                this.className = 'input_field_hover';
            }
            content_form_elements[i].onmouseout = function () {
                this.className = 'input_field';
            }
        }
        i++;
    }
}
// -->
</script>
</head>
<body>
Тут боди
</body>
</html>


Меня интересует цикл for ( ; ; ), точнее то, почему он "не пашет"
 smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SelenIT
Дата 4.11.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



Цитата(GZep @  4.11.2006,  18:30 Найти цитируемый пост)
код после ф-ции в опере не выполняется, как при ошибке

А в Tools -> Advanced -> Error console ничего при этом не пишется?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
GZep
Дата 4.11.2006, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Вот что пишет:

Event thread: load
Error:
name: TypeError
message: Statement on line 85: Could not convert undefined or null to object
Backtrace:
  Line 85 of inline#1 script in http://localhost/text.php
    if (content_form_elements[i].type == "checkbox" || content_form_elements[i].type == "radio")
          Line 28 of inline#2 script in http://localhost/text.php
    HoverFormElements();
  At unknown location
    [statement source code not available]



--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SelenIT
Дата 4.11.2006, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



GZep, а что такое HoverFormElements() и откуда оно взялось?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 4.11.2006, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



Я попробовал убрать кое-что из кода и проверил - вроде бы работает. Может так:
Код

function GZep_hover(e) {
  var el = (e = e || event).target || e.srcElement,
  n = el.className;
  el.className = (e.type == 'mouseover') ? n + '_hover' : 
    n.replace('_hover', '');
}

onload = function() {
  var a = document.getElementsByTagName('input'),
  e,  f = GZep_hover;
  for(var i = 0; e = a[i]; i++) {
    if(e.type == 'checkbox' || e.type == 'radio') continue;
    else if(e.type == 'button' || e.type == 'submit' || e.type == 'reset') {
      e.className = 'input_button';
      e.onmouseover = e.onmouseout = f;
    } 
    else {
      e.className = 'input_field';
      e.onmouseover = e.onmouseout = f;
    }
  }
}

PM MAIL   Вверх
GZep
Дата 4.11.2006, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Цитата

GZep, а что такое HoverFormElements() и откуда оно взялось?


Это у меня так ф-ция называется. Перед тем, как выложить разметку, я естественно покорректировал её(убрал то, что не в тему).

HoverFormElements() { = onload.function() {
 smile

Добавлено @ 20:58 
Цитата

Я попробовал убрать кое-что из кода и проверил - вроде бы работает. Может так:код Javascript

немогли бы Вы код с комментариями дать. smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
AKS
Дата 4.11.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



GZep, 
Цитата

немогли бы Вы код с комментариями дать

Я бы с удовольствием, только я не знаю, что комментировать - ведь это же ваш код, просто я убрал несколько строк, показавшихся мне лишними. Напишите, что именно Вас интересует? 
PM MAIL   Вверх
SelenIT
Дата 4.11.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



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


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
GZep
Дата 4.11.2006, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Ура! Сделал! smile 
Огромное спасибо AKS'у за идею простого "лечения" цикла for( ; ; ).
Финальный вариант предпологает то, что в тегах форм не надо указывать ни стиль, ни действия, только то, что они input'ы. smile 
Код

<html>
<head>
<style type="text/css">
<!--
//Класс для "не кнопок"(текст, список и т.д.)
.input_field {
    color: #C0C0C0;
    background: #000000;
    border: 1px solid #FFFFFF;
    font: 14px Comic Sans MS;
}
//Класс для "не кнопок"(текст, список и т.д.) при наведении мышки
.input_field_hover {
    color: #FFFFFF;
    background: #606060;
    border: 1px solid #FFFFFF;
    font: 14px Comic Sans MS;
}
//Класс для кнопок("батон", "ресет", "субмит")
.input_button {
    color: #C0C0C0;
    background: #000000;
    font: 14px Comic Sans MS;
    margin: 2px;
    border: 1px;
    height: 20px;
}
//Класс для кнопок("батон", "ресет", "субмит") при наведении мышки
.input_button_hover {
    color: #FFFFFF;
    background: #606060;
    font: 14px Comic Sans MS;
    margin: 2px;
    border: 1px;
    height: 20px;
}
// -->
</style>
<script language="JavaScript" type="text/javascript">
<!--
document.body.onload=function() {
    content_form_elements = document.getElementsByTagName('input');
    for(i=0; content_form_elements[i]; i++) {
        if (content_form_elements[i].type=='checkbox' || content_form_elements[i].type=='radio') {
            continue;
        } if (content_form_elements[i].type=='button' || content_form_elements[i].type=='submit' || content_form_elements[i].type=='reset') {
            content_form_elements[i].className = 'input_button';
            content_form_elements[i].onmouseover = function () {
                this.className = 'input_button_hover';
            }
            content_form_elements[i].onmouseout = function () {
                this.className = 'input_button';
            }
        } else {
            content_form_elements[i].className = 'input_field';
            content_form_elements[i].onmouseover = function () {
                this.className = 'input_field_hover';
            }
            content_form_elements[i].onmouseout = function () {
                this.className = 'input_field';
            }
        }
    }
}

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

Только textarea палки в колеса всемирного прогресса вставляет, ведь он не инпут.... smile

А можно написать <input type="textarea"???

Добавлено @ 21:23 
Цитата

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

SelenIT, я - просто обожаю префиксы, ну, и немножко пространство имен. Конфликтов имен у меня никогда еще не было, ни в пхп, ни в яваскрипте... smile  smile 

Это сообщение отредактировал(а) GZep - 4.11.2006, 21:42


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
AKS
Дата 4.11.2006, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



Цитата

А можно написать <input type="textarea"???

Писать-то можно, только толку никакого. ;)
А для textarea тогда уж можно отдельно задать обработчик ("раз пошла такая пьянка" ;) - т.е. раз уж Вы выбрали именно такой "тернистый" путь...).

PM MAIL   Вверх
GZep
Дата 4.11.2006, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



А по-моему, путь просто отличный... Можно написать эту функцию, стили и все остальное забыть...все само будет делвться и в ИЕ 6-7 будет работать.


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
GZep
Дата 4.11.2006, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Народ, а как склеить массивы в javascript??? нигде найти не могу... smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
12345c
Дата 5.11.2006, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

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



Цитата(GZep @  4.11.2006,  22:21 Найти цитируемый пост)
Народ, а как склеить массивы в javascript??? нигде найти не могу... smile  

http://javascript.aho.ru/files/js/ArrayJS.html#concat
PM WWW   Вверх
GZep
Дата 5.11.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



content_form_elements = document.getElementsByTagName('input').concat(document.getElementsByTagName('textarea'));

Не работает! getElementsByTagName() почему-то возвращает массив, где последний элемент имеет значени null(по-моему). Из-за этого не работал цикл for(i=0; i<content_form_elements[i]; i++) {, а пришлось вместо него писать for(i=0; content_form_elements[i]; i++) {.

Поправьте, пожалуйста, строчку с concat.

Это сообщение отредактировал(а) GZep - 5.11.2006, 11:33


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
AKS
Дата 5.11.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



GZep, нельзя применить concat к коллекциям DOM - нет у коллекций этого метода в "распоряжении". 
PM MAIL   Вверх
GZep
Дата 5.11.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



А как тогда склеить можно?

Могу это сделать при помощи цикла, но хотелось бы покрасивее сделать...


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SelenIT
Дата 5.11.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



GZep, по-моему, самый красивый вариант показал AKS здесь - вообще никаких циклов, компактно и кроссбраузерно...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
GZep
Дата 5.11.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



А мне больше нравится, когда в начеле скрипт поставил, и все, больше ничего делать не надо. Вот только скрипт этот еще надо select и taxtarea понимать научить. Что я щас, собственно говоря, и делаю. smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SelenIT
Дата 5.11.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



GZep, а есть существенная разница, какой скрипт "в начале поставить и больше ничего не делать" - с циклами или без?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
GZep
Дата 5.11.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



SelenIT, а, ну да, тот же тоже можно в начале поставить и ничего не делать, кроме назначения форме id  smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
GZep
Дата 7.11.2006, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Значит так...

С циклами ничего конкретного не получилось и я на них "забил". Прошу извинить меня за то, что игнорировал советы умных людей отказать от циклов. Надо было послушаться и не терять даром время. Что я имею на данный момент:
1-ое. В браузерах Opera и FireFOX прекрасно можно обойтись без javascript при помощи CSS, и все будет работать "как нельзя лучше". Остается решить проблему с всеми "любимым" Internet Explorer.

2-ое. Все-таки я признаю, что "отнимать" у тегов атрибуты типа class и id - не совсем верно...хотя скорее - совсем не верно.

3-тье. Код CSS(решает проблему в опере и мозиле):
Код

.input_field {
    color: #C0C0C0;
    background: #000000;
    border: 1px solid #FFFFFF;
    font: 14px Comic Sans MS;
}
.input_field:hover {
    color: #FFFFFF;
    background: #606060;
    border: 1px solid #FFFFFF;
    font: 14px Comic Sans MS;
}
.input_button {
    color: #C0C0C0;
    background: #000000;
    font: 14px Comic Sans MS;
    margin: 0px;
    border: 1px;
    height: 20px;
}
.input_button:hover {
    color: #FFFFFF;
    background: #606060;
    font: 14px Comic Sans MS;
    margin: 0px;
    border: 1px;
    height: 20px;
}


4-ое. У всех "кпопкоподобных" присвоен класс input_button, для всего остального input_field.

5-ое. Чекбоксы и радио "батоны" в этой теме рассматривать вообще не стоит.

6-ое. Остается решить проблему с ИЕ. Вот тут я хотел спросить: может поставить обработчики на яваскрипте только, если браузер ИЕ(вообще всю ф-цию запихнуть в "тело условия"?


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
AKS
Дата 7.11.2006, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



GZep, 
Цитата

Остается решить проблему с ИЕ. Вот тут я хотел спросить: может поставить обработчики на яваскрипте только, если браузер ИЕ...

Так и сделайте! Скачайте whatever:hover и подключайте через behavior...
PM MAIL   Вверх
GZep
Дата 7.11.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Цитата(AKS @  7.11.2006,  12:41 Найти цитируемый пост)
Так и сделайте!

Одно понятно - идея правильная.
Цитата

whatever:hover

Что это вообще такое?

И я вообще заблудился на том сайте smile Все на английском...



--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
AKS
Дата 7.11.2006, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



GZep, 
  • Качайте сценарий
  • Подключайте через таблицу стилей вот так: body { behavior:url("csshover.htc"); }
  • Используйте сценарий в соответствии с лицензией



PM MAIL   Вверх
GZep
Дата 7.11.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Ну а как это работает Вы мне объяснить можите? По-моему там много лишнего...регулярное выражение вот краем глаза вижу...Что это за проект? Это проект, который направлен конкретно на hover элементов формы в ИЕ? Или чтоб вообще сделать hover полнофункциональным.
Не скудитесь, пожалуйста, на слова. Хочется же не просто сделать, а еще и понять, что сделал.


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
AKS
Дата 7.11.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



GZep, 
Цитата

...вообще сделать hover полнофункциональным

Этот сценарий позволяет эмулировать поведение псевдоклассов :hover и :focus в IE для всех элементов, к которым они применены в таблице стилей. Конечно же для вашего случая там много лишнего - сценарий для вашей формы может быть лаконичней (что я мог предложить, я уже предлагал). 


PM MAIL   Вверх
GZep
Дата 7.11.2006, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



AKS, вот Ваш пример, только немного переделал(сделал более читабельным), но суть не изменил. Чуть не забыл: я его в тело условия запихнул, которое проверяет тип браузера.
Код

if (navigator.appName == "Microsoft Internet Explorer") {
    function f(e) {
        var el = e.target || e.srcElement, n = el.className;
        if(n.indexOf('input_') > -1) {
            if (e.type == 'mouseover') {
                el.className = n + ':hover'
            } else {
                el.className = n.replace(':hover', '');
            }
        }
    }
    function a (o, e, f) {
        if (e instanceof Array) {
            e = arguments.callee(o, e[1], f), e[0]
        }
        if (o.attachEvent) {
            o.attachEvent(e, f);
        } else if (o.addEventListener) {
            o.addEventListener(e.substr(2), f, false);
        }
    }
    a (window, 'onload', function() {
        a(document.getElementById('form'), ['onmouseover', 'onmouseout'], f);
    });
}
  • id формы - form.
  • e = arguments.callee(o, e[1], f), e[0]//ИЕ выдает ошибку: "\"0\" - есть null и не является объектом"
  • Всё это можно как-нибудь в виде одной ф-ции записать? А не в виде 3-х...
 smile AKS, пожалуйста, не поленитесь помоч мне "разжувать" эту тему...


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
AKS
Дата 7.11.2006, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



GZep, 
Цитата

Всё это можно как-нибудь в виде одной ф-ции записать?

Можно:
Код

function GZep(e) {
  var el = e.srcElement;
  if(el) {
    var n = el.className;
    if(n.indexOf('input_') > -1) {
      if(e.type == 'mouseover') {
        el.className = n + ' hover';
      } 
      else {
        el.className = n.replace(' hover', '');
      }
    }
  }
}

Потом в форме:
Код

<form id='form' onmouseover='GZep(event)' onmouseout='GZep(event)' action='' method=''>

И не пытайтесь добавить к имени стилевого класса строку ":hover". У Вас должен быть дополнительный класс .hover, имя которого и будет добавляться (удаляться) к уже имеющимся именам классов элементов формы.
PM MAIL   Вверх
GZep
Дата 7.11.2006, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Ну а как сделать чтоб только в ИЕ эта функция выполнялась? Воткнуть её в тело условия, а для других браузеров сделать эту функцию пустой? или как?

И зачем форме id присваивать в этом примере? Он ведь не нужен...

Это сообщение отредактировал(а) GZep - 7.11.2006, 18:22


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
AKS
Дата 7.11.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



GZep, 
Цитата

как сделать чтоб только в ИЕ эта функция выполнялась

А она и будет только в IE выполняться (сделайте первое условие пожестче против Opera   if(el && !window.opera), а то я забыл).
Цитата

зачем форме id присваивать в этом примере

Вы написали, а я повторил...
PM MAIL   Вверх
GZep
Дата 8.11.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Финальный вариант.

CSS
Код

.input_field {
    color: #C0C0C0;
    background: #000000;
    border: 1px solid #FFFFFF;
    font: 14px Comic Sans MS;
}
.input_button {
    color: #C0C0C0;
    background: #000000;
    font: 14px Comic Sans MS;
    margin: 0px;
    border: 1px;
    height: 20px;
}
.input_button:hover, .input_field:hover {
//Здесь можно записать только изменяющиеся параметры(у меня цвет текста и фона)
    color: #FFFFFF;
    background: #606060;
}

JavaScript
Для Windows Internet Explorer и Microsoft Internet Explorer
Код

if (navigator.appName == "Microsoft Internet Explorer" && !window.opera) {
    window.onload = function() {
        var forms = document.getElementsByTagName('form');
        for (var i=0; forms[i]; i++) {
            forms[i].onmouseover = function() {
                hoverForm(event);
            }
            forms[i].onmouseout = function() {
                hoverForm(event);
            }
        }
    }
}
function hoverForm(ElementEvent) {
    var el = ElementEvent.srcElement;
    if(el && !window.opera && !el.disabled) {// && !el.disabled - чтоб для элементов с атрибутом disabled эта функция вообще ничего не делала
        var n = el.className;
        if(n.indexOf('input_') > -1) {
            if(ElementEvent.type == 'mouseover') {
                //Перечисляем все, что нужно изменить при наведении мыши
                el.style.backgroundColor="#606060";
           el.style.color="#FFFFFF";
            } else {
                //Перечисляем все, что нужно изменить при отведении мыши
                el.style.backgroundColor="#000000";
                el.style.color="#C0C0C0";
            }
        }
    }
}

HTML резметка
Код

<form action="" method="">
<input type="submit" class="input_button">
<input type="reset" class="input_button">
<input type="button" class="input_button">
<input type="text" class="input_field">
<input type="password" class="input_field">
<select class="input_field"></select>
<textarea class="input_field"></textarea>
<form>
  • Чек боксы и радио "батоны" в этой теме не рассматриваются!
  • Этот вариант идогда обновляется, если Вы его используете у себя, то советую иногда заглядывать сюда и сверять! Обращайте внимание на дату редактирования.
  • Жду отзывы и замечания, если таковые имеются!
P.S.
AKS, поправь, пожалуйста, если что-то не так сделал.

Добавлено:

Теперь javascript функция будет выполняться только в Internet Explorer. В других браузерах эта функция вообще ни разу вызываться не будет. Это немного ускоряет работу скрипта, ведь раньше все браузеры вызывали функцию и прекращали ее выполнять когда натыкались на условие в ней. Теперь подсветка в браузерах отличных от ИЕ будет выполняться исключительно при помощи css. И теперь не надо писать:
<form onmouseover="HoverForm(event)" onmouseout="HoverForm(event)">,
теперь надо просто:
<form>
 smile 

Это сообщение отредактировал(а) GZep - 21.11.2006, 15:48


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
GZep
Дата 21.11.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Народ, прокомментируйте, пожалуйста, если есть какие-либо замечания...


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
12345c
Дата 21.11.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

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



Модифицирую приведённый пример, чтобы показать другой способ достижения того же:
Код
<style>.input_field,.input_button {
  color: #ccc; /*та же основа, но с некоторыми дополнениями*/
  background: #000;
  border: 1px solid #c0c;
  font: bold 14px Comic Sans MS;
  behavior: url(JsPrimeryCode-43.htc); /*для IE*/
}
.input_button {  margin:0;  border:0;  height: 22px;
}
.hovered,.input_button:hover, .input_field:hover{ /*hovered - класс для IE*/
  color: #fff;  /*изменяющиеся параметры*/
  background: #999;
}</style>
<form action="" method="">
<input type="submit" class="input_button">
<input type="reset" class="input_button">
<input type="button" class="input_button" value=222>
<input type="text" class="input_field" size=10 value=333>
<input type="password" class="input_field" size=10 value=444><br>
<select class="input_field"><option>111</option><option>111</option><option>111</option><option>111</option></select>
<textarea class="input_field">555</textarea>
<form>

Файл JsPrimeryCode-43.htc :
Код
<attach for=element event=onmouseover handler=hig_light>
<attach for=element event=onmouseout handler=low_light>
<script>
function hig_light(){element.className+=' hovered';}
function low_light(){element.className=element.className.replace(/ hovered/,'');}
</script>
Демо - на http://javascript.aho.ru/example/zzzz55.htm (+ укоротил описания стилей)


Это сообщение отредактировал(а) 12345c - 21.11.2006, 17:06
PM WWW   Вверх
GZep
Дата 21.11.2006, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



12345c, так прокомментируйте вариант раз Вы его выложили. Расскажите как он работает, его достоинства и недостатки.
Цитата(12345c @  21.11.2006,  16:49 Найти цитируемый пост)
className.replace(/ hovered/,'');}

Вот я не пойму зачем вообще в подобных вещах пользоваться replace. Это ведь функция, для работы с текстом. Разве не быстрее просто менять имя класса?

Кроме того я заметил одну такую особенность в поведении javascript: при изменении класса с помощью javascript изменяются все параметры. Например, вы создали класс, где указан цвет фона и цвет рамки, а потом поменяли ява скриптом этот класс на другой, где указан только цвет фона. Так что же? Вы думаете что цвет фона поменяется, а цвет рамки останется от предыдущего класса? Ничего подобного! Цвет рамки в таком случае поменяется на стандартный, установленный в настройках браузера. Поэтому в своем примере я сделал так, что javascript вообще не меняет имя класса, а просто заменяет цвета, без css, сам.
Это я так, к теме сказал... smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
12345c
Дата 21.11.2006, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

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



А что комментировать, и так всё видно. Недостаток - лишний файл. Достоинство - компактнее. replace - чтобы убрать только добавленное имя класса, не трогая те, что были до него.
Цитата(GZep @  21.11.2006,  18:27 Найти цитируемый пост)
Например, вы создали класс, где указан цвет фона и цвет рамки, а потом поменяли ява скриптом этот класс на другой, где указан только цвет фона. Так что же? Вы думаете что цвет фона поменяется, а цвет рамки останется от предыдущего класса? 
 Вы, видимо, не заметили, что я не поменял класс, а добавил : ) :
Цитата
element.className+=' hovered'


PM WWW   Вверх
GZep
Дата 22.11.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Цитата(12345c @  21.11.2006,  18:36 Найти цитируемый пост)
Вы, видимо, не заметили, что я не поменял класс, а добавил : ) :

Я это прекрасно понял. Я это писал не к Вашему примеру, а просто рассказал особенность поведения javascript, по скольку это уместно в данной теме.
Цитата(12345c @  21.11.2006,  18:36 Найти цитируемый пост)
А что комментировать, и так всё видно.

Ну, не все же такие профи smile 

Кстати, по вашему примеру то, что я говорил про особенность javascript все-таки относится, вроде. Вот посмотрите:
Код

<style>.input_field,.input_button {
  color: #ccc; /*та же основа, но с некоторыми дополнениями*/
  background: #000;
  border: 1px solid #c0c;
  font: bold 14px Comic Sans MS;
  behavior: url(JsPrimeryCode-43.htc); /*для IE*/
}
.input_button {  margin:0;  border:0;  height: 22px;
}
.hovered,.input_button:hover, .input_field:hover{ /*hovered - класс для IE*/
  color: #fff;  /*изменяющиеся параметры*/
  background: #999;
}</style>

Этот отрезал из вашего кода. Сдесь при включении input_button:hover(это произойдет в опере и мозиле) все будет нормально, например параметр font останется от класса input_field,.input_button, где он был задан. А вот в ИЕ, где замену класса будет выполнять javascript не будет наследоваться параметры. То есть font станет стандартным, браузерным. В своем примере я это исправил примитивным, но надежным путем, я просто не менял класс, а задал параметры, которые надо поменять вручную, без css. Вот так ваш вариант будет работать правильно в ИЕ:
Код

<style>.input_field,.input_button {
  color: #ccc; /*та же основа, но с некоторыми дополнениями*/
  background: #000;
  border: 1px solid #c0c;
  font: bold 14px Comic Sans MS;
  behavior: url(JsPrimeryCode-43.htc); /*для IE*/
}
.input_button {  margin:0;  border:0;  height: 22px;
}
.hovered,.input_button:hover, .input_field:hover{ /*hovered - класс для IE*/
  color: #fff;  /*изменяющиеся параметры*/
  background: #999;
  border: 1px solid #c0c;
  font: bold 14px Comic Sans MS;
}</style>

Вот так вот. Ваше мнение...??? smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
Zeroglif
Дата 22.11.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GZep @  22.11.2006,  14:13 Найти цитируемый пост)
Я это прекрасно понял.

Совершенно не поняли. Яваскрипт не при чём, сложно ожидать от замены имени класса какого-то там наследования. smile

Цитата(GZep @  22.11.2006,  14:13 Найти цитируемый пост)
А вот в ИЕ, где замену класса будет выполнять javascript не будет наследоваться параметры. То есть font станет стандартным, браузерным.

Откуда такой вывод про IE и Javascript? Есть же живая ссылка на пример, разве вы не видите, что у элементов форм при наведении меняется фон, а шрифт остаётся тот же? Замена класса может быть прописана в стиле, естесственно предыдущий класс будет "забит" последующим, это обычное поведение для стилей, явакскрипт, бедный, ни при чём.

Цитата(GZep @  22.11.2006,  14:13 Найти цитируемый пост)
я просто не менял класс

Автор скрипта тоже не меняет класс, он добавляет класс, разные вещи же:

Код

<input type="text" class="cl1">


против

Код

<input type="text" class="cl1 cl2 cl3 cl4 cl5">


Выше много классов, они могут перекрывать друг друга (если свойства сопадают, это по сути замена одного класса на другой), а могут дополнять. Если вам нужно при наведении только изменить цвет фона, то вы добавляете (а не удаляете/заменяете предыдущий) новый класс отдельно для фона, а потом убираете его (метод replace, привет). Если же вы заменяете один класс на другой, то само собой вам приходится полностью переносить все свойства (а их может быть ой-ой-ой сколько) в новый класс. Вам оно надо? smile




Это сообщение отредактировал(а) Zeroglif - 22.11.2006, 15:31
PM MAIL WWW   Вверх
GZep
Дата 22.11.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Цитата(Zeroglif @  22.11.2006,  15:16 Найти цитируемый пост)
Автор скрипта тоже не меняет класс

Это разве не изменение:
Цитата

el.className=

Я имею ввиду, что при использовании метода или свойства или как там это в яваскрипте наз-ся, короче при изменении className никакого наследования не происходит, элемент просто забывает про предыдущий класс и к нему присваивается новый. Свойства не заменяются при совпадении, они просто становятся стандартными, кроме тех, что указаны в новом классе. Это я, кстати, на практике видел... smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
Zeroglif
Дата 22.11.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GZep @  22.11.2006,  15:58 Найти цитируемый пост)
Это разве не изменение

Это изменение, присваивается другое имя, но вот это

Код

// допустим текущее имя класса - old_name
el.className += ' new_name';

уже дополнение, к одному имени справа встанет другое (обратите внимание на пробел в строке), соответственно, сначала элементу наведут красоту из old_name, а потом найдут ниже new_name и наведут красоту, взяв свойства уже из него.

Цитата(GZep @  22.11.2006,  15:58 Найти цитируемый пост)
при использовании метода или свойства или как там это в яваскрипте наз-ся, короче при изменении className никакого наследования не происходит

Не в яваскрипте дело, этого не может быть, потому что не может быть... smile

PM MAIL WWW   Вверх
12345c
Дата 22.11.2006, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

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



Ещё раз (3-й) опишу то, что Вы в упор не видите.
  • До наведения мыши в IE - класс "input_button"
  • При наведении - "input_button hovered (потому что написано - function hig_light(){element.className+=' hovered';})
  • При отведении мыши - класс снова "input_button", потому что написано - function low_light(){element.className=element.className.replace(/ hovered/,'');}
Если бы было при наведении function hig_light(){element.className=' hovered';}, то увидели бы так жадно ожидаемое стандартное свойство бордюра. Но написано же не так? Что Вам мешает читать так, как написано? smile

Добавлено @ 16:37 
(Пост был к GZep.)

Добавлено @ 16:45 
(Ещё понятно было бы, если без примера, а тут пример работает. "Давайте спорить о вкусе устриц с теми, кто их ел", а о неправильной работе примера - с теми, кто его видел.)
PM WWW   Вверх
GZep
Дата 22.11.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Цитата(Zeroglif @  22.11.2006,  16:34 Найти цитируемый пост)
уже дополнение, к одному имени справа встанет другое (обратите внимание на пробел в строке), соответственно, сначала элементу наведут красоту из old_name, а потом найдут ниже new_name и наведут красоту, взяв свойства уже из него.

Все, я понял. До меня дошло, когда Вы сказали про пробел. smile Спасибо.

Цитата(Zeroglif @  22.11.2006,  16:34 Найти цитируемый пост)
Не в яваскрипте дело, этого не может быть, потому что не может быть... 

А чтобы понять рекурсию, надо понять рекурсию.(цитата Nastya)
Цитата(12345c @  22.11.2006,  16:35 Найти цитируемый пост)
Ещё раз (3-й) опишу то, что Вы в упор не видите.

Зачем обижать меня?  smile 
Цитата(12345c @  22.11.2006,  16:35 Найти цитируемый пост)
element.className+=' hovered'

Я просто не знал что в css можно свойства через пробел задавать. Вот от сюда и пошло все... smile  Естественно, я знаю что такое "+=" smile 
Цитата(12345c @  22.11.2006,  16:35 Найти цитируемый пост)
Ещё понятно было бы, если без примера, а тут пример работает. "Давайте спорить о вкусе устриц с теми, кто их ел", а о неправильной работе примера - с теми, кто его видел.

4 раза прочитал, ничего не понял из смысла фразы, на пятый "ура". Наверное, переутомился сегодня. smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
GZep
Дата 22.11.2006, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



А вот еще вопросик:
Код

className += 'ИМЯ_ГДЕ НЕЛЬЗЯ ПОСИТЬ":"? ИЛИ МОЖНО?';

Ну, вопрос, собственно, в коде.


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SelenIT
Дата 22.11.2006, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



Возвращаясь к предыдущему вопросу, хочу сказать слово в поддержку GZepа - хоть на этот раз его опасения оказались заблуждением и тревога, к счастью, оказалась ложной, но дыма без огня не бывает - я тоже припоминал какие-то проблемы с применением нескольких классов в IE. Так и оказалось: у IE есть аж две проблемы - со стилями вида элемент.class1.class2.classn { /*стиль*/ } и #id.class1, #id.class1, ..., #id.classn. К счастью, оба варианта (особенно первый) достаточно экзотичны и не имеют ничего общего с данным случаем, но я считаю, что "лучше перебдить чем недобдить" и настороженность не была безосновательной!


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
GZep
Дата 22.11.2006, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Цитата(SelenIT @  22.11.2006,  19:18 Найти цитируемый пост)
слово в поддержку GZepа

Все видели? Вот так вот!
Кстати в вашем варианте заметил небольшой глюк, что ли или как его там лучше назвать...
Суть "глюка":
При наведении мышкой начинает намного страницу "колбасить", например, рамка вокруг флеш ролика(она в 7 версии ИЕ есть) начинает подмигивать глючно. Начало сильно раздражать, вернул код на вариант, который я выложил и назвал финальным - все супер. Ведь хоть и мой вариант сложнее редактировать под себя, но, согласитесь работать он должен чуточку быстрее.


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
GZep
Дата 23.11.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



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


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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