Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Два симметричных setTimeOut / 12 сообщений из 12, страница 1 из 1
28.02.2009, 20:48
    #35844172
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два симметричных setTimeOut
Ваяю тут, понимаете, менюшку... И вот незадача: есть две функции (одна по засвечиванию, другая - по тушению менюшного блока), код практически идентичен:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
function hlight_sub (obj) {
	obj.className="sub_title sub_highlighted";
	var parent_id = get_parent_item_id(obj);
	var parent_item = get_parent_item(obj);
    if (parent_id.indexOf("sub") == - 1 ) {
		if (parent_item.className != "main_title main_highlighted") { 
			parent_item.className = "main_title main_highlighted"; 
		}
	}
	if (parent_id.indexOf("sub") != - 1 ) { hlight_sub(parent_item); }
	own_div = get_own_div(obj);
	if (own_div)	{
		if (own_div.indexOf("sub") != - 1 ) {
			document.getElementById(own_div).style.visibility = 'visible';
		}
	}
	parent_div = get_parent_div(obj);
	if (parent_div)	{
		if (parent_div.indexOf("sub") != - 1 ) {
			document.getElementById(parent_div).style.visibility = 'visible';
		}
	}
	id = obj.id;
	if (hide) { window.clearTimeout(hide); hide =  0 ; }
       show = window.setTimeout("hlight_div(id)", 500 );
}

function unhlight_sub (obj) {
	obj.className="sub_title";
	var parent_id = get_parent_item_id(obj);
	var parent_item = get_parent_item(obj);
    if (parent_id.indexOf("sub") == - 1 ) {
		if (parent_item.className != "main_title") { 
		parent_item.className = "main_title"; 
		}
	}
	else { unhlight_sub(parent_item); }
	own_div = get_own_div(obj);
	if (own_div)	{
		if (own_div.indexOf("sub") != - 1 ) {
			document.getElementById(own_div).style.visibility = 'hidden';
		}
	}
	parent_div = get_parent_div(obj);
	if (parent_div)	{
		if (parent_div.indexOf("sub") != - 1 ) {
			document.getElementById(parent_div).style.visibility = 'hidden';
		}
	}
	id = obj.id;
	if (show) { window.clearTimeout(show); show =  0 ; }
	hide = window.setTimeout("unhlight_div(id)", 500 );
}

Естественно, нужно сделать так, чтобы блоки засвечивались и тушились с небольшой задержкой, а не моментально. А получается, что засвечиваются они с задержкой (нормально, как и требуется, первый таймаут работает), но не тушатся совсем! Т.е. таймаут из функции unhlight_sub не работает. Если ставлю вызов unhlight_div без таймаута, напрямую, то тогда тушение работает, но, конечно же, моментально, а не с задержкой, как нужно. Кто что может присоветовать?
...
Рейтинг: 0 / 0
02.03.2009, 01:44
    #35845066
illion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два симметричных setTimeOut
Вы неверно передаете параметр в функцию hlight_div и unhlight_div. Вызовы а-ля window.setTimeout("unhlight_div(id)",500); работают лишь за счет того, что id - глобальный параметр. Но если в этот самый период 500 мс будет вызвана ф-ция hlight_sub, то и id изменится, а вместе с ним и глобальные параметры hide и show.

id должен быть локальным (var id), формировать вызов тогда так: "unhlight_div("+id+")". От глобальных hide и show нужно избавиться, сделав их свойствами объекта obj (obj.hide и obj.show) (если они вообще нужны здесь). Также желательно избавиться от двух пар практически одинаковых функций hlight_sub-unhlight_sub и hlight_div-unhlight_div, заменив каждую пару на одну функцию, в которую будет передаваться дополнительный параметр скрыть/показать, определяющий, чему будет равно className и visibility.
...
Рейтинг: 0 / 0
02.03.2009, 08:12
    #35845139
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два симметричных setTimeOut
illion,

Спасибо, я попробую переделать.
...
Рейтинг: 0 / 0
02.03.2009, 08:17
    #35845140
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два симметричных setTimeOut
illionid должен быть локальным (var id), формировать вызов тогда так: "unhlight_div("+id+")".

Сразу облом: с локальным id и с вызовом в такой конструкции даже работавший ранее hlight_div перестал работать :(
...
Рейтинг: 0 / 0
02.03.2009, 08:53
    #35845178
illion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два симметричных setTimeOut
ага, еще кавычки нужны, чтоб строку обозначить
Код: plaintext
"unhlight_div('"+id+"')"
...
Рейтинг: 0 / 0
02.03.2009, 10:15
    #35845299
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два симметричных setTimeOut
Сделал вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
function switch_sub (obj,flag) {
	obj.className = flag ? "sub_title sub_highlighted" : "sub_title";
	var parent_id = get_parent_item_id(obj);
	var parent_item = get_parent_item(obj);
	if (parent_id.indexOf("sub") == - 1 ) { 
		if (flag) { hlight_main(parent_item); } else { unhlight(parent_item); } }
	else { switch_sub(parent_item,flag); }
	var own_div = get_own_div(obj);
	if (own_div) {
		if (own_div.indexOf("sub") != - 1 ) {
			document.getElementById(own_div).style.visibility = flag ? 'visible' : 'hidden';
		}
	}
	var parent_div = get_parent_div(obj);
	if (parent_div)	{
		if (parent_div.indexOf("sub") != - 1 ) {
			document.getElementById(parent_div).style.visibility = flag ? 'visible' : 'hidden';
		}
	}
	var id = obj.id;
    window.setTimeOut("switch_div('"+id+"','"+flag+"')", 500 );
}

Не работает :(
...
Рейтинг: 0 / 0
02.03.2009, 10:51
    #35845411
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два симметричных setTimeOut
Ага, setTimeout неправильно написал (с большой буквой "O"). Заработал задержанный показ сабменюшки, а изчезновение так и не работает - блин, это какое-то проклятье! :(
...
Рейтинг: 0 / 0
02.03.2009, 11:15
    #35845476
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два симметричных setTimeOut
Выяснилось, что не срабатывает функция switch_div при flag==0. Исходник:

Код: plaintext
1.
2.
3.
4.
function switch_div (id,flag) {
	var obj_sub = document.getElementById(id+"sub"); 
	if (obj_sub) { obj_sub.style.visibility = flag ? 'visible' : 'hidden'; }
}

При flag==1 почему-то все срабатывает нормально, а вот при нуле даже напрямую (без таймаута) не хочет.
...
Рейтинг: 0 / 0
02.03.2009, 11:33
    #35845516
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два симметричных setTimeOut
obj_sub.style.visibility == flag ? 'visible' : 'hidden';
...
Рейтинг: 0 / 0
02.03.2009, 11:44
    #35845548
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два симметричных setTimeOut
IDVsbruckobj_sub.style.visibility == flag ? 'visible' : 'hidden';

Так вообще ничего не работает. А почему "==", если нам нужно присваивание , а не сравнение?
...
Рейтинг: 0 / 0
02.03.2009, 15:46
    #35846406
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два симметричных setTimeOut
А вы таки уверены, что вам надо это писать в голом жабоскрипте?
Потому как в любом нормальном фреймворке это будет пара строк куда более читаемого кода.
...
Рейтинг: 0 / 0
02.03.2009, 15:59
    #35846454
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два симметричных setTimeOut
DocAl,

Как новичок в веб-программировании, я, конечно же, не уверен. Дело в том, что это пишется для динамической менюшки форума, где пунктами меню будут подфорумы. В движок будет встроен модуль на php, который будет читать базу и выдавать на-гора несколько жабаскриптовых строк вида

Код: plaintext
1.
2.
Menu[ 0 ] = new MenuItem("Раздел 1","", 0 );
Menu[ 0 ].AddSubMenuItem("Раздел 1 - Подраздел 1","");

после чего браузер пользователя подхватит это дело и отобразит. Применим ли здесь фреймворк? Не уверен...
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Два симметричных setTimeOut / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]