Что у меня есть:
- SWF экспортирует функцию через ExternalInterface
- Javascript создает новый объект для встраивания и добавляет его в документ
- Вызов функции флеш-памяти работает нормально в других браузерах
- Сбой вызова функций флэш-памяти в 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';
Пример вызова внешнего интерфейса flash в javascript:
try
{
e = b.isActive();
}
catch (__exc){ }
В IE он будет ловить с сообщением «Объект не поддерживает это свойство или метод»
Как это исправить?
- Похожие: http://bojolais.livejournal.com/251383.html
- Похожие: ExternalInterface не работает в IE
- Похожие: http://swfupload.org/forum/generaldiscussion/985
- Похожие: http://code.google.com/p/doctype/wiki/ArticleFixingFlashExternalInterface
- Похожие: http://www.dangerouslyawesome.com/2006/10/20/another-swfobject-problem-deproblemed/
- Похожие: http://www.airtightinteractive.com/news/?p=71
В отладчике сценария я вижу сторонний сценарий, который должен быть мостом:
function __flash__arrayToXML(obj) {
var s = "<array>";
for (var i=0; i<obj.length; i++) {
s += "<property id=\"" + i + "\">" + __flash__toXML(obj[i]) + "</property>";
}
return s+"</array>";
}
function __flash__argumentsToXML(obj,index) {
var s = "<arguments>";
for (var i=index; i<obj.length; i++) {
s += __flash__toXML(obj[i]);
}
return s+"</arguments>";
}
function __flash__objectToXML(obj) {
var s = "<object>";
for (var prop in obj) {
s += "<property id=\"" + prop + "\">" + __flash__toXML(obj[prop]) + "</property>";
}
return s+"</object>";
}
function __flash__escapeXML(s) {
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
}
function __flash__toXML(value) {
var type = typeof(value);
if (type == "string") {
return "<string>" + __flash__escapeXML(value) + "</string>";
} else if (type == "undefined") {
return "<undefined/>";
} else if (type == "number") {
return "<number>" + value + "</number>";
} else if (value == null) {
return "<null/>";
} else if (type == "boolean") {
return value ? "<true/>" : "<false/>";
} else if (value instanceof Date) {
return "<date>" + value.getTime() + "</date>";
} else if (value instanceof Array) {
return __flash__arrayToXML(value);
} else if (type == "object") {
return __flash__objectToXML(value);
} else {
return "<null/>"; //???
}
}
function __flash__addCallback(instance, name) {
instance[name] = function () {
return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
}
}
function __flash__removeCallback(instance, name) {
instance[name] = null;
}