Javascript IE onbeforeunload未触发ExtenralInterface回调

Javascript IE onbeforeunload未触发ExtenralInterface回调,javascript,actionscript-3,javascript-events,externalinterface,Javascript,Actionscript 3,Javascript Events,Externalinterface,我在html容器中嵌入了一个带有swfobject的Flash电影。 通过ExternalInterface,我注册了一个javascript函数来启动对我的flash应用程序的回调 ExternalInterface.addCallback("notifyClose", notifyOnClose ); javascript函数被添加为事件侦听器,以在卸载之前触发 <script language="JavaScript"> function getSWF(mo

我在html容器中嵌入了一个带有swfobject的Flash电影。 通过ExternalInterface,我注册了一个javascript函数来启动对我的flash应用程序的回调

ExternalInterface.addCallback("notifyClose", notifyOnClose );
javascript函数被添加为事件侦听器,以在卸载之前触发

<script language="JavaScript">

        function getSWF(movieName) {
            if (navigator.appName.indexOf("Microsoft") != -1){
               return window[movieName];
            }else { return document[movieName];}
        }           

        var bye = function() {
            getSWF('flashContainer').notifyClose('> WE ARE CLOSING APP!');
            //alert('WE ARE CLOSING APP!.');
        };

        var hola = function(){
            getSWF('flashContainer').notifyClose('> WE ARE opening APP!');
            alert('WE ARE opening APP!.');
        };

        if(window.addEventListener) {
            window.addEventListener('load', hola,false);
            window.addEventListener('beforeunload', bye, false);
        } else if (window.attachEvent) {
            window.attachEvent('onload', hola);
            window.attachEvent('onbeforeunload', bye);
        }

</script>

函数getSWF(movieName){
if(navigator.appName.indexOf(“Microsoft”)!=-1){
返回窗口[movieName];
}else{返回文档[movieName];}
}           
var bye=function(){
getSWF('flashContainer').notifyClose('>我们正在关闭应用程序!');
//警报(“我们正在关闭应用程序!”;
};
var hola=函数(){
getSWF('flashContainer').notifyClose('>我们正在打开应用!');
警报(“我们正在打开应用程序!”;
};
if(window.addEventListener){
window.addEventListener('load',hola,false);
window.addEventListener('beforeunload',bye,false);
}else if(窗口附件){
窗口。附件('加载',hola);
window.attachEvent('onbeforeunload',再见);
}
我已经在FF和IE中进行了测试。Firefox按预期工作,但在IE中没有。 在IE中,我会在Flash中收到onload消息的通知,但不会在onbeforeuload之前收到通知

<script language="JavaScript">

        function getSWF(movieName) {
            if (navigator.appName.indexOf("Microsoft") != -1){
               return window[movieName];
            }else { return document[movieName];}
        }           

        var bye = function() {
            getSWF('flashContainer').notifyClose('> WE ARE CLOSING APP!');
            //alert('WE ARE CLOSING APP!.');
        };

        var hola = function(){
            getSWF('flashContainer').notifyClose('> WE ARE opening APP!');
            alert('WE ARE opening APP!.');
        };

        if(window.addEventListener) {
            window.addEventListener('load', hola,false);
            window.addEventListener('beforeunload', bye, false);
        } else if (window.attachEvent) {
            window.attachEvent('onload', hola);
            window.attachEvent('onbeforeunload', bye);
        }

</script>
这是沙箱限制之王吗?只是坏代码?

问题在于附件()中代码中的“开”

对于事件侦听器代码,请尝试下面的代码,并查看以下链接以了解更多信息:

/***此代码由Gavin Kistner于2003年版权所有@phrogz.net
//***它包含在许可证下,可在http://phrogz.net/JS/_ReuseLicense.txt
//***只要您遵守该许可证的条款,重复使用或修改是免费的。
//***(在源代码中包含上面的前两行满足条件。)
//***跨浏览器附加事件功能。对于“evt”,传递一个忽略前导“on”的字符串值
//***e、 g.AttachEvent(窗口,'load',MyFunctionNamewithoutParentSession,false);
功能附件(obj、evt、fnc、useCapture){
如果(!useCapture)useCapture=false;
if(对象添加列表器){
对象添加列表器(evt、fnc、useCapture);
返回true;
}否则,如果(obj.attachEvent)返回obj.attachEvent(“on”+evt,fnc);
否则{
MyAttachEvent(obj、evt、fnc);
obj['on'+evt]=函数(){MyFireEvent(obj,evt)};
}
} 
//以下是针对NS4或IE5Mac等不支持这两种浏览器的
//附加事件或附加事件列表器
功能MyAttachEvent(obj、evt、fnc){
如果(!obj.myEvents)obj.myEvents={};
如果(!obj.myEvents[evt])obj.myEvents[evt]=[];
var-evts=obj.myEvents[evt];
evts[evts.长度]=fnc;
}
函数MyFireEvent(obj、evt){
如果(!obj | | |!obj.myEvents | |!obj.myEvents[evt])返回;
var-evts=obj.myEvents[evt];
对于(var i=0,len=evts.length;i来说,问题在于下面的代码中的“on”在attachEvent()中

对于事件侦听器代码,请尝试下面的代码,并查看以下链接以了解更多信息:

/***此代码由Gavin Kistner于2003年版权所有,!@phrogz.net
//***它包含在许可证下,可在http://phrogz.net/JS/_ReuseLicense.txt
//***只要您遵守该许可证的条款,重复使用或修改是免费的。
//***(在源代码中包含上面的前两行满足条件。)
//***跨浏览器附加事件函数。对于“evt”,传递忽略前导“on”的字符串值
//***e、 g.AttachEvent(窗口,'load',MyFunctionNamewithoutParentSession,false);
功能附件(obj、evt、fnc、useCapture){
如果(!useCapture)useCapture=false;
if(对象添加列表器){
对象添加列表器(evt、fnc、useCapture);
返回true;
}否则,如果(obj.attachEvent)返回obj.attachEvent(“on”+evt,fnc);
否则{
MyAttachEvent(obj、evt、fnc);
obj['on'+evt]=函数(){MyFireEvent(obj,evt)};
}
} 
//以下是针对NS4或IE5Mac等不支持这两种浏览器的
//附加事件或附加事件列表器
功能MyAttachEvent(obj、evt、fnc){
如果(!obj.myEvents)obj.myEvents={};
如果(!obj.myEvents[evt])obj.myEvents[evt]=[];
var-evts=obj.myEvents[evt];
evts[evts.长度]=fnc;
}
函数MyFireEvent(obj、evt){
如果(!obj | | |!obj.myEvents | |!obj.myEvents[evt])返回;
var-evts=obj.myEvents[evt];

对于(var i=0,len=evts.length;因此,如果我用ajax调用替换bye函数中的外部接口调用,它也不起作用。另外,如果我用ajax调用替换bye函数中的外部接口调用,它也不起作用。@Tood Moses:Tnxs作为回复。您是否建议事件类型“onbeforeunload”不正确?如果那么,你认为什么是正确的事件类型呢?我正在检查你的链接。onbeforeunload没有错误。函数中的“on”之前有一个词。IE在附件函数中的“on”似乎有问题。我有点困惑,你能给我提供一些参考来解释IE get为什么“困惑”于“on”吗?在我看来t您提供的代码旨在成为某种跨浏览器的旧浏览器帮助程序方法…@Tood Moses:Tnxs以获取答复。您是否建议事件类型“onbeforeunload”不正确?如果是,您认为什么是正确的事件类型?我现在正在检查您的链接。onbeforeunload不正确。事件前的“on”一词在函数。看来IE在attachEvent函数中的“on”有问题。我有点困惑,你能给我提供一些参考来解释为什么IE get“困惑”与“on”吗?在我看来,你提供的代码是为了某种跨浏览器的传统浏览器帮助器方法。。。
//*** This code is copyright 2003 by Gavin Kistner, !@phrogz.net
//*** It is covered under the license viewable at http://phrogz.net/JS/_ReuseLicense.txt
//*** Reuse or modification is free provided you abide by the terms of that license.
//*** (Including the first two lines above in your source code satisfies the conditions.)


//***Cross browser attach event function. For 'evt' pass a string value with the leading "on" omitted
//***e.g. AttachEvent(window,'load',MyFunctionNameWithoutParenthesis,false);

function AttachEvent(obj,evt,fnc,useCapture){
    if (!useCapture) useCapture=false;
    if (obj.addEventListener){
        obj.addEventListener(evt,fnc,useCapture);
        return true;
    } else if (obj.attachEvent) return obj.attachEvent("on"+evt,fnc);
    else{
        MyAttachEvent(obj,evt,fnc);
        obj['on'+evt]=function(){ MyFireEvent(obj,evt) };
    }
} 

//The following are for browsers like NS4 or IE5Mac which don't support either
//attachEvent or addEventListener
function MyAttachEvent(obj,evt,fnc){
    if (!obj.myEvents) obj.myEvents={};
    if (!obj.myEvents[evt]) obj.myEvents[evt]=[];
    var evts = obj.myEvents[evt];
    evts[evts.length]=fnc;
}
function MyFireEvent(obj,evt){
    if (!obj || !obj.myEvents || !obj.myEvents[evt]) return;
    var evts = obj.myEvents[evt];
    for (var i=0,len=evts.length;i<len;i++) evts[i]();
}