className свойство в IE6 не работает

Zigfrid

Новичок
className свойство в IE6 не работает

Добрый день

Отчего то не работает className свойство в IE6. В Mozilla работает нормально.
При возникновении события onBlur, задний фон объекта someForm должен изменить цвет. Объект - это строка ввода текста <input>. Цвет берётся из styles.css.

styles.css
PHP:
.errorField
{
background:#FF3333;
}
script.js
PHP:
var someForm = document.getElementById(idForm);					
someForm.className = "errorField";
Вычитал, что IE воспринимает изменения стилей только через className. Свойство style.backgroundColor - он не понимает.

У кого-нибудь есть какие-то идеи по этому поводу?
 

maxwell

artifex
Лгут. Все он понимает.
PHP:
<input type=text onBlur="this.style.background = '#000000'" onFocus="this.style.background = '#FFFFFF'">
 

Zigfrid

Новичок
К сожалению ИЕ так тоже не понимает:

PHP:
someForm.style.backgroundColor = "#FF3333";
 

kruglov

Новичок
Что есть someForm? А то, может, вы фон у картинок непрозрачных меняете?
 

Zigfrid

Новичок
IE 6.0 sp2

попробовал просто вставить Ваш код в сайт
PHP:
<input type=text onBlur="this.style.background = '#000000'" onFocus="this.style.background = '#FFFFFF'">
Мозилла отобразила поле редактирование и изменения цвета в поле происходит корректно.ИЕ даже поле не показал :)
Тут я ошибся. Отображается и в ИЕ, и в Мозилле код нормально.

Сейчас буду пытаться куски своего кода сюда выложить.

Кстати забыл написать. Возможно это важно. Поле, в котором необходимо менять цвет, создаётся у меня динамически.

-~{}~ 22.02.08 16:21:

Автор оригинала: kruglov
Что есть someForm? А то, может, вы фон у картинок непрозрачных меняете?
someForm - это строка ввода текста <input>.

-~{}~ 22.02.08 16:54:

Кажется я понял в чём проблема. :)
По результату её исправления отпишусь.

-~{}~ 04.03.08 17:34:

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

PHP:
//Если используется Мозилла
if (navigator.appName == "Netscape") {
     formInput.setAttribute("onBlur","onPoleBlur(event,'nomn')");
     }				     
     //Если используется ИЕ
     else if (navigator.appName == "Microsoft Internet Explorer"){
          formInput.onblur = function() {onPoleBlur(event, "nomn");};
          }
Кстати, может кто-то посоветует какой-то справочник, в котором указано - какие функции использовать для ИЕ, а какие для Мозиллы ?
 

dimagolov

Новичок
Zigfrid... обработчики события можно устанавливать по-разному, но только не через setAttribute.
если цеплять единственный обработчик на событие, то для кросброузерности достаточно obj.onevent= funcexpr;
 

Zigfrid

Новичок
Автор оригинала: dimagolov
Zigfrid... обработчики события можно устанавливать по-разному, но только не через setAttribute.
если цеплять единственный обработчик на событие, то для кросброузерности достаточно obj.onevent= funcexpr;
Т.е., если я правильно понял, то для обоих броузеров достачно будет следующего выражения:
PHP:
formInput.onblur = function() {onPoleBlur(event, "nomn");};
 

kruglov

Новичок
Zigfrid
если я правильно понял
А что, пробовали и не получилось? А что только для обоих браузеров пишете? А как же Эксплорер с Мозиллой? Не надо ограничиваться только Оперой и Сафарей.
 

Zigfrid

Новичок
Вот, как раз в Мозилле (2.0.0.12) и не получилось.
Выдало ошибку : event is not defined
Пишу я для ИЕ и Мозиллы.
 

kruglov

Новичок
Ну так то event.

Вам его зачем вообще в onPoleBlur() передавать?
 

dimagolov

Новичок
PHP:
function onPoleBlur() {
}

formInput.onblur= onPoleBlur; // В этом случае this в onPoleBlur будет указывать на formInput

formInput.onblur= function () { // То же самое через декларацию анонимной ф-ии
// do something
};
 

Zigfrid

Новичок
Автор оригинала: kruglov
Ну так то event.

Вам его зачем вообще в onPoleBlur() передавать?
А я через event передаю значение поля в другую функцию.
event.target.value
которое потом проверяется в пхп и, если содержимое правильное, поле становится зелёным, неправильное - красным

-~{}~ 05.03.08 16:40:

Автор оригинала: dimagolov
PHP:
function onPoleBlur() {
}

formInput.onblur= onPoleBlur; // В этом случае this в onPoleBlur будет указывать на formInput

formInput.onblur= function () { // То же самое через декларацию анонимной ф-ии
// do something
};
А Вы не знаете, почему через 2-й вариант не передаётся event?
PHP:
formInput.onblur = function() {onPoleBlur(event, "nomn");};
ругается: event is not defined
 

dimagolov

Новичок
Zigfrid, потому что для того, чтобы был event надо вешать обработчик по-новому, вот так (заодно там определяется для элемента ф-я fireEvent, чтобы можно было руцями запускать обработчики, потому что по-старому (aObj.onclick() или aObj.click()) при таким образом повешенных обрабочиках не прокатывает):
PHP:
// основные идеи и код взяты с http://forum.dklab.ru/js/other/
function addHandler (aObj, sEvent, aFunc) { // sEvent == onEventName
	if (aObj.addEventListener) {
		aObj.addEventListener(sEvent.substr(2), aFunc, false);
	}
	if (aObj.attachEvent) {
		try {
			aObj.attachEvent(sEvent, aFunc);
		} catch (aEx) {}
	}
	if (!aObj.fireEvent)
		aObj.fireEvent = function (e) {
      var eventTypes = { resize : ['HTMLEvents',1,0],
                       scroll : ['HTMLEvents',1,0],
                       focusin : ['HTMLEvents',0,0],
                       focusout : ['HTMLEvents',0,0],
                       gainselection : ['HTMLEvents',1,0],
                       loseselection : ['HTMLEvents',1,0],
                       activate : ['HTMLEvents',1,1],
                       //events above should be UIEvents, but Mozilla
                       //seems does not support this type
                       load : ['HTMLEvents',0,0],
                       unload : ['HTMLEvents',0,0],
                       abort : ['HTMLEvents',1,0],
                       error : ['HTMLEvents',1,0],
                       select : ['HTMLEvents',1,0],
                       change : ['HTMLEvents',1,0],
                       submit : ['HTMLEvents',1,1],
                       reset : ['HTMLEvents',1,0],
                       focus : ['HTMLEvents',0,0],
                       blur : ['HTMLEvents',0,0],
                       click : ['MouseEvents',1,1],
                       mousedown : ['MouseEvents',1,1],
                       mouseup : ['MouseEvents',1,1],
                       mouseover : ['MouseEvents',1,1],
                       mousemove : ['MouseEvents',1,0],
                       mouseout : ['MouseEvents',1,0],
                       keypress : ['KeyEvents',1,1],
                       keydown : ['KeyEvents',1,1],
                       keyup : ['KeyEvents',1,1],
                       DOMSubtreeModified : ['MutationEvents',1,0],
                       DOMNodeInserted : ['MutationEvents',1,0],
                       DOMNodeRemoved : ['MutationEvents',1,0],
                       DOMNodeRemovedFromDocument : ['MutationEvents',0,0],
                       DOMNodeInsertedIntoDocument : ['MutationEvents',0,0],
                       DOMAttrModified : ['MutationEvents',1,0],
                       DOMCharacterDataModified : ['MutationEvents',1,0]
                     };
      var self = this;
      e = e.substr(2);
      if (!eventTypes[e]) return false;
      var evt = document.createEvent(eventTypes[e][0]);
      evt.initEvent(e,eventTypes[e][1],eventTypes[e][2]);
      return self.dispatchEvent(evt);
		};
 }
но тут есть засада. обработчиков может быть более одного и порядок их исполнения неопределен.

-~{}~ 05.03.08 11:49:

ага, пользоваться этим так:
PHP:
	function KbdHandler (event) {
		var oI= event.srcElement; // Это собственно элемент на котором событие
		..... // тут код
	}

	addHandler(oMyInput, 'onkeydown', KbdHandler);
 

dimagolov

Новичок
kruglov
это уже другой вопрос. как и то, что этот this будет указывать на элемент.
а передавать его надо только тогда, когда обработчик назначаем inline-ово:
PHP:
<input onclick="myfunc(this);">
если же мы цепляем его так:
PHP:
getElementById('MyId').onclick= myfunc;
то просто при возникновении события в теле ф-ии this будет опять таки смотреть на элемент.
это все от того, как обрабатываются инлайновые обработчики событий. на самом деле при генерации DOM для элемента в котором есть инлайновый обработчик JS исполняет типа такого:
PHP:
element.onclick= new Function ("myfunc(this);");
 

Zigfrid

Новичок
Автор оригинала: dimagolov
ага, пользоваться этим так:
PHP:
	function KbdHandler (event) {
		var oI= event.srcElement; // Это собственно элемент на котором событие
		..... // тут код
	}

	addHandler(oMyInput, 'onkeydown', KbdHandler);
Автор оригинала: kruglov this надо передавать, а не event
Если я Вас правильно понял, то обработчик событий необходимо создавать след. образом
PHP:
formInput.addEventListener('blur', function() {onPoleBlur(event, "nomn");}, false);
нашел в инете хорошую статью по этому поводу
http://www.quirksmode.org/js/events_advanced.html
Но в этом случае опять же, для Мозиллы надо использовать одну функцию (addEventListener()), а для ИЕ - другую (attachEvent()).

Решил остановиться на следующем варианте
PHP:
formInput.onblur = function() { onNomnBlur(this, "nomn"); };
Работает и в ИЕ, и в Мозилла.

Спасибо dimagolov и kruglov. Помогли мне :)
 

dimagolov

Новичок
Zigfrid, во-первых, ты мой код вообще смотрел? там как раз для кросброузерности все прописано
во-вторых, а набуя тебе замыкание делать, что за параметр такой ценный "nomn" которых надо обязательно передать в обработчик. это я к тому, что если бы не он, то написал бы
PHP:
formInput.onblur = onNomnBlur;
а в onNomnBlur просто бы обращался к элементу, на котором произошло событие, через this
 

Zigfrid

Новичок
Автор оригинала: dimagolov
Zigfrid, во-первых, ты мой код вообще смотрел? там как раз для кросброузерности все прописано
во-вторых, а набуя тебе замыкание делать, что за параметр такой ценный "nomn" которых надо обязательно передать в обработчик. это я к тому, что если бы не он, то написал бы
PHP:
formInput.onblur = onNomnBlur;
а в onNomnBlur просто бы обращался к элементу, на котором произошло событие, через this
Я смотрел, но, чесно говоря, не всё понял (это мое 1-е приложение на JS). Поэтому по ключевым функциям из Вашего кода нарыл в инете ту статью :)

На самом деле, я передаю 4 параметра. Просто я сократил немного код. Передаются: Id элемента, на котором произошло событие Blur; содержимое элемента; название поля в таблице БД и номер записи в в таблице БД, откуда бралось изначальное значение элемента.
Последние 3 параметра передаются в ПХП. Там значение элемента проверяется. Если оно удовлетворяет всем условиям, то элемент на форме будет зелёным, не удовлетворяет - красным. Приблизительно так :)
Id элемента и содержимое элемента, действительно можно брать через this, но остальные 2 параметра через this из элемента не вытащить - они в нем не содержатся.
 

dimagolov

Новичок
Автор оригинала: Zigfrid
Я смотрел, но, чесно говоря, не всё понял (это мое 1-е приложение на JS). Поэтому по ключевым функциям из Вашего кода нарыл в инете ту статью :)
то, что я выложил - готовое решение, которым при необходимости можно просто воспользоваться, а статью почитайте чтобы понять чем эта "новая" реализация обработки событий отличается от "старой", в которой объекта event нету.

Автор оригинала: Zigfrid
Id элемента и содержимое элемента, действительно можно брать через this, но остальные 2 параметра через this из элемента не вытащить - они в нем не содержатся.
ну и что, что не содержаться? делаем глобальный массив, в который кладем массивы new Array (id, param1, param2), по которому обработчик будет пробегать и если нашел id, то получать и обрабатывать параметры. несомненный плюс такого решения, что все параметры будут задаваться в одном месте, а не будут рассыпаны по html коду декларации inline-обработчиков. не думаю, что инпутов будет столь много, что перебор массива в цикле будет как-то влиять на производительность.
ну а вешать обработчик можно будет вообще в цикле по коллекции полученной через getElementsByTagName
 
Сверху