登录  /  注册

HTML页面嵌入视频与JS控制切换视频示例详解_HTML/Xhtml_网页制作

不言
发布: 2018-05-22 14:57:45
原创
3177人浏览过

首先,在页面中嵌入视频的html代码为:

复制代码

代码如下:

<p id="youku" class="youku"> 
<object id="obx" name="obx" width="290" height="260"> 
<param name="movie" value="http://www.tudou.com/v/6HJvxxkarzk/&resourceId=0_04_11_19/v.swf"></param> 
<param name="allowFullScreen" value="true"></param> 
<param name="allowscriptaccess" value="always"></param> 
<param name="wmode" value="opaque"></param> 
<embed src="http://www.tudou.com/v/6HJvxxkarzk/&resourceId=0_04_11_19/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="290" height="260"></embed> 
</object> 
</p>
登录后复制

其中,同时使用object和embed标签是为了兼容更多的浏览器,但请注意保持两种标签下相同属性值的一致。
PS:标签及其属性的介绍和使用方法请参考OBJECT和EMBED标签一文。

然后,再说说如何用JS来动态改变嵌入视频的地址从而达到播放下一个视频的目的。
这时好多人立刻就能想到用标签名或者DOM方式来找到上述param结点的value属性和embed结点的src属性,用JS动态赋值来改变地址。但是测试发现视频地址虽然被替换了,页面上显示的视频却还是原来的没有改变,百思不得其解。

原来,嵌入的这个object对象的所有参数是在页面加载的时候初始化的,只有使其重新加载才能实现切换到下一个视频进行播放,单纯改变它的地址属性值是不起作用的。就像公司的某个员工,他的地址变了(搬家了),他还是原来的那个员工而不是其他人。
我经常使用的使其重新加载的方法有两种(以上述代码为例):
①用JS的obj.innerHTML方法将object对象整体进行重置。

复制代码

代码如下:

/*功能:动态切换视频*/ 
function setvideo(url){ 
var youku = document.getElementById("youku"); 
var htmlstr = "<object id=&#39;obx&#39; name=&#39;obx&#39; width=&#39;290&#39; height=&#39;260&#39;>"; 
htmlstr += "<param name=&#39;movie&#39; value=&#39;"+url+"&#39;></param>"; 
htmlstr += "<param name=&#39;allowFullScreen&#39; value=&#39;true&#39;></param>"; 
htmlstr += "<param name=&#39;allowscriptaccess&#39; value=&#39;always&#39;></param>"; 
htmlstr += "<param name=&#39;wmode&#39; value=&#39;opaque&#39;></param>"; 
htmlstr += "<embed src=&#39;"+url+"&#39; type=&#39;application/x-shockwave-flash&#39; allowscriptaccess=&#39;always&#39; allowfullscreen=&#39;true&#39; wmode=&#39;opaque&#39; width=&#39;290&#39; height=&#39;260&#39;></embed>"; 
htmlstr += "</object>"; 
youku.innerHTML = htmlstr; 
}
登录后复制

②在p容器内放置一个iframe,这样可以动态刷新iframe内的页面而不影响当前父页面。
具体的代码就不写了,大体的思路有:
  1.采用url传值。
  2.父页面或子页面弄个隐藏域动态存放地址供子页面获取。
  3.采用①方法重置子页面中object对象。
  4.其他诸如window.open方法就绕远了,不推荐。
至此,嵌入和控制视频切换都成功实现了。但是无意间,我发现一个问题:
切换到新的视频之后,点刷新或按F5等任何方式的刷新页面,都会弹出一个“缺少对象”的脚本错误。找到错误代码,发现是Flash的内部脚本错误:

function __flash__removeCallback(instance, name) { 
instance[name] = null; 
}
登录后复制

如果页面里使用了flash,并且flash里使用了flash.external.ExternalInterface.addCallback 方法,刷新网页时就会报__flash__removeCallback的js错误:缺少对象(Line 53),(Jscript-scriptblock)。此函数的调用处为:

__flash__removeCallback(document.getElementById(""), "dewprev");
登录后复制

很显然,这里document.getElementById("")返回的是null,才会导致__flash__removeCallback报错,个人认为这个flash的内置方法或许应该这么写:

function __flash__removeCallback(instance, name) { 
if (instance != null) { instance[name] = null; } 
}
登录后复制

有人测试发现,document.getElementById("")这里是获取flash控件Object对象的id/name属性的,之所以出现这个错误,是因为没给Object设置id/name属性,设置后就不会出错了。可事实上我的object都是带着id/name属性的,因此不敢苟同此原因。由此看来,这个加id/name的方法可以解决部分人的问题,引起此问题的原因并非仅此一种。
尔后,我苦苦找寻了好久,终于在一个外国网站上找到了解决的办法,是一个叫Dave Smith的人写的,我在他代码的基础上做了点改进,减少了页面不断执行代码的压力。他提供的代码如下:

复制代码

代码如下:

<script type="text/javascript"> 
(function(){ 
  var setRemoveCallback = function(){ 
  __flash__removeCallback = function(instance, name){ 
      if (instance){ 
instance[name] =null; 
} 
}; 
window.setTimeout(setRemoveCallback, 10); 
}; 
setRemoveCallback(); 
})(); 
</script>
登录后复制

他的意思大体就是:重写flash内部的这个脚本可以解决当前的问题,但是当object对象加载后某个时间,flash内部的这个脚本又会覆盖你重写的这个函数。因此不能保证播放器到时会调用你重写的函数。为了达到这个目的,他将函数设为每10毫秒覆盖一下flash内部提供的这个函数。这样问题就解决了。同时他将这段代码加以简化形成了以下两个“版本”:
简化版本一:稍简

复制代码

代码如下:

<script type="text/javascript"> 
  var setRemoveCallback = function() { 
__flash__removeCallback = function(instance, name) { 
       if(instance) { 
instance[name] = null; 
} 
}; 
window.setTimeout(setRemoveCallback, 10); 
}; 
setRemoveCallback(); 
</script>
登录后复制

简化版本二:超简

复制代码

代码如下:

<script type="text/javascript">
(function(){
var s=function(){
__flash__removeCallback=function(i,n){if(i)i[n]=null;
};
window.setTimeout(s,10);};s();})();
</script>
登录后复制

我想了会,理理思路:
这错误是在刷新页面时产生的,页面刷新的过程就是旧页面的消亡和新页面的重载。理论上重载新页面不会有什么问题,那么错误就是产生在旧页面消亡前的“善后”工作中。我只要在页面消亡前将flash内部这个回调函数重写,就能达到同样的目的,代码如下,测试通过。

复制代码

代码如下:

/*解决视频切换内部脚本错误*/ 
<script type="text/javascript"> 
function endcall(){var s=function(){__flash__removeCallback=function(i,n){if(i)i[n]=null;};window.setTimeout(s,10);};s();} 
window.onbeforeunload = endcall; 
</script>
登录后复制
智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号