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 02:16

Onchange в attachevent срабатывает не с первого раза.
 
Вот собственно код
document.getElementById("apslaed").attachEvent("onclick",function()
			{
			
				var newElem = document.createElement("div");
				newElem.id = "sizeslide";
				newElem.innerHTML = "<form id=\"fileload\" action=\"#\" method=\"post\" enctype=\"multipart/form-data\"><input type=\"file\"  name=\"anyfile\" id=\"inpField\"/></form>";
				document.body.insertBefore(newElem, document.body.firstChild);
				document.getElementById("inpField").click();
				document.getElementById("inpField").attachEvent("onchange", function(){alert("34343");});
});

Необходимо выполнить функцию после выбора пользователем файла, из динамически созданной формы. Само событие onchange в данном случае работает, если файл выбрать повторно, но все должно происходить сразу. Помогите, пожалуйста, разобраться.

Deff 18.08.2012 02:34

:) Так проще
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

</head>
<body>


<div id="apslaed">Клик</div>
<script type="text/javascript">
function Onchange(Th){
  
  alert('3434');
  alert(Th.value)
}
document.getElementById("apslaed").attachEvent("onclick",function()
			{
			
				var newElem = document.createElement("div");

				newElem.id = "sizeslide";
				newElem.innerHTML = "<form id=\"fileload\" action=\"#\" method=\"post\" enctype=\"multipart/form-data\"><input type=\"file\"  name=\"anyfile\" id=\"inpField\" onchange=\"Onchange(this)\"/></form>";
				document.body.insertBefore(newElem, document.body.firstChild);
				
});

</script>



</body>
</html>

platedz 18.08.2012 03:07

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

platedz 18.08.2012 03:10

Еще вот так работает
document.getElementById("inpField").onpropertychange = function(){}


Может какое-либо другое событие необходимо использовать в attachEvent, или в чем может быть причина?

Deff 18.08.2012 03:26

Цитата:

Сообщение от platedz
Кроме прочего, через attachevent я наверное могу переназначить функцию на данное событие.


platedz,
:) А чем хуже в моём Варианте ? Переопределить просто функцию Onchange(Th) для данного события

*Просто к инфе для размышлений

platedz 18.08.2012 03:40

Цитата:

Сообщение от Deff (Сообщение 198426)
platedz,
:) А чем хуже в моём Варианте ? Переопределить просто функцию Onchange(Th) для данного события

*Просто к инфе для размышлений

Как таковой вариант вполне нормальный, и для текущей цели в общем-то его пока достаточно. Хотя мне не очень ясно как в данном случае переопределить функцию. Скажем я хочу при генерации формы после выбора файла выполнить одну функцию, а во все остальные разы другую???

Вообще в этом плане мне кажется использование addEventListener и attachEvent оказывается не совсем удобно, а в данном случае и вовсе неудобно. Более логичным возможно использовать элемент[событие] = функция.

Deff 18.08.2012 03:43

Цитата:

Сообщение от platedz
Хотя мне не очень ясно как в данном случае переопределить функцию

platedz,
Onchange=function (Th) { 
	    
	  alert('ИИ'); 
 
}

platedz 18.08.2012 03:51

Цитата:

Сообщение от Deff (Сообщение 198429)
platedz,
Onchange=function (Th) { 
	    
	  alert('ИИ'); 
 
}

Дело в том, что я создаю несколько форм. Т.е. создаю форму, выбираю файл, выполняю функцию. Если пользователь хочет снова выбрать файл, выполняю другую функцию, действия закончились, файл обработан. форма удаляется. Пользователь хочет выбрать еще один файл. Получается функцию снова надо переопределить в первоначальное состояние. А так у меня есть не предопределенные функции которые я использую в зависимости от условий, т.е. при нажатии на кнопку когда форма создается, и при нажатии на кнопку самой формы. Могу использовать разные предопределенные функции. Наверное так, хотя я еще не пробовал и до этого не дошел.

Deff 18.08.2012 03:55

platedz,
Цитата:

Сообщение от platedz
Получается функцию снова надо переопределить в первоначальное состояние. А так у меня есть не предопределенные функции которые я использую в зависимости от условий, т.е. при нажатии на кнопку когда форма создается, и при нажатии на кнопку самой формы. Могу использовать разные предопределенные функции.

if (FirstCreateForm){
  var Onchange = function (Th){
  
  alert('3434');
  alert(Th.value)
  }

} else {
  var Onchange=function (Th) { 
	    
	  alert('ИИ'); 
 
  }
}

Ну или вообще массив по ключу формы

platedz 18.08.2012 04:03

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

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, время: 00:32.