Javascript 浏览器关闭前需要用户确认_iff_u; Flex变量为真

Javascript 浏览器关闭前需要用户确认_iff_u; Flex变量为真,javascript,actionscript-3,externalinterface,Javascript,Actionscript 3,Externalinterface,我有一个Flex应用程序,允许用户编辑基于云的文档。(想想SlideRocket。)当用户试图离开或关闭浏览器窗口时,我想在他们有未保存的更改时向他们显示一个“你确定吗”对话框 我正在使用以下自定义类,可以在中找到。我认为这不是问题所在 package { import flash.external.ExternalInterface; public class ExternalInterfaceUtil { public static function

我有一个Flex应用程序,允许用户编辑基于云的文档。(想想SlideRocket。)当用户试图离开或关闭浏览器窗口时,我想在他们有未保存的更改时向他们显示一个“你确定吗”对话框

我正在使用以下自定义类,可以在中找到。我认为这不是问题所在

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中,浏览器在函数执行期间保持打开状态,然后关闭。)

在调试版本和发布版本中,以及在生产服务器和本地计算机上,行为都是相同的

任何帮助都将不胜感激


Dave

在常规html/javascript web应用程序中,您可以使用window.onbeforeunload事件来执行此操作


也许您可以使用此事件,并检查flex应用程序的某些值,以确定是否应立即询问用户(不熟悉flex…?

当JavaScript事件触发时,它将设置为在AS3代码中调用您的函数,它会这样做。但是,JavaScript函数并没有返回AS3函数返回的值。要获得此行为,请将“return”添加到在
addExternalEventListener
中创建的JavaScript事件处理函数中,如下所示:

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;          
}
更新:
事实证明,将字符串返回到window.onbeforeunload会导致自动显示确认对话框。调用ExternalInterface.confirm会显示第二个对话框;这是多余的。AS3代码中唯一需要的更改是在生成的JavaScript中添加“return”。

我必须在上述代码中运行一些修改才能使其正常工作。 该问题是由于处理event 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+"};}";

将return添加到事件处理函数中就成功了。万分感谢你拯救了这一天!对于将来阅读本文的读者:不需要对requestUnloadConfirmation进行建议的更改,事实上,这会导致连续显示两个确认对话框,而不仅仅是一个。这是因为将字符串值返回window.onbeforeunload会导致显示确认对话框。您不需要显式地请求另一个。测试为在Chrome、Firefox和Safari中工作。我假设它在IE中工作,就像微软在IE4中发明window.onbeforeunload一样。哦,太酷了!我不知道在windows.onbeforeunload中返回字符串时会自动确认。我只玩过一次,只是为了好玩。我将编辑我的答案。抱歉,此代码不完整,无法正常工作,我在下面发布了修复程序
var jsBindEvent:String = "function(){"+qualifiedEventName+"= function(){ if ("+jsExecuteCallBack+") return "+jsExecuteCallBack+"};}";