Javascript 浏览器关闭前需要用户确认_iff_u; Flex变量为真
我有一个Flex应用程序,允许用户编辑基于云的文档。(想想SlideRocket。)当用户试图离开或关闭浏览器窗口时,我想在他们有未保存的更改时向他们显示一个“你确定吗”对话框 我正在使用以下自定义类,可以在中找到。我认为这不是问题所在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
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+"};}";