Сбой вызова метода JS через ExternalInterface из Flash в Chrome - PullRequest
1 голос
/ 30 ноября 2011

У меня есть следующая проблема. У меня есть флэш-фильм, встроенный в страницу 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 и все в порядке.Спасибо всем.

...