【问题标题】:Requiring confirmation from user before browser close _iff_ a Flex variable is true在浏览器关闭之前要求用户确认_iff_一个 Flex 变量为真
【发布时间】:2010-02-24 05:01:12
【问题描述】:

我有一个 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;
}

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

任何帮助将不胜感激,

戴夫

【问题讨论】:

    标签: javascript actionscript-3 externalinterface


    【解决方案1】:

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

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

    由于事件处理程序应该返回一个真或假值,你的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.call 会导致显示第二个对话框;这是多余的。 AS3 代码中唯一需要的更改是在生成的 JavaScript 中添加“return”。

    【讨论】:

    • 在事件处理函数中添加返回就可以了。感谢一百万拯救了一天!对于那些将来阅读本文的人:不需要对 requestUnloadConfirmation 的提议更改 - 事实上,这会导致连续显示两个确认对话框,而不仅仅是一个。这是因为将字符串值返回给 window.onbeforeunload 会导致显示确认对话框。您不需要明确请求另一个。经测试可在 Chrome、Firefox、Safari 中使用。我认为它可以在 IE 中工作,因为 Microsoft 在 IE4 中发明了 window.onbeforeunload。
    • 哦,酷!我不知道在 windows.onbeforeunload 中返回字符串时的自动确认。我只玩过那个活动一次,为了好玩。我将编辑我的答案。
    • 对不起,这段代码不完整,不能正常工作,我在下面发布了修复
    【解决方案2】:

    在常规的 html/javascript 网络应用程序中,您将使用 window.onbeforeunload 事件来执行此操作。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多