3

Мальчик-о-мальчик, я ненавижу внешний интерфейс. У меня есть видеоплеер, который использует внешний интерфейс для управления флэш-объектом и позволяет объекту Flash передавать сообщения на один и тот же javascript. Некоторое время он работал хорошо во всех браузерах. Потом еще несколько дней назад я пошел, чтобы пойти проверить его во всех браузерах, прежде чем я переехал проект из развития, и обнаружил, что применение сломало в Internet Explorer 9. появилась следующее сообщение об ошибке в консоли:Внешний интерфейс и Internet Explorer 9 issue

SCRIPT16389: Could not complete the operation due to error 8070000c. 
jquery.min.js, line 16 character 29366 

Моего javascript-файл действительно длинный, но вот важные части. Все мои действия содержатся в объекте, который я создал. Внутри одного из моих методов я есть следующие строки:

var that = this; 
that.stop(); 

здесь все методы, которые вызываются в результате этого метода:

this.stop = function(){ 
    var that = this; 
    console.log('stop called'); 
    that.pause(); 
    that.seek(0); 
    that.isPlaying = false; 
    console.log('stop finished'); 
}; 

this.pause = function(){ 
    var that = this; 
     console.log('pause called'); 
    if(that.player == 'undefined' || that.player == null){ 
     that.player = that.GetMediaObject(that.playerID); 
    } 
    that.player.pauseMedia(); //external interface call 
    that.isPlaying = false; 
    console.log('pause finished'); 
}; 

this.seek = function(seek){     
    var that = this; 
    console.log('seek called'); 
    if(that.player == 'undefined' || that.player ==null){ 
     console.log("player="+that.player+". resetting player object"); 
     that.player = that.GetMediaObject(that.playerID); 
     console.log("player="+that.player); 
    } 
    that.player.scrubMedia(seek); //external interface call 

    console.log('seek finished');    
}; 

//this method returns a reference to my player. This method is call once when the page loads and then again as necessary by all methods that make external interface calls 
this.GetMediaObject = function(playerID){ 
    var mediaObj = swfobject.getObjectById(playerID); 
     console.log('fetching media object: ' +mediaObj); 

     //if swfobject.getObjectById fails 
     if(typeof mediaObj == 'undefined' || mediaObj == null){ 
       console.log('secondary fetch required'); 
     var isIE = navigator.userAgent.match(/MSIE/i); 
     mediaObj = isIE ? window[playerID] : document[playerID]; 
    } 

    return mediaObj; 
}; 

Вот вывод из моих console.log statments:

LOG: fetching media object: [object HTMLObjectElement] 
LOG: video-obj-1: ready 
LOG: stop called 
LOG: pause called 
LOG: pause finished 
LOG: seek called 
LOG: player=[object HTMLObjectElement] 
SCRIPT16389: Could not complete the operation due to error 8070000c. 
jquery.min.js, line 16 character 29366 

интересно то, что кажется, что первый внешний интерфейс вызова «that.player.pauseMedia()» не имеет какой-либо вопрос, но последующий вызов «that.player.scrubMedi a (0) 'терпит неудачу. Еще одна особенность заключается в том, что он указывает на jquery как источник ошибки, но в jQuery нет этих функций.

Вот что я знаю, что это не так. Это не проблема, когда мое время отключено. Последняя строка моего ActionScript отправляет сообщение в javascript, когда объект Flash полностью загружен. Также я устанавливаю параметр «allowScriptAccess» на «всегда», так что это тоже не так. Файл actionscript, который мы используем, использовался в предыдущих проектах, поэтому я на 90% уверен, что это не проблема.

вот мой ActionScript в любом случае. Я не писал, и я ActionScript я не слишком хорошо знаком с языком, но я пытался поставить в тех частях, которые казались наиболее уместны для моего приложения:

flash.system.Security.allowDomain("*.mydomain.com"); 

import flash.external.ExternalInterface; 

// variables to store local information about the current media 
var mediaEmbedServer:String = "www"; 
var mediaPlayerID:String; 
var mediaFile:String; 
var mediaDuration:Number; 

// variables to be watched by actionscript and message javascript on changes 
var mediaPositions:String = "0,0"; // buffer position, scrub position 
var mediaStatus:String; 

var netStreamClient:Object = new Object(); 
netStreamClient.onMetaData = metaDataHandler; 
netStreamClient.onCuePoint = cuePointHandler; 

var connection:NetConnection; 
var stream:NetStream; 
var media:Video = new Video(); 

// grab the media's duration when it becomes available 
function metaDataHandler(info:Object):void { 
mediaDuration = info.duration; 
} 

function cuePointHandler(info:Object):void { 
} 

connection = new NetConnection(); 
connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 

try { 
var paramName:String; 
var paramValue:String; 
var paramObject:Object = LoaderInfo(this.root.loaderInfo).parameters; 
for (paramName in paramObject) { 
paramValue = String(paramObject[paramName]); 
switch (paramName){ 
case "server": 
mediaEmbedServer = paramValue; 
break 
case "playerID": 
mediaPlayerID = paramValue; 
break 
} 
} 
} catch (error:Error) { 
} 

if (mediaEmbedServer == "dev" || mediaEmbedServer == "dev2"){ 
connection.connect("rtmp://media.developmentMediaServer.com/myApp"); 
} else { 
connection.connect("rtmp://media.myMediaServer.com/myApp"); 
} 

function securityErrorHandler(event:SecurityErrorEvent):void { 
trace("securityErrorHandler: " + event); 
} 

function connectStream():void { 
stream = new NetStream(connection); 
stream.soundTransform = new SoundTransform(1); 
stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
stream.client = netStreamClient; 
media.attachNetStream(stream); 
media.width = 720; 
media.height = 405; 
addChild(media); 
} 

function netStatusHandler(stats:NetStatusEvent){ 
switch (stats.info.code){ 
case "NetConnection.Connect.Success": 
connectStream(); 
break; 
case "NetConnection.Call.BadVersion": 
case "NetConnection.Call.Failed": 
case "NetConnection.Call.Prohibited": 
case "NetConnection.Connect.AppShutdown": 
case "NetConnection.Connect.Failed": 
case "NetConnection.Connect.InvalidApp": 
case "NetConnection.Connect.Rejected": 
case "NetGroup.Connect.Failed": 
case "NetGroup.Connect.Rejected": 
case "NetStream.Connect.Failed": 
case "NetStream.Connect.Rejected": 
case "NetStream.Failed": 
case "NetStream.Play.Failed": 
case "NetStream.Play.FileStructureInvalid": 
case "NetStream.Play.NoSupportedTrackFound": 
case "NetStream.Play.StreamNotFound": 
case "NetStream.Seek.Failed": 
case "NetStream.Seek.InvalidTime": 
// report error status and reset javascriptPlay 
clearInterval(progressInterval); 
messageStatus("error"); 
break; 
default: 
// check time through file to determine if media is over 
if (stream.time > 0 && stream.time >= (mediaDuration - .25)){ 
// reset media if it has ended 
clearInterval(progressInterval); 
stream.play(mediaFile, 0, 0); 
messageStatus("finished"); 
} 
} 
}; 

var progressInterval:Number; 

// respond to a play/pause request by playing/pausing the current stream 
function pauseMedia(){ 
clearInterval(progressInterval); 
if (mediaStatus == 'playing'){ 
stream.pause(); 
messageStatus("paused"); 
} 
}; 
ExternalInterface.addCallback("pauseMedia", pauseMedia); 

// respond to a scrub request by seeking to a position in the media 
function scrubMedia(newPosition){ 
clearInterval(progressInterval); 
if (mediaStatus == "playing"){ 
stream.pause(); 
messageStatus("paused"); 
} 
stream.seek(newPosition * mediaDuration); 
var positionSeconds = newPosition * mediaDuration; 
messagePositions(positionSeconds+","+positionSeconds); 
}; 
ExternalInterface.addCallback("scrubMedia", scrubMedia); 


ExternalInterface.call("MediaPlayerReady", mediaPlayerID); 

ответ

0

Звучит как undefined expando property, которая может быть вызвана jQuery IE9 bug , Лучший способ для отладки это, чтобы удалить тест UserAgent и заменить его проверкой на элемент объекта, например:

document.getElementsByTagName("object")[0].outerHTML 

, чтобы увидеть ли атрибут ID, изменяется после первого щелчка по JQuery.

0

У меня была эта проблема с использованием JPEGCam, который также использует внешний интерфейс вспышки. Мой контроль над веб-камерой динамически загружался в div и затем выкидывал эту ошибку в IE (не firefox или chrome). После перемещения инициализации моего управления вспышкой на document.ready на родительской странице, затем скрыть/показать/перемещать элемент управления по мере необходимости, я смог обойти это исключение.

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