У меня есть следующая проблема. У меня есть флэш-фильм, встроенный в страницу HTML. Есть кнопка, при нажатии которой метод JavaScript начинает вызывать функцию внутри Flash. Затем Flash отвечает, вызывая метод JavaScript на странице HTML.,Этот цикл отлично работает в IE и FireFox.Но это не работает в Google Chrome. После некоторых отладок я обнаружил, что метод JavaScript, который должен вызываться из Flash, никогда не запускается. Не могу понять почему?Вот мой код во 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());
}
Как вы можете видеть, этот метод вызывает функцию setImg из JS-файла FlashPrintFix.
Теперь метод в 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 не вызывается через ExternalInterface из 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);
Обязанность этой переменной возвращать true для браузера, который не может печатать Flash, и false для браузера, который может. Потому что по умолчанию chrome не проверяется, и поэтому этот var всегда возвращает true. Если это false,Класс Flash для FlashPrintFix не обрабатывает вызовы на стороне JS, поскольку считает, что браузер хорошо печатает Flash и все в порядке.Спасибо всем.