Требование подтверждения от пользователя до закрытия браузера _iff_ переменная Flex имеет значение true - PullRequest
1 голос
/ 24 февраля 2010

У меня есть приложение Flex, которое позволяет пользователю редактировать облачный документ. (Вспомните SlideRocket.) Когда пользователь пытается отойти или закрыть окно браузера, я бы хотел показать ему диалоговое окно, в котором вы уверены, если у него есть несохраненные изменения.

Я использую следующий пользовательский класс, который я нашел в Flash Player уведомляет о закрытии браузера или изменении страницы (as3) . Я не думаю это проблема.

package
{
    import flash.external.ExternalInterface;

    public class ExternalInterfaceUtil
    {
        public static function addExternalEventListener(qualifiedEventName:String, callback:Function, callBackAlias:String):void
        {
                // 1. Expose the callback function via the callBackAlias
                ExternalInterface.addCallback( callBackAlias, callback );

                // 2. Build javascript to execute
                var jsExecuteCallBack:String = "document.getElementsByName('"+ExternalInterface.objectID+"')[0]."+callBackAlias+"()";
                var jsBindEvent:String = "function(){"+qualifiedEventName+"= function(){"+jsExecuteCallBack+"};}";

                // 3. Execute the composed javascript to perform the binding of the external event to the specified callBack function
                ExternalInterface.call(jsBindEvent);
        }
    }
}

В своей функции applicationComplete я добавляю прослушиватель событий в событие javascript window.onbeforeunload следующим образом:

ExternalInterfaceUtil.addExternalEventListener("window.onbeforeunload", requestUnloadConfirmation, "unloadConfirmation");

Функция Actionscript requestUnloadConfirmation (ниже) успешно вызывается, когда пользователь пытается закрыть окно браузера. Тем не менее, это не мешает браузеру закрыться. (В Chrome браузер закрывается и впоследствии вызывается функция Actionscript. В Firefox браузер остается открытым в течение всей функции, но затем закрывается.)

private function requestUnloadConfirmation():String {
    if (changedSinceSave)
        return "There are unsaved changes. Are you sure you want to leave without saving?";
    else
        return null;
}

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

Любая помощь будет принята с благодарностью,

Dave

Ответы [ 3 ]

2 голосов
/ 24 февраля 2010

Прямо сейчас, когда происходит событие JavaScript, оно настроено на вызов вашей функции в вашем коде AS3, что и происходит. Однако функция JavaScript не возвращает значение, которое возвращает ваша функция AS3. Чтобы получить такое поведение, добавьте 'return' в функцию обработки событий JavaScript, созданную в addExternalEventListener, например:

var jsBindEvent:String = "function(){"+qualifiedEventName+"= function(){return "+jsExecuteCallBack+"};}";

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

private function requestUnloadConfirmation():Boolean {          
    if (changedSinceSave)          
        return ExternalInterface.call("confirm", "There are unsaved changes. Are you sure you want to leave without saving?");
    else          
        return false;          
}

UPDATE: Оказывается, что возвращение строки в window.onbeforeunload приводит к автоматическому отображению диалогового окна подтверждения. ExternalInterface.call для подтверждения вызывает показ второго диалогового окна; это избыточно. Единственное изменение, которое необходимо внести в код AS3, - добавить «return» в сгенерированный JavaScript.

0 голосов
/ 19 мая 2015

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

Вот мои изменения:

private function requestUnloadConfirmation():String {          
             if (changedSinceSave){
                    return "There are unsaved changes. Are you sure you want to leave without saving?";
             } 
            return null;          
        }

И небольшое изменение во встроенном JS

var jsBindEvent:String = "function(){"+qualifiedEventName+"= function(){ if ("+jsExecuteCallBack+") return "+jsExecuteCallBack+"};}";
0 голосов
/ 24 февраля 2010

В обычном веб-приложении html / javascript для этого используется событие window.onbeforeunload.

http://www.4guysfromrolla.com/demos/OnBeforeUnloadDemo1.htm

Возможно, вы можете использовать это событие и проверить какое-либо значение вашего приложения Flex, чтобы определить, следует ли вам спрашивать пользователя (не знакомого с Flex ...)?

...