You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jQuery动态添加VLC插件时IE自动将object宽高设为0的问题

解决IE中动态插入VLC插件宽高被设为0的问题

这种情况我太熟悉了——IE对ActiveX控件的动态插入总是有各种奇怪的“自作主张”,尤其是VLC的axvlc控件,经常会把你设置好的宽高直接清零。给你几个亲测有效的解决办法:

方法一:用innerHTML插入而非jQuery直接append

jQuery在处理IE下的ActiveX标签时,解析逻辑可能会出问题。换个思路,先创建一个空的容器元素,再把完整的object HTML字符串赋值给它的innerHTML,最后把容器加到页面里:

// 先准备好VLC插件的HTML字符串
var vlcHtml = '<object width="285" height="185" id="A9AC8F7084A4743A8198A6E1EF89BA1" classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921" codebase="http://download.videolan.org/pub/videolan/vlc/last/win32/axvlc.cab" style="left: 0px; top: 0px; width: 285px; height: 185px;" events="True">' +
    '<param name="Src" value="rtsp://10.1.34.236:654/01000000-0001-BABE-0007-000F7C140DF5/live">' +
    '<param name="controls" value="false">' +
    '<param name="autostart" value="true">' +
    '<param name="allowfullscreen" value="false">' +
    '<embed name="A9AC8F7084A4743A8198A6E1EF89BA1" width="285" height="185" pluginspage="http://www.videolan.org" type="application/x-vlc-plugin" target="rtsp://10.1.34.236:654/01000000-0001-BABE-0007-000F7C140DF5/live" autoplay="false">' +
'</object>';

// 创建空容器并插入HTML
var container = $('<div></div>');
container.html(vlcHtml);
// 把容器加到目标位置
$('#your-target-container').append(container);

方法二:插入后强制重置宽高

如果还是用jQuery的append方式,那就在插入完成后立即手动重置object和embed的宽高属性及样式——IE可能在控件初始化时覆盖了这些值:

// 插入插件后立即执行
var vlcObj = $('#A9AC8F7084A4743A8198A6E1EF89BA1');
// 重置object的属性和样式
vlcObj.attr({width: 285, height: 185})
      .css({width: '285px', height: '185px'});
// 同时重置内部的embed标签
vlcObj.find('embed').attr({width: 285, height: 185});

方法三:延迟设置宽高(等控件加载完成)

IE加载ActiveX控件需要一点时间,你可以等控件加载完成后再设置宽高。给object标签加上onload事件:

// 修改HTML字符串,加入onload事件
var vlcHtml = '<object width="0" height="0" id="A9AC8F7084A4743A8198A6E1EF89BA1" classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921" codebase="http://download.videolan.org/pub/videolan/vlc/last/win32/axvlc.cab" style="left: 0px; top: 0px;" events="True" onload="setVLCSize()">' +
    '<param name="Src" value="rtsp://10.1.34.236:654/01000000-0001-BABE-0007-000F7C140DF5/live">' +
    '<param name="controls" value="false">' +
    '<param name="autostart" value="true">' +
    '<param name="allowfullscreen" value="false">' +
    '<embed name="A9AC8F7084A4743A8198A6E1EF89BA1" width="0" height="0" pluginspage="http://www.videolan.org" type="application/x-vlc-plugin" target="rtsp://10.1.34.236:654/01000000-0001-BABE-0007-000F7C140DF5/live" autoplay="false">' +
'</object>';

// 定义加载完成后的设置函数
function setVLCSize() {
    var obj = document.getElementById('A9AC8F7084A4743A8198A6E1EF89BA1');
    obj.width = 285;
    obj.height = 185;
    obj.style.width = '285px';
    obj.style.height = '185px';
    // 处理embed
    var embed = obj.getElementsByTagName('embed')[0];
    embed.width = 285;
    embed.height = 185;
}

为什么会出现这个问题?

本质上是IE对ActiveX控件的特殊处理机制:当它解析到带有classid的object标签时,会先加载对应的控件,这个过程中可能会重置元素的布局属性(比如宽高),导致你预先设置的值被覆盖。

内容的提问来源于stack exchange,提问作者sharpcodex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:08:36