|
|
|
| продолжение темы 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);}";
|
но что-то ничего не меняется. В чем пробюлема? подскажитеееее | |
|
|
|
|
|
|
|
для: 1999
(24.02.2007 в 21:00)
| | Кавычки не нужны - это не строка, а функция.
И null следует писать без кавычек, это константа такая. Только обработчик при этом останется, скорее всего, но не будет работать. Правильнее detachEvent и removeEventListener() | |
|
|
|
|
|
|
|
для: 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 в 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;
}
|
| |
|
|
|
|
|
|
|
для: 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";');
| Или у Котерова есть другой способ, через создание и связывание переменной в замыкании "ещё одного порядка", более глубокого, но это, что выше - более наглядно и кратко. | |
|
|
|
|
|
|
|
для: 12345
(24.02.2007 в 23:59)
| | жестко... и не работает)) пишет что cells[i] не существует)
а вобще конечно это да... | |
|
|
|
|
|
|
|
для: 1999
(25.02.2007 в 00:27)
| | Глава семьи Ивановых - Иван Иванович 1958 года рождения - своего первенца по семейной традиции нарёк Иваном. Родившегося в 1980 году второго мальчика тоже решили назвать Иваном. Таким образом в семье Ивановых сейчас живут целых три Ивана Ивановича - 58, 78 и 80 годов рождения... и когда жена старшего из Иванов Ивановичей говорит "Ваня!", в ответ она слышит троекратное "Ась?"...
Я это к тому, что cells - это существующая в JavaScript'e коллекция ячеек.
А onmouseover и onmouseout - тоже существующие в JavaScript'e события.
Зачем насиловать парсер браузера, заставляя его каждый раз напрягаться, чтобы сообразить - какого из "иван ивановичей" вы зовёте в каждом конкретном случае?
Если парсер пишет, что "cells [i] не существует", то... кто может с уверенностью ответить - о "вашем" массиве он пишет, либо о "своей" коллекции ячеек?
Напрягите фантазию и придумайте уникальные названия для создаваемых вами объектов (переменных, массивов, функций...). | |
|
|
|
|
|
|
|
для: CNT
(25.02.2007 в 08:49)
| | я и не знал...спасибо всем ответившим) все рабортает | |
|
|
|
|
|
|
|
для: 1999
(25.02.2007 в 10:28)
| | вижу разобрались уже. немного припоздал я но раз уж сделал тебе пример то все равно линк выложу:
сцылко
cell[i] будет всегда существовать если к нему правильно обращатцо :-) | |
|
|
|