【问题标题】:IE11 JavaScript (Error: SCRIPT445) "Object doesn't support this action"IE11 JavaScript(错误:SCRIPT445)“对象不支持此操作”
【发布时间】:2015-10-24 06:21:48
【问题描述】:

我使用异步加载 youtube 播放器 API 的 Javascript 解决方案。 整个脚本应该在滚动到其位置时播放视频。 它适用于所有浏览器以及 IE(11),但 有时 在 IE 中我在开发人员工具中收到错误:SCRIPT445(对象不支持此操作)

Youtube 播放器仍然可以工作,但它似乎使其他脚本崩溃。我在网上和 Stackoverflow 上环顾四周。似乎还有其他人有类似的问题,但他们太具体了。也许有人可以帮我解决这个问题。这是导致问题的代码部分:

var yt_int, yt_players={},
    initYT = function() {
        $(".ytplayer").each(function() {
            yt_players[this.id] = new YT.Player(this.id);    <-- Error line 
        });
    };

$.getScript("//www.youtube.com/player_api", function() {
    yt_int = setInterval(function(){
        if(typeof YT === "object"){
            initYT();
            clearInterval(yt_int);
        }
    },500);
});

【问题讨论】:

  • 是否有可能在加载 youtube 播放器脚本之前运行错误行?
  • 当然,很有可能 ;) 我认为 yt_int 必须在 getScript 使用它之前声明。所以你的意思是切换$.getScript()var yt_int, yt_players={} 的位置会有帮助吗?我刚试过..似乎有效,问题是它非常零星(难以调试)
  • 某种竞争条件是我唯一能想到的,也许可以尝试使用 setTimeout 来卸载 init 函数的执行。而不是 initYT(),setTimeout(initYT, 0)。
  • 所以,在 3 个不同的系统上进行了 30 多次刷新后,setTimeout(initYT, 0) 似乎真的修复了它 :) 非常感谢!我怎样才能将您的评论声明为正确答案?
  • 添加了答案。很高兴我能帮上忙!

标签: javascript youtube internet-explorer-11


【解决方案1】:

对象不支持此操作是错误出现在 IE11 中使用 window.dispatchEvent(new Event('resize'));我们需要处理 ie11 的条件。

 if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
                   var evt = document.createEvent('UIEvents');
                   evt.initUIEvent('resize', true, false, window, 0);
                   window.dispatchEvent(evt);
        } else {
                 window.dispatchEvent(new Event('resize'));
        }

【讨论】:

【解决方案2】:

在整个脚本被评估之前,IE 中有一个竞争条件会触发您的脚本加载器回调。通过使用setTimeout(initYT, 0),您将允许脚本在触发初始化函数之前完成评估。很高兴它成功了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多