Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Инкапсуляция, чтение файла и event в firefox (https://javascript.ru/forum/events/30819-inkapsulyaciya-chtenie-fajjla-i-event-v-firefox.html)

platedz 16.08.2012 22:35

Инкапсуляция, чтение файла и event в firefox
 
Здравствуйте, уважаемые специалисты. Очень расчитываю на Вашу помощь и поддержку.

Вот код

topmenu = (function() {

return {
filesload: function(evt,func)
				{ 
				var reader = new FileReader();
				
					var files = evt.target.files; 
							
							

					
						
							reader.onload = function(e) 
					
								{
							
									func(e.target.result,files[0]);
									
								}
								
								
							  reader.readAsArrayBuffer(files[0]);
     
					}, 
				replace: function(s,e)
					{
					
						this[s](event,e);
						
					}
				
	
	}

}());

Если вызвать так, то работает и в опере и хром и файрфоркс
topmenu.sub(document.getElementById("inpField"),"change",function(e)
					{
						
						topmenu.filesload(e,function(s)
						{
							
							alert(s);

						});
						
					});


А так только в хром и опере

topmenu.sub(document.getElementById("inpField"),"change",function(e)
					{
						
						topmenu.replace.call(topmenu,"filesload",function(u,f)
							{
								
					
								alert(u+" = "+f.name);
							
							})
						
					});


Файр фокс выдает event is not defined

Вопрос 1) почему? и как поправить?
Вопрос 2) Как я могу вернуть e.target.result, чтобы потом их обработать? Я так понимаю причина в onload.
Вопрос 3) И последний вопрос касательно инкапсуляции. Какую роль играют в этом коде function(s){}(v) s и v?

oneguy 16.08.2012 23:08

Вы, наверно, неполный код привели - у вас в topmenu нет свойства sub.

vadim5june 16.08.2012 23:12

Цитата:

Сообщение от oneguy (Сообщение 198133)
Вы, наверно, неполный код привели - у вас в topmenu нет свойства sub.

sub это редко встречающейся метод
http://www.w3schools.com/jsref/jsref_sub.asp

oneguy 16.08.2012 23:19

Цитата:

Сообщение от vadim5june (Сообщение 198134)
sub это редко встречающейся метод
http://www.w3schools.com/jsref/jsref_sub.asp

Да, но вы невнимательно посмотрели код. В Object.prototype нет метода sub.

vadim5june 16.08.2012 23:19

Цитата:

Сообщение от platedz
Как я могу вернуть e.target.result, чтобы потом их обработать

Вы же передаете свой callback в нем и обрабатывайте или передайте в другую функцию
в асинхронных процессах вернуть с помощью return нельзя

platedz 16.08.2012 23:20

Код не полный, полный бы здесь не поместился.
Вот sub
sub: function(elem,type,block) 
				{
						try { 
								try {

									elem.addEventListener(type, block, false);

								} catch(e) {

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

								}
							} catch(e){}



				}

vadim5june 16.08.2012 23:23

Цитата:

Сообщение от oneguy (Сообщение 198138)
Да, но вы невнимательно посмотрели код. В Object.prototype нет метода sub.

извиняюсь это метод String

platedz 16.08.2012 23:25

Цитата:

Сообщение от vadim5june (Сообщение 198139)
Вы же передаете свой callback в нем и обраьатывайте или передайте в другую функцию
в асинхронных процессах вернуть с помощью return нельзя

Может быть есть способ сделать данный процесс синхронным?

oneguy 16.08.2012 23:34

Цитата:

Сообщение от platedz (Сообщение 198142)
Может быть есть способ сделать данный процесс синхронным?

Вы ведь повесили обработчик на onchange. Он по идее должен срабатывать при изменении пользователем значения файлового поля, поэтому он как раз должен быть асинхронным.
Цитата:

Сообщение от platedz
Вопрос 1) почему? и как поправить?

В Фаерфоксе, возможно, не срабатывает потому, что вы использовали глобальную переменную event, а нужно брать событие, как аргумент в обработчике?
Цитата:

Сообщение от platedz
Вопрос 3) И последний вопрос касательно инкапсуляции. Какую роль играют в этом коде function(s){}(v) s и v?

У вас в коде ведь использован такой шаблон, без параментров: function(){}()

vadim5june 16.08.2012 23:35

Цитата:

Сообщение от platedz (Сообщение 198142)
Может быть есть способ сделать данный процесс синхронным?

Это мы сделать не в состоянии
С помощью callback так же удобно все обрабатывается
в первом случае у Вас это function(s){alert(s)}
здесь передавайте свою функцию обработки-в чем проблема?
при этом s это будет e.target.result
можно добавить второй параметр-это будет files[0]
function(s,fl){}


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