Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Глобальные переменные отлынивают (https://javascript.ru/forum/misc/11756-globalnye-peremennye-otlynivayut.html)

kukuyok 11.09.2010 23:14

Глобальные переменные отлынивают
 
Есть div с 3-мя полями input и одной кнопкой. Изначально невидимые, они появляются, если кликнуть на div'е. По заполнению инпутов всё это добро (по идее) исчезает, если кликнуть на кнопке. Адрес нужного дива ловлю следующим образом (внимание на глобальную, вроде бы, переменную tekItem)
<script type="text/javascript" charset="windows-1251;">
	tekItem;
	function activatron(tekElem)
	{
		tekItem = tekElem;
		var otkryvashka = new Array();
		otkryvashka = tekElem.getElementsByTagName('input');
		for(i=0;i<3;i++)
		{
			otkryvashka[i].style.display = 'block';
		}
		tekElem.getElementsByClassName('buttonka')[0].style.display = 'block';
		
	}
	
	function utverd()
	{
		var tekElem = tekItem;
		var zakryvashka = new Array();
		zakryvashka = tekElem.getElementsByTagName('input');
		for(i=0;i<3;i++)
		{
			zakryvashka[i].style.display = 'none';
		}
		tekElem.getElementsByClassName('buttonka')[0].style.display = 'none';
	}
</script>


на конпку навешена функция utverd(). Функцию activatron() запускаю в диве по onClick="...", передавая в неё 'this'.


Незадача: добро не исчезает...

Gvozd 11.09.2010 23:34

Цитата:

Сообщение от kukuyok
getElementsByClassName

это что такое?)
или вернее сказать, с чего вы решили что это будет работать во всех браузерах?

kukuyok 12.09.2010 00:11

Гммм... гмммм... нафантазировал, а потом ещё и нагуглил :write:

...правда ваша - FF, Opera да Chrome за милую душу уминают, IE - как всегда: не жриот...

Лады. Переведу её на id. Но вопрос-то, похоже, совсем не в этом... Как тут с глобальными переменными обстоит? По науке ли я тут требую от них помнить и чтить?

exec 12.09.2010 10:11

function toggle() {
	var t = document.getElementById( 'area' ).style;
	t.display = t.display == 'none' ? '' : 'none';
}


Оберните кнопки ещё в один DIV.
Эту функцию вешайте на onclick внешнего DIV'-а и кнопки. Всем инпутам уберите display: none. В атрибуте style внутреннего DIV'-а пропишите display: none.

kukuyok 12.09.2010 15:01

exec

'area' - это, я так понимаю, тот самый обёрточный div..? Да, вариант хороший, но у меня проблемы с позиционированием... в общем, код тела таков:

<div class="itemka" id="it01" style="z-index:99;" onclick="activatron(this);">
    <div class="avtomodel">
        <input type="textarea" id="am01" class="am_pole" value="Модель автомобиля" onfocus="select();" />
        Модель автомобиля
    </div>
        
    <div class="modchar">
        <input type="textarea"id="gp01" class="am_pole" value="Грузоподъёмность" onfocus="select();" />
        Грузоподъёмность	
    </div>
        
    <div class="bashlat">
        <input type="textarea" id="st01" class="am_pole"  value="Стоимость" onfocus="select();" /> 
        Стоимость    
    </div>
            
    <div class="buttonka">
        <input type="button" id="bt01" value="ОК" style="" onclick="utverd();" />     
    </div>
</div>


По-хорошему, ваше предложение - лишь оптимизация кода. И ей быть - но только после того, как мне станет понятно, почему не работает то, что, по-моему, должно работать. Да. Ещё раз - к сути вопроса. К теме. Глобальные. Переменные. Почему не работает?

kukuyok 12.09.2010 15:07

Есть предположение, что ответ прост: после выполнения скрипта в хедаре глобальниые переменные из него нивелируются... :-?

Gvozd 12.09.2010 15:34

Цитата:

Сообщение от kukuyok
после выполнения скрипта в хедаре глобальниые переменные из него нивелируются...

глупость написал.
Цитата:

Сообщение от kukuyok
Глобальные. Переменные. Почему не работает?

Глобальные. Переменные. Работают.

И разбираться за вас, что вы такого намудрили никто не станет
Поставьте фаербаг, и отлаживайте ваш код.
Так все делают, и с чего бы кто-то должен был за вас по кускам собирать ваш неработающий пример, чтобы узнать из-за какой гулпости он у вас не работает

kukuyok 12.09.2010 21:25

Пардон за настойчивый тон. Все предлагают оптимизацию кода, но никто не отвечает на вопрос. Вопрос поверхностный и не требует вдумываться в код. Никто не сказал, что моё представление о ходе выполнения скрипта верно или неверно (я ламер, СИшник). Попробую ещё раз, конкретней:


После загрузки html-документа в браузер выполняется его интерпретация, дело доходит до скриптов. В скрипте заводится глобальная переменная, где-то, используется, где-то меняется... бла-бла-бла... интерпретировали скрипт, отобразили страницу, молодцы. Когда я захочу баттоном обратиться к функции из этого скрипта - застану ли я глобальную переменную в её последнем по выполнению скрипта состоянии?

P.S.: как-то сложно, наверное, но пока не сориентировался, 2-й день ковыряюсь - засим плету, как могу :)

P.P.S.: глупость_написал.info == NULL

Gozar 12.09.2010 22:22

kukuyok,
Когда вы написали
activatron(this);

вы передали элемент
<div class="itemka" id="it01" style="z-index:99;" onclick="activatron(this);">
функции activatron

так вот вопрос - вы где так писать учились?
tekElem.getElementsByTagName('input');

Gozar 12.09.2010 22:29

ps: exec вам дело говорит, а то у вас код жуткострашный получается пока.

Gozar 12.09.2010 22:31

Цитата:

Сообщение от kukuyok (Сообщение 70589)
Пардон за настойчивый тон. Все предлагают оптимизацию кода, но никто не отвечает на вопрос. Вопрос поверхностный и не требует вдумываться в код. Никто не сказал, что моё представление о ходе выполнения скрипта верно или неверно (я ламер, СИшник).

в конце функции activatron поставте alert(tekItem) и узнаете ответ на свой вопрос. алерт покажет значение глобальной переменной tekItem.

kukuyok 12.09.2010 23:04

Цитата:

Сообщение от Gozar (Сообщение 70595)

так вот вопрос - вы где так писать учились?
tekElem.getElementsByTagName('input');

не виноватыя я - гугл попутал! :cray:

Чего все ощерились против этой конструкции? Сама функция не нравится? Или то, что в корне tekElem вместо document? Так у меня несколько дивов таких обёрточных на странице - а инпуты в данном надо активировать...

Цитата:

Сообщение от Gozar (Сообщение 70595)
ps: exec вам дело говорит, а то у вас код жуткострашный получается пока.

Конечно страшный! Я ведь его в два притопа - три прихлопа накидал. Освоение, так сказать, методом зарытиЯ :yes:

kukuyok 13.09.2010 01:08

Минабунга! Гран мерси, Gozar, за alert, который распихать по коду нужно было и самому догадаться..! Собака оказалась зарыта совсем не там, где её чаяли откапать! Выяснилась странная-подлая вещь: при клике на баттон сначала обрабатывается его событие onClick="...", маскирующее все инпуты, а потом... событие onClick="..." обёрточного дива, вновь показующее всю эту срамоту. Это лечимо, конечно, но... неужели при клике в какой-либо точке документа будут срабатывать все onClick'и элементов, обладающие этой точкой...?

Gvozd 13.09.2010 01:30

http://javascript.ru/tutorial/events...vaniya-sobytiy

kukuyok 16.09.2010 01:25

Ого-го! Эврика! Спасибо, Gvozd!


Часовой пояс GMT +3, время: 22:55.