通过ExternalInterface从Flash调用JS方法在Chrome中失败

时间:2011-11-30 11:12:29

标签: javascript flash google-chrome flash-builder externalinterface

我有以下问题。我有一个嵌入在HTML页面中的flash影片。有一个按钮,当按下时,JavaScript方法开始调用Flash中的一个函数。然后Flash通过在HTML页面中调用JavaScript方法来响应。这个循环在IE和FireFox中运行良好。但它在谷歌浏览器中不起作用。经过一些调试后,我发现应该从Flash调用的JavaScript方法永远不会被触发。我无法理解为什么?这是我在Flash中的代码:

public static function update(transparent:Boolean = true, bgColor:Number = 0xFFFFFFFF, matrix:Matrix = null):void {
    if (!_enabled) return;
    if (_printSource == null) throw new Error("No source specified");
    if (!ExternalInterface.available) throw new Error("External Interface not available");

    var bitmap:BitmapData = new BitmapData(_printSource.width, _printSource.height, transparent, bgColor);
    bitmap.draw(_printSource, matrix,null,null,null,true);
    _base64encoder.reset();

    _base64encoder.encodeBytes(_pngEncoder.encode(bitmap));
    ExternalInterface.call("FlashPrintFix.setImg", ExternalInterface.objectID, _base64encoder.toString());
    }

正如您所看到的,此方法从FlashPrintFix JS文件中调用了一个名为“setImg”的函数。

现在JS中的方法看起来像这样(虽然它的内容并不重要,因为它从未在Chrome中触发过:

FlashPrintFix.setImg = function(objId, imgData) {

var obj = document.getElementById("graph");
     var obj =  document["graph"];
if (obj === null) {
    throw new Error("Can't find node with id '" + objId + "'");
}

obj.setAttribute("class", "printableFlashObj");

var container = obj.parentNode;
if (container.nodeName === "OBJECT") {
    container = container.parentNode;

}

var img = document.createElement("img");
img.setAttribute("class", "flashScreenshot");
img.src = "data:image/png;base64,"+imgData;
img.setAttribute("id", "imgPrnt");
    container.appendChild(img);
   $('imgPrnt').ready(function() {

          alert("Image is loaded");


        });};

这是HTML中的代码。因为它是一个CakePHP视图,所以默认情况下它不包含所有常规HTML标记。这些是在运行时由PHP +布局容器包装器生成的。但是以下代码负责Flash文件嵌入并且它驻留在HTML页面主体期间运行时:

<script type="text/javascript" >
 var currentUrl=<?php echo "'".XXXXXXX."'" ?>+'/XXX/XXXxXXXXXXX/';
$(document).ready(initApp());

 function initApp(){
  $("#flashContentWrapper").flash(
  {

        swf:currentUrl+<?php echo "'$app_filename'" ?>,
        id:"graph",
        name:"graph",
        allowScriptAccess:"always",
    height:600,
    width:1000,
    flashvars:{ 
        key:<?php echo "'$someKey'"?>
    }
  }
);

更新: 好吧,放弃我的理论,即JavaScript不是通过Flash从外部调用来调用的。实际问题出在FlashPrintFix.js中。对于那些使用插件在Flash中打印Flash内容的人来说,不支持的浏览器如Firefox或Chrome应该修复这个问题。脚本中的一行:

 FlashPrintFix.needPrintFix = function () {
   var needF= /chrome|firefox|opera/i.test(navigator.userAgent);//<----Add "chrome" before "firefox"
   alert(needF);
   return  needF;


 };

问题是默认情况下var needF如下所示:

 var needF= /firefox|opera/i.test(navigator.userAgent);

对于无法打印Flash的浏览器,此变量的任务返回true,而对于可能的浏览器,则返回false。因为默认情况下不检查chrome,因此此var总是返回true.If为false FlashPrintFix的Flash类不处理JS方面的调用,因为它认为浏览器打印Flash很好,一切都很好。谢谢大家。

0 个答案:

没有答案