我有一个Flex应用程序,允许用户编辑基于云的文档。 (想想SlideRocket。)当用户试图离开或关闭浏览器窗口时,如果他们有未保存的更改,我想向他们展示一个确定对话框。
我正在使用以下自定义类,我在Flash player notified on browser close or change page (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;
}
在调试和发布版本中,以及在生产服务器和本地计算机上,行为都是相同的。
非常感谢任何帮助,
戴夫
答案 0 :(得分:2)
现在,当JavaScript事件被触发时,它被设置为在您的AS3代码中调用您的函数。但是,JavaScript函数不会返回AS3函数返回的值。要获得此行为,请将“return”添加到addExternalEventListener
中创建的JavaScript事件处理函数中,如下所示:
var jsBindEvent:String = "function(){"+qualifiedEventName+"= function(){return "+jsExecuteCallBack+"};}";
由于事件处理程序应返回true或false值,因此requestUnloadConfirmation
函数的返回类型应为Boolean
并返回false
以取消该事件,{{1} } 除此以外。使用以下命令获取确认对话框:
true
<强>更新强> 事实证明,将字符串返回到window.onbeforeunload会导致自动显示确认对话框。要确认的ExternalInterface.call导致显示第二个对话框;这是多余的。 AS3代码中唯一需要的更改是在生成的JavaScript中添加“return”。
答案 1 :(得分:0)
在常规的html / javascript网络应用中,您可以使用window.onbeforeunload事件来执行此操作。
http://www.4guysfromrolla.com/demos/OnBeforeUnloadDemo1.htm
也许您可以使用此事件,并检查您的Flex应用程序的某些值,以确定您是否应该询问用户(不熟悉flex ...)?
答案 2 :(得分:0)
我必须在上面的代码中运行一些修改才能使它工作。 问题是由于处理事件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+"};}";