Flex cookbook entry: Message about unsaved data before closing the browser window.
Для Flash и Flex приложений работающих с пользовательскими данными очень важно, чтоб пользователь всегда мог сохранить свою работу перед закрытием приложения. Стандартные браузеры, имеющие поддержку JavaScript оповещают о закрытии окна/таба или переходе на другую страничку. Все эти действия могут привести к потере данных, но использование этого оповещения позволит сохранить все необходимые данные. Flash/Flex приложение подписывается на JavaScript событие "onbeforeunload", которое вызывается всегда перед закрытием страницы или переходом на другую страницу.
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" preinitialize="preinitializeHandler(event)" layout="horizontal"> <mx:Script> <![CDATA[ import aw.external.jsinterface.JSFunction; import aw.external.JSInterface; static public const NOT_SAVED_ALERT:String = '\\\\n\\\\nYou have not saved data. Please, save data before close window.\\\\n Do you realy want to close window without save changes?\\\\n\\\\n'; protected function preinitializeHandler(event:Event):void{ JSInterface.initialize(this.systemManager.stage); // For Internet Explorer, FireFox, Safari or other JSInterface.window.onbeforeunload = JSFunction.create("var text; if(!window.isFlexDataSaved){text='"+NOT_SAVED_ALERT+"';}; return text;"); JSInterface.window.isFlexDataSaved = false; } ]]> </mx:Script> <mx:Button label="Save Data" click="{JSInterface.window.isFlexDataSaved = true}"/> <mx:Spacer width="100"/> <mx:Button label="Change Data" click="{JSInterface.window.isFlexDataSaved = false}"/> </mx:Application>
Этот пример иллюстрирует внедрение JavaScript функции обратного вызова, которая спрашивает пользователя о сохранении данных, перед закрытием страницы. Эта функция проверяет значение ключа "isFlexDataSaved" и если он указывает на то, что данные уже сохранены, то приложение закрывается сразу.
Следует обратить внимание на то, что я не использовал ActionScript функцию как каллбек в данном случае. Это из-за того, что некоторые браузеры не корректно отрабатывают и не отображают необходимое сообщение. А, к примеру, для FireFox вполне подойдёт такой вариант:
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" preinitialize="preinitializeHandler(event)" layout="horizontal"> <mx:Script> <![CDATA[ import aw.external.jsinterface.JSFunction; import aw.external.jsinterface.JSDynamic; import aw.external.JSInterface; static public const NOT_SAVED_ALERT:String = '\\\\n\\\\nYou have not saved data. Please, save data before close window.\\\\n Do you realy want to close window without save changes?\\\\n\\\\n'; protected function preinitializeHandler(event:Event):void{ JSInterface.window.onbeforeunload = this.isDataSaved; } protected function isDataSaved(event:JSDynamic=null):String{ if(JSInterface.window.isFlexDataSaved) return ""; if(event){ event.returnValue = NOT_SAVED_ALERT; } return NOT_SAVED_ALERT; } ]]> </mx:Script> <mx:Button label="Save Data" click="{JSInterface.window.isFlexDataSaved = true}"/> <mx:Spacer width="100"/> <mx:Button label="Change Data" click="{JSInterface.window.isFlexDataSaved = false}"/> </mx:Application>
В загружаемом примере реализованы оба варианта.
Во время вызова события "onbeforeunload" блокируются любые HTTP запросы из Flash приложения. Можно сделать как офисные программы - перед закрытием быстро сохранить данные на локальном компьютере и при следующем запуске программы спросить "Такого-то числа был сохранён черновик, не хотите ли его восстановить и продолжить работу?".
Посетить официальный сайт JSInterface.
Метки: browser, Flash, Flex, JavaScript, JSInterface