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

Код: 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
Два симметричных setTimeOut
    #35845066
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы неверно передаете параметр в функцию 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
Два симметричных setTimeOut
    #35845139
deGeneral
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
illion,

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

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

Код: 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
Два симметричных setTimeOut
    #35845411
deGeneral
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага, setTimeout неправильно написал (с большой буквой "O"). Заработал задержанный показ сабменюшки, а изчезновение так и не работает - блин, это какое-то проклятье! :(
...
Рейтинг: 0 / 0
Два симметричных setTimeOut
    #35845476
deGeneral
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выяснилось, что не срабатывает функция 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
Два симметричных setTimeOut
    #35845516
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
obj_sub.style.visibility == flag ? 'visible' : 'hidden';
...
Рейтинг: 0 / 0
Два симметричных setTimeOut
    #35845548
deGeneral
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IDVsbruckobj_sub.style.visibility == flag ? 'visible' : 'hidden';

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

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

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

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


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