Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   Onchange в attachevent срабатывает не с первого раза. (https://javascript.ru/forum/css-html-internet-explorer/30846-onchange-v-attachevent-srabatyvaet-ne-s-pervogo-raza.html)

platedz 18.08.2012 04:32

В общем и целом все оказалось не так просто.

При попытке заменить этот код
topmenu = (function(window) {
return {
			sub: function(elem,type,block) 
				{
				
			


						try { 
								try {

									elem.addEventListener(type, block, false);

								} catch(e) {

									elem.attachEvent("on"+type, block);

								}
							} catch(e){}



				}
	}

}(window));


на

topmenu = (function(window) {
return {
			sub: function(elem,type,block) 
				{
					elem["on"+type] = block;

				}
	}

}(window));

elem is undefined

Соответственно вопрос. Почему? И как можно решить эту проблему?

Также остался вопрос по поводу change в attachevent. Очень надеюсь на Ваши знания и опыт уважаемые специалисты.

Deff 18.08.2012 12:42

platedz,
<script>
topmenu = (function(window) {
return {
			sub: function(elem,type,block) 
				{
				
                        elem["on"+type] = block;

				}
	}

}(window));

alert(topmenu.sub.toString())

</script>



<script>
topmenu = (function(window) {
return {
			sub: function(elem,type,block) 
				{


			elem["on"+type] = block	
                        alert('elem[on'+type+']='+elem["on"+type])

				}
	}

}(window));
New_elem=[]
topmenu.sub(New_elem,2,3)

</script>


elem, вводимый в функцию - должен быть заранее определён как массив (или определяйте внутри функции

platedz 18.08.2012 23:23

Спасибо за ответ. Честно говоря я не очень понял, при чем здесь массив. Вы наверное не верно поняли код. В вашем коде получается, что дожна произойти функция 3, при наступлении события 2, на элементе New_elem.

Вообще проблема была в том, что я возвращал через функцию элемент, что в общем то и должно было вызывать ошибку, учитывая, что элемент отсутствовал. Странно, что когда я не возвращал элемент, а исполнял на него функцию ошибки не происходило.

Deff 18.08.2012 23:29

Цитата:

Сообщение от platedz
Честно говоря я не очень понял, при чем здесь массив.

Внутри функции вы работаете с elem как с массивом или объектом
elem["on"+type]

Это где-то должно быть определено! (или в глобале или внутри функции

vadim5june 19.08.2012 00:41

Цитата:

Сообщение от platedz
Вообще я отказался пока от addEventListener и attachEvent. Честно говоря не очень понимаю, зачем они нужны и в чем их преимущество перед On+событие. Может мне кто-нибудь объяснит. Буду крайне признателен.

addEventListener позволяет на одно событие вешать несколько обработчиков а elem.onclick=func-только один обработчик
если это не существенно то разницы нет

platedz 19.08.2012 01:49

Спасибо. В этом случае решил все-таки пока оставить addEventListener.
Жаль, что так и не удалось решить проблему с change в нем.
Может кто-нибудь все-таки подскажет ответ.

platedz 19.08.2012 01:56

Цитата:

Сообщение от Deff (Сообщение 198659)
Внутри функции вы работаете с elem как с массивом или объектом
elem["on"+type]

Это где-то должно быть определено! (или в глобале или внутри функции

Извините, может я что-то недопонимаю.
elem["on"+type]
это тоже самое что и
document.getElementById("id")["onclick"]
Т.е. это способ обратиться к объекту.
Насколько я понимаю, свойство onclick может быть только у объекта, а не у массива.
При этом сам по себе объект уже определен как объект, наверное.

vadim5june 19.08.2012 08:34

Цитата:

Сообщение от platedz (Сообщение 198680)
Спасибо. В этом случае решил все-таки пока оставить addEventListener.
Жаль, что так и не удалось решить проблему с change в нем.
Может кто-нибудь все-таки подскажет ответ.

Попробуйте переставьте строки
document.getElementById("inpField").click();
document.getElementById("inpField").attachEvent(...

местами-сначала назначаем обработчик-потом кликаем
хотя если заменить на addEventListener-в хроме работает с первого раза и так
Если не будет работать-то возможно проблема в безопасности-они считают что юзер сам должен кликнуть на кнопку-а не програмно это делать


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