Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.08.2011, 17:29
Аспирант
Отправить личное сообщение для amigo* Посмотреть профиль Найти все сообщения от amigo*
 
Регистрация: 25.05.2010
Сообщений: 39

обработчик события
Здравствуйте. Есть следующий псевдо-код:
var Dlg = function () {
	this.onClose = function () {};		
	this.show = function () {};		
	this.doClose = function () {
		this.onClose(1);
	}
}
var test = function() {
	var dlg = new Dlg();
    dlg.show();
	dlg.onClose = function (e) {
		if (e != 0) {
			return "error";  // строка предназначена для test
		}
	}
	dlg.doClose();
}
var result = test();

Здесь Dlg функция-конструктор, которая отвечает за отрисовку диалогового окна. onClose - обработчик события закрытия диалового окна, show - показывать окно, doClose - эмулирует событие закрытия окна.
test - "главная" функция.
Нужно, чтобы при закрытии окна в функцию-обработчик передавалось значение ошибки. Если e == 0, то всё ок, если e != 0, то нужно чтобы функция test завершилась return "error". Строка
Код:
return "error";
псевдо-инструкция предназначенная для test.

Собственно вопрос. Как архитектурно правильно будет отловить событие onClose, чтобы потом манипулировать логикой в test?
Спасибо за советы.
Ответить с цитированием
  #2 (permalink)  
Старый 10.08.2011, 20:43
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от amigo* Посмотреть сообщение
Как архитектурно правильно будет отловить событие onClose
вызывать в самом конце функции close

Сообщение от amigo* Посмотреть сообщение
чтобы потом манипулировать логикой в test
?
Ответить с цитированием
  #3 (permalink)  
Старый 11.08.2011, 00:28
Аспирант
Отправить личное сообщение для amigo* Посмотреть профиль Найти все сообщения от amigo*
 
Регистрация: 25.05.2010
Сообщений: 39

Плохо изложил суть проблемы. Ещё раз. Нужна функция такого плана:
var test = function () {
    var dlg = new Dlg();
    var result = dlg.show();
    if (result == 0) {
        return "ok";
    } else {
        return null;
    }
}

В С#, например, на строчке 3 выполнение функции test задержалось бы (опять же, это псевдо-код), а когда пользователь закрыл диалоговое окно, то результат вернулся бы переменной result и функция test продолжила бы выполнение.

Но понимаю, что в данной функции return бутет раньше, чем пользователь закроет диалоговое окно. Вообщем буду что-то думать.
Ответить с цитированием
  #4 (permalink)  
Старый 11.08.2011, 01:02
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

о, теперь ясно

если хотите неасинхронно, то получите тормоза интерфейса (заморозку на время скрытия), зато код будет исполняться, как у вас в последнем варианте.

если хотите плавности (скрывается за секунду и в это время можно потыкать и пошевелить мышей), то пишите код асинхронным

// ваш пример
var Dlg = function () {
	this.onClose = function () {};		
	this.show = function () {};		
	this.doClose = function () { this.onClose(1)  }
};

	var dlg = new Dlg();
        dlg.show();

var test; // тут будет строка

	dlg.onClose = function (e) {
		if (e != 0) {
			test = "error";  // строка предназначена для test
                        /*  ... тут дальше манипулируем с test ... */
		}
	}

	dlg.doClose();


а это синхронный пример

var Dlg = function () {
	this.onClose = function () {};		
	this.show = function () {};		
	this.doClose = function () {
                while( this.visible ) {
                            /* скрываем */
                            if( /*почти скрыт*/ ) break;
                }
		this.onClose(1);
	}
}
var test = function() {
	var dlg = new Dlg();
        dlg.show();
        var str;
	dlg.onClose = function (e) {
		if (e != 0) {
			str = "error";  // строка предназначена для test
		}
	}
	dlg.doClose();
        // т.к. у нас синхронность выполнения, можно написать так
        return str;
}
var result = test();


синхронность выполняет бесконечный цикл внутри doClose, который потом прервётся.

на практике асинхронный способ даст плавность и интерактивность, а синхронный замирание на время скрытия
Ответить с цитированием
  #5 (permalink)  
Старый 11.08.2011, 04:52
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

сделать переопределение функции (overridden)

var originalOnClose = Dlg.onClose;
Dlg.onClose = function() {
   alert("закрываеться окно");
   return originalOnClose.call( this );
}

Последний раз редактировалось devote, 11.08.2011 в 04:55.
Ответить с цитированием
  #6 (permalink)  
Старый 11.08.2011, 10:43
Аспирант
Отправить личное сообщение для amigo* Посмотреть профиль Найти все сообщения от amigo*
 
Регистрация: 25.05.2010
Сообщений: 39

Спасибо. Буду пробовать.
Ответить с цитированием
  #7 (permalink)  
Старый 11.08.2011, 11:03
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

а лучше так:
var originalOnClose = Dlg.onClose;
Dlg.onClose = function() { 
   alert("закрываеться окно"); 
   return originalOnClose.apply( this, arguments ); 
}
Ктож знает, может там какие аргументы будут приходить
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработчик события focus для окна Сергей Д Internet Explorer 4 22.09.2010 17:33
Как "обмануть" обработчик события? itPiligrim Events/DOM/Window 0 13.05.2010 22:55
как узнать имеется ли обработчик события HelpeR Events/DOM/Window 9 17.02.2010 18:20
Назначить на обработчик события метод обьекта Logo Общие вопросы Javascript 11 20.06.2009 23:40
Обработчик события: как делает jquery? Shasoft jQuery 35 22.04.2009 09:41