我有以下问题。我有一个嵌入在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很好,一切都很好。谢谢大家。