flash – ExternalInterface.call在IE 9中泄漏
发布时间:2020-12-15 07:28:01 所属栏目:百科 来源:网络整理
导读:我创建了一个非常简单的SWF来演示: package { import flash.display.MovieClip; import flash.events.Event; import flash.external.ExternalInterface; public class FlashIELeak extends MovieClip { public function FlashIELeak() { addEventListener(E
我创建了一个非常简单的SWF来演示:
package { import flash.display.MovieClip; import flash.events.Event; import flash.external.ExternalInterface; public class FlashIELeak extends MovieClip { public function FlashIELeak() { addEventListener(Event.ENTER_FRAME,onFrame); } private function onFrame(e:Event):void { ExternalInterface.call("test",null); } } } 在Chrome中加载,没有问题.记忆保持或多或少固定. 在IE和内存中的负载只是持续上升 – 大约30k / s.您甚至不需要声明测试功能.只是将swf嵌入页面中,你就会泄漏.在我们的项目中,我们传递了一个具有多个属性的对象,IE正在以120k / s的速度泄漏.不好. 有人见过这个吗?我无法找到与此相关的任何其他帖子. 解决方法
大约两年前在俄罗斯着名博客上发帖. Alexander Kozlovskij(又名Fizzer)解释了这个问题.以下是他创建的解决方法:
package ru.kozlovskij.external { import flash.external.ExternalInterface; /** * @author a.kozlovskij * @copy flash.external.ExternalInterface */ public final class ExternalInterfaceExtended { private static const instance :ExternalInterfaceExtended= new ExternalInterfaceExtended(); private static var methodName :String; /** * U can't instanciate this class,because it implements a Singletone pattern. * @copy flash.external.ExternalInterface.ExternalInterface() */ public function ExternalInterfaceExtended() { instance && new ExternalInterface(); methodName = '__flash__addCallback_' + ExternalInterface.objectID; } private static function updateJS():void { const jsFunc :String = 'function(){ ' + methodName + ' = __flash__addCallback = function(flashObj,methodName)' + '{' + ' alert("JS: called overridden __flash__addCallback(" + arguments[0] + "," + arguments[1] + ")");' + ' flashObj[methodName] = ' + ' (function(methodName)' + ' {' + ' return function()' + ' {' + ' this.CallFunction('' + __flash__argumentsToXML(arguments,+ '');' + ' };' + //dangling semi-colon for IE 6 ' })(methodName);' + //force re-closure to prevent IE memory leaks '};' + '}'; ExternalInterface.call(jsFunc); } /** * Fixed: Mem leaks in native addCallback-js-closure. * @copy flash.external.ExternalInterface.addCallback() */ public static function addCallback(functionName :String,closure :Function):void { updateJS(); ExternalInterface.addCallback(functionName,closure); //ExternalInterface.call(methodName,functionName); //ExternalInterface.call('__flash__addCallback_ext',null,functionName); } /** * @copy flash.external.ExternalInterface.call() */ public static function call(functionName :String,...parameters :Array):* { parameters.unshift(functionName); return ExternalInterface.call.apply(ExternalInterfaceExtended,parameters); } /** * @copy flash.external.ExternalInterface.available */ public static function get available():Boolean { return ExternalInterface.available; } /** * @copy flash.external.ExternalInterface.objectID */ public static function get objectID():String { return ExternalInterface.objectID; } /** * @copy flash.external.ExternalInterface.marshallExceptions */ public static function get marshallExceptions():Boolean { return ExternalInterface.marshallExceptions; } public static function set marshallExceptions(value :Boolean):void { ExternalInterface.marshallExceptions = value; } } } 因此,您只需要使用ExternalInterfaceExtended类而不是常规的ExternalInterface. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |