【问题标题】:video fallback using object tag doesn't work with appendChild使用对象标签的视频后备不适用于 appendChild
【发布时间】:2012-07-30 07:10:00
【问题描述】:

我有一个使用video For everybody 变体的视频播放器应用程序。使用 HTML5 <video> 标记包含 <object> 标记,用于 Internet 爆炸器上的 Flash 回退。当我静态执行此操作时一切正常,但是当使用 javascript 构建视频元素时,似乎 IE9 不喜欢这样。

如果我使用这样的静态代码,它可以工作:

<video id="video" width="360" height="240>
<source type="video/ogg" src="content/mov1.ogv"></source>
<source type="video/mp4" src="content/mov1.mp4"></source>
<object data="player.swf" type="application/x-shockwave-flash" height="384" width="512">
<param name="movie" value="player.swf" >
<param value="autostart=true&amp;file=/mov1.mp4" name="flashvars">
</object>
</video>

但是当我使用 javascript 函数来构建如下视频播放器时,它没有。

function makeV4EPlayer(mp4URL, ogvURL, movieWidth, movieHeight, displayname){
    //create the video element and set its attributes
    var videoObject= document.createElement('video');
    videoObject.setAttribute("id", "video");        
    videoObject.setAttribute("width", movieWidth);
    videoObject.setAttribute("height", movieHeight);

    //add mp4 source
    var mp4Src=document.createElement('source');
    mp4Src.setAttribute("src", mp4URL);
    mp4Src.setAttribute("type","video/mp4");
    videoObject.appendChild(mp4Src);

    //add ogv source
    var oggSrc=document.createElement('source');
    oggSrc.setAttribute("src", ogvURL);
    oggSrc.setAttribute("type","video/ogg");
    videoObject.appendChild(oggSrc);

    //add object with flash player      
    var flashObject=document.createElement('object');
    flashObject.setAttribute("width", movieWidth);
    flashObject.setAttribute("height", movieHeight);
    flashObject.setAttribute("type", "application/x-shockwave-flash");
    flashObject.setAttribute("data","swf/player.swf");
    var params1 = document.createElement('param');
    params1.setAttribute("name", "movie");
    params1.setAttribute("value","swf/player.swf");
    var params2=document.createElement('param');
    params2.setAttribute("name","flashvars");
    params2.setAttribute("value",'autostart=true' + '&file=/' + mp4URL);
    flashObject.appendChild(params1);
    flashObject.appendChild(params2);
    videoObject.appendChild(flashObject);

    return videoObject;
}

Javascript 很好地构建了&lt;video&gt; 标签,并用所有的东西填充它,只是 IE 不会播放它。当然,它可以在宇宙中的所有其他浏览器上正常运行。

当我使用 IE9 开发人员工具检查页面时,我注意到在静态版本中,它会将视频标签和对象标签视为同级 - 即对象不在视频标签内,而是在 javascript版本对象嵌套在视频标签内。我认为这是问题的关键。

我认为这无关紧要,但我正在使用 JW Player 作为我的备用 Flash 播放器。

【问题讨论】:

    标签: javascript internet-explorer html5-video flash


    【解决方案1】:

    IE 不支持 ogg 格式(另见browser compatibility page),其他浏览器支持。

    可能是 MP4 网址不正确或文件损坏?

    === 更新 ===

    在以下行中,您使用的是之前未定义的 imagesrc

    params2.setAttribute("value",'autostart=true' + imagesrc + '&file=/' + mp4URL);
    

    你应该在之前初始化它。

    === UDPATE ===

    如果object 标签不应该在video 标签中,您必须进行更改,因为您只能返回一个元素。例如。将两者都放在一个包装元素中:

    function makeV4EPlayer(mp4URL, ogvURL, movieWidth, movieHeight, displayname){
        // create a wrapper
        var videoWrapper = document.createElement('div');
        videoWrapper.style.width = movieWidth+'px';
        videoWrapper.style.height = movieHeight+'px';
        videoWrapper.style.padding = '0';
        videoWrapper.style.margin = '0';
    
        //create the video element and set its attributes
        var videoObject= document.createElement('video');
        videoObject.setAttribute("id", "video");        
        videoObject.setAttribute("width", movieWidth);
        videoObject.setAttribute("height", movieHeight);
    
        //add mp4 source
        var mp4Src=document.createElement('source');
        mp4Src.setAttribute("src", mp4URL);
        mp4Src.setAttribute("type","video/mp4");
        videoObject.appendChild(mp4Src);
    
        //add ogv source
        var oggSrc=document.createElement('source');
        oggSrc.setAttribute("src", ogvURL);
        oggSrc.setAttribute("type","video/ogg");
        videoObject.appendChild(oggSrc);
    
        // add video to wrapper
        videoWrapper.appendChild(videoObject);
    
        //add object with flash player      
        var flashObject=document.createElement('object');
        flashObject.setAttribute("width", movieWidth);
        flashObject.setAttribute("height", movieHeight);
        flashObject.setAttribute("type", "application/x-shockwave-flash");
        flashObject.setAttribute("data","swf/player.swf");
        var params1 = document.createElement('param');
        params1.setAttribute("name", "movie");
        params1.setAttribute("value","swf/player.swf");
        var params2=document.createElement('param');
        params2.setAttribute("name","flashvars");
        params2.setAttribute("value",'autostart=true' + '&file=/' + mp4URL);
        flashObject.appendChild(params1);
        flashObject.appendChild(params2);
    
        // add flash player to wrapper
        videoWrapper.appendChild(flashObject);
    
        return videoWrapper;
    }
    

    您也可以使用this jsfiddle 进行测试(我没有 IE9,所以无法为您做)。

    或者,您可以创建两个函数,一个用于视频标签,另一个用于对象标签。

    【讨论】:

    • 从 IE9 开始,它确实支持 .mp4。这就是多源标签的全部意义所在。
    • 这不是问题。每个人的视频要点是不受支持的浏览器应该落入&lt;object&gt; 标签。它在静态版本中执行,但不是 &lt;video&gt; 元素由 javascript 构建的位置。
    • 哎呀,那个imagesrc是一个错字,它实际上是在完整的代码中定义的,我只是为问题总结了一下,忘了把它拿出来。我现在已经编辑过了。导致问题的不是 ogv 支持,我可以将其删除,只保留 mp4 源,结果仍然相同。
    • 我不是说 ogg 文件或代码有问题,您的代码有效。我认为 mp4 文件或 mp4 url​​ 不正确。唯一支持 mp4 的浏览器是 IE,所以其他浏览器中的所有测试都无关紧要(因为他们不理解 mp4 格式并使用 ogg 文件)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多