Начало · Справочники · Курсы · Разговоры

leechy.ru · Сайт почти придуман

onMouseOver или (!NN4)

В этот раз камнем преткновения стало событие onmouseover, которое в 4ом Нетскейпе обрабатывается только 2мя тэгами <a> (или <area>) и <layer>.

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

Решение вначале было очевидным, но написав часть кода, которая выполняла задачу в IE на «ура», и приступив к написанию NN4-части я столкнулся с проблемой. Как уже говорилось выше, в NN4 onmouseover понимают лишь <a> и <layer>. Но <layer> как написано в документации, создает слой с position: absolute, если же нам нужен «relative»-слой, то нужно воспользоваться специально предназначенным для этого тэгом <ilayer>. И там же говорилось, что оба эти тэга идентичны, но за исключением лишь одного: один — relative, другой — absolute (в доке даже не было разделения на layer / ilayer и описание было одно на оба тэга).

Практика же показала, что эта «идентичность» не совсем стопроцентная :)

Выяснилось, что <ilayer> понимает лишь одно единственное событие onload! Никаких onMouseOver'ов!!

Тут сложилась какая-то непонятная ситуация, с одной стороны в доке говорится что onmouseover понимают лишь <a> и <layer>, и, соотвественно, понимания в ilayer никто не обещал, с другой говорится что <layer> и <ilayer> одно и тоже, хотя на практике оказывается, что далеко нет. В общем и не подкапаешься, и не сделаешь все как надо. Но мне-то от этого не легче — сроки то горят, задачу нужно выполнять.

Признаюсь, я люблю извращения, но не настолько, чтобы ради одного единственного onmouseover считать координаты ячейки, а потом вписывать в эту ячейку свежесозданный layer'ом слой, который-таки будет реагировать на onmouseover (как считать координаты ячейки и заполнять ее, подробно расписано в статье «Как сделать текстовый rollover»).

После получения этой противоречивой информации проблема свелась к следующему: как заставить <layer> быть не «absolute», а быть «relative», или как заставить <ilayer> понимать onmouseover. Одно из двух. После абсолютно бесплодных попыток указать стилями тэгу «layer», где ему жить, я решил подойти с другого конца, а именно, заставить <ilayer> понимать onmouseover. К сожалению ни то, ни другое не удалось. Не удалось еще много чего.

Но одно из многих извращений, которые не сработавали, а именно:

<a href="#" onmouseover="alert('test')"> 
	<td>text</td>
</a> 

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

Победоносный код выглядел так:

<td>
	<ilayer>
		<layer onmouseover="alert('ура-ура!')">здесь текст</layer>
	</ilayer>
</td>

Задача решалась на все 100%. «Текст» лежал в слое, который был «relative» (и все это было в нужном месте — внутри ячейки), но самое главное, эта конструкция реагировала на onmouseover! Ура! ;)

Омрачило лишь одно: после создания этого шедевра, я почувствовал себе гением, и решил посмотреть, а может я действительно гений? Оказалось мне еще расти: Яндекс на запрос «ilayer layer onmouseover» выдавал 1222 страницы, а на первом месте стояла страница с конструкцией на 100% повторяющей только что придуманную мной (ну только слова «ура-ура» и «здесь текст» были там соотвественно другие ;)...

Обсудить в форуме