Как назвать динамично созданную флэш-память внешним интерфейсом в IE из JavaScript?

Что я имею:

  1. swf экспортирует функцию через ExternalInterface
  2. JavaScript создает новый, встраивают объект, и добавляет его к документу
  3. Вызывание функций флэш-памяти хорошо работает в других браузерах
  4. Вызывание функций флэш-памяти перестанет работать в IE 8

Пример экспорта функций в swf:

flash.external.ExternalInterface.addCallback("isActive", ...

Пример создания встроить объекта:

var b = document.createElement('embed');

    b.type = 'application\u002fx-shockwave-flash';
    b.setAttribute('allowFullScreen', 'true');
    b.setAttribute('allowNetworking', 'all');
    b.setAttribute('allowScriptAccess', 'always');
    b.width = 500;
    b.height = 400;
    b.src = 'assets\u002fUltra4.UltraApplication\u002fUltra4.UltraApplication+UltraSprite.swf';

Пример вызова флэш-памяти внешний интерфейс в JavaScript:

   try
    {
      e = b.isActive();
    }
    catch (__exc){ }

В IE это поймает с сообщением "Объект, не поддерживает это свойство или метод"

Как зафиксировать его?

  1. Похожие страницы: http://bojolais.livejournal.com/251383.html
  2. Похожие страницы: ExternalInterface, не работающий в IE
  3. Похожие страницы: http://swfupload.org/forum/generaldiscussion/985
  4. Похожие страницы: http://code.google.com/p/doctype/wiki/ArticleFixingFlashExternalInterface
  5. Похожие страницы: http://www.dangerouslyawesome.com/2006/10/20/another-swfobject-problem-deproblemed/
  6. Похожие страницы: http://www.airtightinteractive.com/news/?p=71

В отладчике сценариев I видят сторонний сценарий, который, как предполагается, является мостом:

function __flash__arrayToXML(obj) {
    var s = "";
    for (var i=0; i" + __flash__toXML(obj[i]) + "";
    }
    return s+"";
}
function __flash__argumentsToXML(obj,index) {
    var s = "";
    for (var i=index; i";
}
function __flash__objectToXML(obj) {
    var s = "";
    for (var prop in obj) {
        s += "" + __flash__toXML(obj[prop]) + "";
    }
    return s+"";
}
function __flash__escapeXML(s) {
    return s.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'");
}
function __flash__toXML(value) {
   var type = typeof(value);
    if (type == "string") {
        return "" + __flash__escapeXML(value) + "";
    } else if (type == "undefined") {
        return "";
    } else if (type == "number") {
        return "" + value + "";
    } else if (value == null) {
        return "";
    } else if (type == "boolean") {
        return value ? "" : "";
    } else if (value instanceof Date) {
        return "" + value.getTime() + "";
   } else if (value instanceof Array) {
       return __flash__arrayToXML(value);
   } else if (type == "object") {
       return __flash__objectToXML(value);
   } else {
        return ""; //???
    }
}
function __flash__addCallback(instance, name) {
  instance[name] = function () { 
    return eval(instance.CallFunction("" + __flash__argumentsToXML(arguments,0) + ""));
  }
}
function __flash__removeCallback(instance, name) {
  instance[name] = null;
}

7
задан Community 23 May 2017 в 11:53
поделиться

3 ответа

Я не знаю, почему кто-то делает * ,/,% операций, в то время как простые побитовые операции могут делать такие вещи.

a = (c & 0x0F) < < 4;
b = (c & 0xF0) > > 4;
c = a 'b;

-121--4244596-

Глобальная переменная решит мою задачу на данный момент и только с одной ссылкой на $ global: arg _ environent будет легко изменить, если я найду лучший способ ввести свойства.

build.ps1

param(
    [Parameter(Position=0,Mandatory=0)]
    [string]$task,
    [Parameter(Position=1,Mandatory=0)]
    [string]$environment = 'dev'
)

clear
$global:arg_environent = $environment
Import-Module .\psake.psm1 
Invoke-psake tasks.ps1 $task
Remove-Module psake

tasks.ps1

properties {
    $environment = $global:arg_environent
}

task default -depends Deploy

task Deploy {  
   echo "Copy stuff to $environment"
}
-121--1906121-

Я не уверен, что правильно понимаю ваш вопрос. Но я думаю, что вы упускаете пару вещей:

1) Ваша встраиваемый тэг нуждается в атрибуте имени. Назовем его «NewStartMovie» для последующего кода:

b.name = "NewFlashMovie";

2) Функцию «isActive» нужно вызывать по-другому с помощью внешней функции. Сначала добавьте эту функцию

 function thisMovie(movieName) {
     if (navigator.appName.indexOf("Microsoft") != -1) {
         return window[movieName];
     } else {
         return document[movieName];
     }
 }

Затем вы можете вызвать функцию, как это

thisMovie («NewStartMovie») .isActive ();

Из моего опыта, этот «thisMovie» необходим для моста вызовов IE-Flash. Это также описано в документации ExternalInterface

3) Вместо создания собственного объекта «встраивания» рекомендуется использовать swfobject .

Надеюсь, это поможет.

3
ответ дан 7 December 2019 в 14:32
поделиться

Может ли это быть связано с тем, что вы создаете тег Embed вместо тега Object? IE традиционно использует теги объектов для встраивания Flash-содержимого

См. Технологию Adobe не для обсуждения: http://kb2.adobe.com/cps/415/tn_4150.html

0
ответ дан 7 December 2019 в 14:32
поделиться

Я обнаружил, что для IE, вызывая Javascript из ActionScript, мне нужно было указать атрибут id для объекта тег. Способ IE для обработки ExternalInterface.call (...) заключается в вызове метода объекта . IE выдает код

document.getElementById("...").SetReturnValue(...)

Без атрибута id в теге вашего объекта это сокращается до

document.getElementById("").SetReturnValue(...)

, который пытается вызвать SetReturnValue для нулевого объекта.

Обратите внимание, что атрибут «id» не требуется для других браузеров, но это тоже не повредит.

Нечто подобное может происходить и в вашем случае: возможно, может помочь атрибут «name» на embed .

1
ответ дан 7 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: