外部接口和 Internet Explorer 9 问题

2023-12-25

天哪,我讨厌外部接口吗?我有一个视频播放器,它利用外部接口来控制 Flash 对象并允许 Flash 对象将消息传递给相同的 JavaScript。有一段时间它在所有浏览器中都运行良好。然后几天前,在我将项目移出开发之前,我去所有浏览器中测试它,发现该应用程序在 Internet Explorer 9 中崩溃了。控制台中出现以下错误:

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 语句的输出:

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.scrubMedia(0)”的调用失败了。另一个奇怪的事情是它指出 jquery 作为错误的来源,但在这些函数中没有调用 jquery。

这就是我所知道的。这不是我的时机不对的问题。当 Flash 对象完全加载时,我的动作脚本的最后一行向 JavaScript 发送一条消息。另外,我将参数“allowScriptAccess”设置为“始终”,所以也不是这样。我们使用的动作脚本文件已在以前的项目中使用过,所以我 90% 确定这不是问题。

无论如何,这是我的动作脚本。我没有编写动作脚本,而且我对该语言不太熟悉,但我尝试放入与我的应用程序最相关的部分:

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);   

听起来像未定义的扩展属性 http://msdn.microsoft.com/en-us/library/ie/gg622931这可能是由jQuery IE9 错误 http://bugs.jquery.com/ticket/8485。调试它的最佳方法是删除 userAgent 测试并将其替换为对 object 元素的检查,例如:

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

查看 jQuery 第一次单击后 ID 属性是否被更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

外部接口和 Internet Explorer 9 问题 的相关文章

  • Access / Word 2010 VBA 邮件合并尝试打开 [文件夹名称].mdb 而不是 ACCDB 源

    我们正在尝试从 Access 中自动执行邮件合并过程 单击按钮后 VBA 将运行指定当前数据库 accdb 作为数据源并运行 SQL 具体代码如下 Set up Word Dim objWord As Object Set objWord
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 在哪里存储 Java 的 .properties 文件?

    The Java教程 http download oracle com javase tutorial essential environment properties htmlon using Properties 讨论如何使用 Prop
  • 没有 OAuth 的 Spring Security JWT

    最近我开始学习如何使用oauth 2 0 jwt配置spring boot 我有一个问题 是否可以使用spring boot security jwt避免oauth 2 0 是的 可以使用JWT无需使用标准化的功能OAuth 2 0 flo
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1
  • ngmodel与Angular2中复选框的动态数组绑定

    我有一个 Angular 2 组件 其中我从数组生成复选框列表 现在我需要根据选中的复选框填充不同的数组 这应该是双向绑定 这意味着如果复选框的值已在数组中 则必须已经检查了复选框 我在 Angular 1 中使用了一个名为 checkli
  • 闪亮井板宽度

    library shiny library shinydashboard ui lt dashboardPage dashboardHeader dashboardSidebar dashboardBody wellPanel tags d
  • 您可以使用关键字参数而不提供默认值吗?

    我习惯于在 Python 中使用这样的函数 方法定义 def my function arg1 None arg2 default do stuff here 如果我不供应arg1 or arg2 那么默认值None or default
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • NGinx $proxy_add_x_forwarded_for 和 real_ip_header

    我在 NGinx 下有一个 web 应用程序和另一个前端负载均衡器 如下所示 x x x x IP 地址 客户端 a a a a gt LB b b b b gt NGX c c c c gt WEBAPP d d d d 这是我的 NGi
  • 带显示块的SPAN

    和默认有什么区别 div 元素和默认值 span 元素与display block HTML 元素的有效性和语义存在差异 否则它们是相同的 div and span两者都被定义为通用容器 在 HTML 方面没有更深层次的含义 一个默认为块显
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 自定义 Visual Studio 2008 中的位置栏

    有人成功定制了 VS 2008 的 Places Bar 吗 我从 VS 2005 进行的自定义设置并没有转移到 2008 显然 并且无论我如何处理注册表 我都无法使我的自定义位置出现在 打开 对话框中 我已经阅读并应用了相关的MS KB文
  • 从 Azure 应用服务连接到 MongoDB Atlas 集群

    我在 Azure 上有一个 Web 应用程序 它连接到 Atlas cloud mongodb com 上托管的 MongoDB 集群 我想使用 Atlas 这样我就不必关心 MongoDb 配置 问题是我的集群连接超时 我必须在我的 mo
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder
  • 使用泛型全面实现特征

    我正在通过实现矩阵数学来练习 Rust 但遇到了一些障碍 我定义了我认为与矩阵相关的特征 trait Matrix
  • Android:如何检测手机设置中的语言已更改

    我如何检测我的手机语言是否已更改 例如 Facebook 应用程序将向我们宣布 please wait we preparing your language i used myString Locale getDefault getDisp
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public
  • 保存符号方程以供以后使用?

    From here http www mathworks com help releases R2011a toolbox symbolic brvfu8o 1 html brvfxem 1 我正在尝试求解这样的符号方程组 syms x y
  • CUDA 中指令重放的其他原因

    这是我从 nvprof CUDA 5 5 获得的输出 Invocations Metric Name Metric Description Min Max Avg Device Tesla K40c 0 Kernel MyKernel do

随机推荐

  • 尝试在空对象引用上调用虚拟方法“void android.widget.Editor$SelectionModifierCursorController.hide()”

    此错误似乎仅发生在使用 Android 6 0 1 的三星手机上 或 7 0 Fatal Exception java lang NullPointerException Attempt to invoke virtual method v
  • 在实用函数中使用 Django request.session

    我正在尝试打电话request session get items 来自自定义 util 函数util py 但在该文件中 request对象不可访问 我可以从views py 传递请求对象 但我不想这样做 有没有办法在自定义函数 而不是视
  • Google Sheets - 当文件名相同时,脚本为“替换”而不是“创建”

    编辑以尝试使其更容易理解 这是我所做的 我创建了一个 Google 电子表格 我创建了一个脚本 使用基于服务日期和客户名称的文件名将其保存到 Google 云端硬盘文件夹中 这是我目前拥有的脚本 This creates a custom
  • 使用 DOMDocument,是否可以获取某个 DOM 中存在的所有元素?

    假设我有一个包含许多不同元素的 HTML 文件 每个元素都有不同的属性 假设我事先不知道这个 HTML 会是什么样子 使用 PHP 的 DOMDocument 我如何迭代ALL元素并修改它们 我看到的只是 getElementByTagNa
  • 如何使用多个表插入数据

    我创建了一个数据库名称电影库系统 其中有 3 个表 分别是类型 发行商和电影 现在 1 个发行商可以有很多电影 而 1 部电影有多种类型 在电影表中 发行商 id 和 typeid 充当外键 我的问题是如何将数据插入到电影表中 我已经将数据
  • 折叠一个布局,但将另一个布局保留在底部

    我有这样的布局 没有颜色 https i stack imgur com OdSda png https i stack imgur com OdSda png 选项卡的布局 单独的 xml 文件 relativelayout 1 围绕其他
  • 在scala中创建多维数组

    我正在解析这样的 json 对象 val product array Option Any scala util parsing json JSON parseFull products json var product array2 Ar
  • 当值具有实体时,Selenium WebDriver get_attribute 返回 href 属性的截断值

    我正在尝试使用 selenium Webdriver Python 从应用程序页面上的锚点选项卡获取 href 属性值 并且返回的结果已被剥离 这是 HTML 片段 a class nla row text href shopping br
  • 有效计算两个 std::multimap 迭代器之间的条目数

    我想计算两个迭代器之间的条目数std multimap在不到 O N 的时间内 有什么技巧或巧妙的方法可以做到这一点吗 Since std multimap有双向迭代器 我的理解是这样的std distance可以在 O N 时间内完成 其
  • 自举流体和静态容器

    我正在尝试在单页引导布局中将流体容器与固定容器结合起来 我想要的是 例如 有一个大图像作为英雄单元 但不是英雄单元 视口的 100 宽度 高度 或者 3 列图像除以 100 但在其他情况下 在同一页面内 它将具有最大 1200px 容器以及
  • JavaScript 代码约定 - 变量声明 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PHP中有pdf模板的解决方案吗?

    我需要通过 PHP 生成 pdf 格式的报价 并使用模板和从数据库检索的动态值 它可行吗 更新 我看到人们最近对此表示赞同 并想补充一点wkhtml转pdf http code google com p wkhtmltopdf对于大多数应用
  • pymssql 抛出 ImportError: 使用 py2exe 构建应用程序时没有名为 _mssql 的模块

    我有 python 应用程序应该作为 Windows 可执行文件启动 我正在使用 py2exe 和 pymssql 1 9 908 我使用下一个构建脚本来生成应用程序 from distutils core import setup imp
  • 使用具有相同控制器的 STI 路径

    我正在使用 STI 想知道是否必须为每个型号配备单独的控制器 我遇到了一种情况 我只对 STI 关系中的一个模型使用创建和编辑操作 但如果我尝试为其创建表单 则会收到 未定义方法 错误 更具体地说 我有两个继承自 List 的模型 clas
  • Emacs lisp 计算 alist 中的变量

    这是一个后续问题Emacs Lisp 评估列表中的变量 https stackoverflow com questions 1664202 emacs lisp evaluate variable in alist 我正在尝试设置defau
  • Android中动态设置TextView的宽度和高度

    我正在尝试动态设置 TextView 宽度 使用setWidth width method txtviewOne setWidth 10 txtviewTwo setWidth 10 但没有成功 请帮助我如何动态设置textview的宽度
  • Python的collections.Counter和nltk.probability.FreqDist之间的区别

    我想计算文本语料库中单词的术语频率 我已经使用 NLTK 的 word tokenize 和probability FreqDist 一段时间来完成这项工作 word tokenize 返回一个列表 通过 FreqDist 将其转换为频率分
  • 在android中复制列表项

    我找到了一个示例 它在列表视图中显示所有联系人 并让您呼叫单击的联系人 但是 我只想复制联系电话放在剪贴板上 并在选择列表项时显示 toast public class ContactListActivity extends Activit
  • Ansible:检查服务是否正在侦听特定端口

    您将如何使用 Ansible 来确认服务是否正在特定端口上运行 例如 Apache 是否在端口 80 上运行 MySQL 是否正在监听 3912 端口 Tomcat 正在监听 8080 端口吗 据我了解 有service and wait
  • 外部接口和 Internet Explorer 9 问题

    天哪 我讨厌外部接口吗 我有一个视频播放器 它利用外部接口来控制 Flash 对象并允许 Flash 对象将消息传递给相同的 JavaScript 有一段时间它在所有浏览器中都运行良好 然后几天前 在我将项目移出开发之前 我去所有浏览器中测