Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: задать onmouseover скриптом
 
 автор: 1999   (24.02.2007 в 21:00)   письмо автору
 
 

продолжение темы http://softtime.ru/forum/read.php?id_forum=4&id_theme=33215&page=1

у меня есть некоторая ячейка в таблице - cell. у нее есть обработчики onMouseOver, onMouseOut и onClick. сперва мне надо было удалить эти обработчики. получилось это так:

    cell.onmouseout = "null";
    cell.onmouseout = "null";
    cell.onclick = "null";

теперь же понадобилось восстановить изначальные значения обработчиков. Для onMouseOver это например было так:

function hilite(cell)
{
    cell.className = "tab_hover";
}

пытался сделать так:

cell.onmouseover = "function onmouseover(event){hilite(this);}";

но что-то ничего не меняется. В чем пробюлема? подскажитеееее

   
 
 автор: 12345   (24.02.2007 в 21:28)   письмо автору
 
   для: 1999   (24.02.2007 в 21:00)
 

Кавычки не нужны - это не строка, а функция.
И null следует писать без кавычек, это константа такая. Только обработчик при этом останется, скорее всего, но не будет работать. Правильнее detachEvent и removeEventListener()

   
 
 автор: 1999   (24.02.2007 в 22:31)   письмо автору
 
   для: 12345   (24.02.2007 в 21:28)
 

без кавычек не идет - ругаетсо

Ошибка: missing ( before formal parameters
Источник: http://dc-1999/admin_script.js
Строка 38, Символ 43
Исходный код:
cell.onmouseover = function onmouseover {hilite(cells[i]);}


не хочет((

   
 
 автор: 1999   (24.02.2007 в 23:26)   письмо автору
 
   для: 1999   (24.02.2007 в 22:31)
 

вроде как работает.. непонятно правда потом учто не всегда.. буду разбираться
вот что непонятно%

if ( cells[i].className == "tab_active" )
        {
            cells[i].className = "tab";
            cells[i].onmouseover = function onmouseover() {cells[i].className="tab_hover";}
            cells[i].onmouseout = function onmouseout() {cells[i].className="tab";}
        }

ну проще некуда.. а ИЕ и ФФ выдают в 4 и 5 строчках (mouseover и mouseout) что у cells[i] нет такого св-ва как className


Собственно ф-ция выглядит так:

function process_click( cell,url )
{
    var cells = document.getElementById( "adv" ).getElementsByTagName( "TD" );

    for ( i=0;i<cells.length;i++ )
    {
        if ( cells[i].className == "tab_active" )
        {
            cells[i].className = "tab";
            cells[i].onmouseover = function onmouseover() {cells[i].className="tab_hover";}
            cells[i].onmouseout = function onmouseout() {cells[i].className="tab";}
        }
    }

    cell.className = "tab_active";
    cell.onmouseover = null;
    cell.onmouseout = null;

    window.location.href = url;
}

   
 
 автор: 12345   (24.02.2007 в 23:59)   письмо автору
 
   для: 1999   (24.02.2007 в 23:26)
 

Это классический "пролёт" при непонимании сути функций JS. Не Вы первый, так что всё в порядке :).

Как только возникает конструкция из 2 вложенных определений функций, необходимо вспомнить, что есть функция в JS и понятие closure для функции, что означает "замыкание". Так зовётся запомненная в функции функция, получившаяся после выхода из внешней. Доходчиво об этом написал Котеров в набле Куроводства с названием "Большие хитрости Javascript". (Ищите, советую прочитать.) Есть ряд статей (http://forum.vingrad.ru/index.php?showtopic=120066&view=findpost&p=926930) на английском, но на русском - раз, и обчёлся.

Функция, грубо говоря, - это текст функции с текстом списка параметров. Точно говоря, этот текст хранится в виде P-кода с указателями на названные переменные и объекты. Но в момент выхода из обрамляющей функции указатели вынуждены связаться, так как временные переменные перестают существовать. Связываются они с последними значениями этих переменных. Так создаётся closure.

Поэтому в cells[i].className мы имеем в момент исполнения process_click() не указатели на ячейки, а указатели на массив, почти буквально, как написано. Идиллия кончается, когда i перестаёт существовать. Его значение в этот момент, как легко видеть, cells.length. А чему равно значение cells[cells.length]? Правильно, ничему, потому что его длина - cells.length и последний индекс - (cells.length-1). В событиях получаются все одинаковые функции с одинаковыми превышенными индексами. У Котерова обыгран похожий пример.

У него же - способ решения требуемой задачи. Надо делать такую closure, чтобы сохранялись разные и правильные индексы.

Итого, правильно будет работать:

cells[i].onmouseover = new Function('cells['+i+'].className="tab_hover";');
Или у Котерова есть другой способ, через создание и связывание переменной в замыкании "ещё одного порядка", более глубокого, но это, что выше - более наглядно и кратко.

   
 
 автор: 1999   (25.02.2007 в 00:27)   письмо автору
 
   для: 12345   (24.02.2007 в 23:59)
 

жестко... и не работает)) пишет что cells[i] не существует)
а вобще конечно это да...

   
 
 автор: CNT   (25.02.2007 в 08:49)   письмо автору
 
   для: 1999   (25.02.2007 в 00:27)
 

Глава семьи Ивановых - Иван Иванович 1958 года рождения - своего первенца по семейной традиции нарёк Иваном. Родившегося в 1980 году второго мальчика тоже решили назвать Иваном. Таким образом в семье Ивановых сейчас живут целых три Ивана Ивановича - 58, 78 и 80 годов рождения... и когда жена старшего из Иванов Ивановичей говорит "Ваня!", в ответ она слышит троекратное "Ась?"...

Я это к тому, что cells - это существующая в JavaScript'e коллекция ячеек.
А onmouseover и onmouseout - тоже существующие в JavaScript'e события.

Зачем насиловать парсер браузера, заставляя его каждый раз напрягаться, чтобы сообразить - какого из "иван ивановичей" вы зовёте в каждом конкретном случае?
Если парсер пишет, что "cells [i] не существует", то... кто может с уверенностью ответить - о "вашем" массиве он пишет, либо о "своей" коллекции ячеек?

Напрягите фантазию и придумайте уникальные названия для создаваемых вами объектов (переменных, массивов, функций...).

   
 
 автор: 1999   (25.02.2007 в 10:28)   письмо автору
 
   для: CNT   (25.02.2007 в 08:49)
 

я и не знал...спасибо всем ответившим) все рабортает

   
 
 автор: Padonak   (25.02.2007 в 10:57)   письмо автору
 
   для: 1999   (25.02.2007 в 10:28)
 

вижу разобрались уже. немного припоздал я но раз уж сделал тебе пример то все равно линк выложу:

сцылко

cell[i] будет всегда существовать если к нему правильно обращатцо :-)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования