📄 flash.js
字号:
// hook for Internet Explorer to receive FSCommands from Flash if(dojo.render.html.ie){ document.writeln('<SCRIPT LANGUAGE=VBScript\> '); document.writeln('on error resume next '); document.writeln('Sub ' + id + '_FSCommand(ByVal command, ByVal args)'); document.writeln(' call ' + id + '_DoFSCommand(command, args)'); document.writeln('end sub'); document.writeln('</SCRIPT\> '); } }, _writeFlash8: function(){ // nothing needs to be written out for Flash 8 communication; // happens automatically }, /** Flash 6 communication. */ /** Handles fscommand's from Flash to JavaScript. Flash 6 communication. */ _handleFSCommand: function(command, args){ //dojo.debug("fscommand, command="+command+", args="+args); // Flash 8 on Mac/Firefox precedes all commands with the string "FSCommand:"; // strip it off if it is present if(command != null && !dojo.lang.isUndefined(command) && /^FSCommand:(.*)/.test(command) == true){ command = command.match(/^FSCommand:(.*)/)[1]; } if(command == "addCallback"){ // add Flash method for JavaScript callback this._fscommandAddCallback(command, args); }else if(command == "call"){ // Flash to JavaScript method call this._fscommandCall(command, args); }else if(command == "fscommandReady"){ // see if fscommands are ready this._fscommandReady(); } }, /** Handles registering a callable Flash function. Flash 6 communication. */ _fscommandAddCallback: function(command, args){ var functionName = args; // do a trick, where we link this function name to our wrapper // function, _call, that does the actual JavaScript to Flash call var callFunc = function(){ return dojo.flash.comm._call(functionName, arguments); }; dojo.flash.comm[functionName] = callFunc; // indicate that the call was successful dojo.flash.obj.get().SetVariable("_succeeded", true); }, /** Handles Flash calling a JavaScript function. Flash 6 communication. */ _fscommandCall: function(command, args){ var plugin = dojo.flash.obj.get(); var functionName = args; // get the number of arguments to this method call and build them up var numArgs = parseInt(plugin.GetVariable("_numArgs")); var flashArgs = new Array(); for(var i = 0; i < numArgs; i++){ var currentArg = plugin.GetVariable("_" + i); flashArgs.push(currentArg); } // get the function instance; we technically support more capabilities // than ExternalInterface, which can only call global functions; if // the method name has a dot in it, such as "dojo.flash.loaded", we // eval it so that the method gets run against an instance var runMe; if(functionName.indexOf(".") == -1){ // global function runMe = window[functionName]; }else{ // instance function runMe = eval(functionName); } // make the call and get the results var results = null; if(!dojo.lang.isUndefined(runMe) && runMe != null){ results = runMe.apply(null, flashArgs); } // return the results to flash plugin.SetVariable("_returnResult", results); }, /** Reports that fscommands are ready to run if executed from Flash. */ _fscommandReady: function(){ var plugin = dojo.flash.obj.get(); plugin.SetVariable("fscommandReady", "true"); }, /** The actual function that will execute a JavaScript to Flash call; used by the Flash 6 communication method. */ _call: function(functionName, args){ // we do JavaScript to Flash method calls by setting a Flash variable // "_functionName" with the function name; "_numArgs" with the number // of arguments; and "_0", "_1", etc for each numbered argument. Flash // reads these, executes the function call, and returns the result // in "_returnResult" var plugin = dojo.flash.obj.get(); plugin.SetVariable("_functionName", functionName); plugin.SetVariable("_numArgs", args.length); for(var i = 0; i < args.length; i++){ // unlike Flash 8's ExternalInterface, Flash 6 has no problem with // any special characters _except_ for the null character \0; double // encode this so the Flash side never sees it, but we can get it // back if the value comes back to JavaScript var value = args[i]; value = value.replace(/\0/g, "\\0"); plugin.SetVariable("_" + i, value); } // now tell Flash to execute this method using the Flash Runner plugin.TCallLabel("/_flashRunner", "execute"); // get the results var results = plugin.GetVariable("_returnResult"); // we double encoded all null characters as //0 because Flash breaks // if they are present; turn the //0 back into /0 results = results.replace(/\\0/g, "\0"); return results; }, /** Flash 8 communication. */ /** Registers the existence of a Flash method that we can call with JavaScript, using Flash 8's ExternalInterface. */ _addExternalInterfaceCallback: function(methodName){ var wrapperCall = function(){ // some browsers don't like us changing values in the 'arguments' array, so // make a fresh copy of it var methodArgs = new Array(arguments.length); for(var i = 0; i < arguments.length; i++){ methodArgs[i] = arguments[i]; } return dojo.flash.comm._execFlash(methodName, methodArgs); }; dojo.flash.comm[methodName] = wrapperCall; }, /** Encodes our data to get around ExternalInterface bugs. Flash 8 communication. */ _encodeData: function(data){ // double encode all entity values, or they will be mis-decoded // by Flash when returned var entityRE = /\&([^;]*)\;/g; data = data.replace(entityRE, "&$1;"); // entity encode XML-ish characters, or Flash's broken XML serializer // breaks data = data.replace(/</g, "<"); data = data.replace(/>/g, ">"); // transforming \ into \\ doesn't work; just use a custom encoding data = data.replace("\\", "&custom_backslash;&custom_backslash;"); data = data.replace(/\n/g, "\\n"); data = data.replace(/\r/g, "\\r"); data = data.replace(/\f/g, "\\f"); data = data.replace(/\0/g, "\\0"); // null character data = data.replace(/\'/g, "\\\'"); data = data.replace(/\"/g, '\\\"'); return data; }, /** Decodes our data to get around ExternalInterface bugs. Flash 8 communication. */ _decodeData: function(data){ if(data == null || typeof data == "undefined"){ return data; } // certain XMLish characters break Flash's wire serialization for // ExternalInterface; these are encoded on the // DojoExternalInterface side into a custom encoding, rather than // the standard entity encoding, because otherwise we won't be able to // differentiate between our own encoding and any entity characters // that are being used in the string itself data = data.replace(/\&custom_lt\;/g, "<"); data = data.replace(/\&custom_gt\;/g, ">"); // Unfortunately, Flash returns us our String with special characters // like newlines broken into seperate characters. So if \n represents // a new line, Flash returns it as "\" and "n". This means the character // is _not_ a newline. This forces us to eval() the string to cause // escaped characters to turn into their real special character values. data = eval('"' + data + '"'); return data; }, /** Sends our method arguments over to Flash in chunks in order to have ExternalInterface's performance not be O(n^2). Flash 8 communication. */ _chunkArgumentData: function(value, argIndex){ var plugin = dojo.flash.obj.get(); // cut up the string into pieces, and push over each piece one // at a time var numSegments = Math.ceil(value.length / 1024); for(var i = 0; i < numSegments; i++){ var startCut = i * 1024; var endCut = i * 1024 + 1024; if(i == (numSegments - 1)){ endCut = i * 1024 + value.length; } var piece = value.substring(startCut, endCut); // encode each piece seperately, rather than the entire // argument data, because ocassionally a special // character, such as an entity like &foobar;, will fall between // piece boundaries, and we _don't_ want to encode that value if // it falls between boundaries, or else we will end up with incorrect // data when we patch the pieces back together on the other side piece = this._encodeData(piece); // directly use the underlying CallFunction method used by // ExternalInterface, which is vastly faster for large strings // and lets us bypass some Flash serialization bugs plugin.CallFunction('<invoke name="chunkArgumentData" ' + 'returntype="javascript">' + '<arguments>' + '<string>' + piece + '</string>' + '<number>' + argIndex + '</number>' + '</arguments>' + '</invoke>'); } }, /** Gets our method return data in chunks for better performance. Flash 8 communication. */ _chunkReturnData: function(){ var plugin = dojo.flash.obj.get(); var numSegments = plugin.getReturnLength(); var resultsArray = new Array(); for(var i = 0; i < numSegments; i++){ // directly use the underlying CallFunction method used by // ExternalInterface, which is vastly faster for large strings var piece = plugin.CallFunction('<invoke name="chunkReturnData" ' + 'returntype="javascript">' + '<arguments>' + '<number>' + i + '</number>' + '</arguments>' + '</invoke>'); // remove any leading or trailing JavaScript delimiters, which surround // our String when it comes back from Flash since we bypass Flash's // deserialization routines by directly calling CallFunction on the // plugin if(piece == '""' || piece == "''"){ piece = ""; }else{ piece = piece.substring(1, piece.length-1); } resultsArray.push(piece); } var results = resultsArray.join(""); return results; }, /** Executes a Flash method; called from the JavaScript wrapper proxy we create on dojo.flash.comm. Flash 8 communication. */ _execFlash: function(methodName, methodArgs){ var plugin = dojo.flash.obj.get(); // begin Flash method execution plugin.startExec(); // set the number of arguments plugin.setNumberArguments(methodArgs.length); // chunk and send over each argument for(var i = 0; i < methodArgs.length; i++){ this._chunkArgumentData(methodArgs[i], i); } // execute the method plugin.exec(methodName); // get the return result var results = this._chunkReturnData(); // decode the results results = this._decodeData(results); // reset everything plugin.endExec(); return results; }}/** Figures out the best way to automatically install the Flash plugin for this browser and platform. Also determines if installation or revving of the current plugin is needed on this platform.*/dojo.flash.Install = function(){}dojo.flash.Install.prototype = { /** Determines if installation or revving of the current plugin is needed. */ needed: function(){ // do we even have flash? if(dojo.flash.info.capable == false){ return true; } // are we on the Mac? Safari needs Flash version 8 to do Flash 8 // communication, while Firefox/Mac needs Flash 8 to fix bugs it has // with Flash 6 communication if(dojo.render.os.mac == true && !dojo.flash.info.isVersionOrAbove(8, 0, 0)){ return true; } // other platforms need at least Flash 6 or above if(!dojo.flash.info.isVersionOrAbove(6, 0, 0)){ return true; } // otherwise we don't need installation return false; }, /** Performs installation or revving of the Flash plugin. */ install: function(){ //dojo.debug("install"); // indicate that we are installing dojo.flash.info.installing = true; dojo.flash.installing(); if(dojo.flash.info.capable == false){ // we have no Flash at all //dojo.debug("Completely new install"); // write out a simple Flash object to force the browser to prompt // the user to install things var installObj = new dojo.flash.Embed(false); installObj.write(8); // write out HTML for Flash 8 version+ }else if(dojo.flash.info.isVersionOrAbove(6, 0, 65)){ // Express Install //dojo.debug("Express install"); var installObj = new dojo.flash.Embed(false); installObj.write(8, true); // write out HTML for Flash 8 version+ installObj.setVisible(true); installObj.center(); }else{ // older Flash install than version 6r65 alert("This content requires a more recent version of the Macromedia " +" Flash Player."); window.location.href = + dojo.flash.Embed.protocol() + "://www.macromedia.com/go/getflashplayer"; } }, /** Called when the Express Install is either finished, failed, or was rejected by the user. */ _onInstallStatus: function(msg){ if (msg == "Download.Complete"){ // Installation is complete. dojo.flash._initialize(); }else if(msg == "Download.Cancelled"){ alert("This content requires a more recent version of the Macromedia " +" Flash Player."); window.location.href = dojo.flash.Embed.protocol() + "://www.macromedia.com/go/getflashplayer"; }else if (msg == "Download.Failed"){ // The end user failed to download the installer due to a network failure alert("There was an error downloading the Flash Player update. " + "Please try again later, or visit macromedia.com to download " + "the latest version of the Flash plugin."); } }}// find out if Flash is installeddojo.flash.info = new dojo.flash.Info();// vim:ts=4:noet:tw=0:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -