佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > HTML頁面嵌入視頻與JS控制切換視頻示例詳解

HTML頁面嵌入視頻與JS控制切換視頻示例詳解

熱門標(biāo)簽:智能手機(jī) 網(wǎng)站建設(shè) 硅谷的囚徒呼叫中心 檢查注冊表項 百度競價點擊價格的計算公式 美圖手機(jī) 使用U盤裝系統(tǒng) 阿里云
首先,在頁面中嵌入視頻的HTML代碼為:

復(fù)制代碼
代碼如下:

<div 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>
</div>

其中,同時使用object和embed標(biāo)簽是為了兼容更多的瀏覽器,但請注意保持兩種標(biāo)簽下相同屬性值的一致。
PS:<object>和<embed>標(biāo)簽及其屬性的介紹和使用方法請參考OBJECT和EMBED標(biāo)簽一文。

然后,再說說如何用JS來動態(tài)改變嵌入視頻的地址從而達(dá)到播放下一個視頻的目的。
這時好多人立刻就能想到用標(biāo)簽名或者DOM方式來找到上述param結(jié)點的value屬性和embed結(jié)點的src屬性,用JS動態(tài)賦值來改變地址。但是測試發(fā)現(xiàn)視頻地址雖然被替換了,頁面上顯示的視頻卻還是原來的沒有改變,百思不得其解。

原來,嵌入的這個object對象的所有參數(shù)是在頁面加載的時候初始化的,只有使其重新加載才能實現(xiàn)切換到下一個視頻進(jìn)行播放,單純改變它的地址屬性值是不起作用的。就像公司的某個員工,他的地址變了(搬家了),他還是原來的那個員工而不是其他人。
我經(jīng)常使用的使其重新加載的方法有兩種(以上述代碼為例):
①用JS的obj.innerHTML方法將object對象整體進(jìn)行重置。

復(fù)制代碼
代碼如下:

/*功能:動態(tài)切換視頻*/
function setvideo(url){
var youku = document.getElementById("youku");
var htmlstr = "<object id='obx' name='obx' width='290' height='260'>";
htmlstr += "<param name='movie' value='"+url+"'></param>";
htmlstr += "<param name='allowFullScreen' value='true'></param>";
htmlstr += "<param name='allowscriptaccess' value='always'></param>";
htmlstr += "<param name='wmode' value='opaque'></param>";
htmlstr += "<embed src='"+url+"' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true' wmode='opaque' width='290' height='260'></embed>";
htmlstr += "</object>";
youku.innerHTML = htmlstr;
}

②在div容器內(nèi)放置一個iframe,這樣可以動態(tài)刷新iframe內(nèi)的頁面而不影響當(dāng)前父頁面。
具體的代碼就不寫了,大體的思路有:
  1.采用url傳值。
  2.父頁面或子頁面弄個隱藏域動態(tài)存放地址供子頁面獲取。
  3.采用①方法重置子頁面中object對象。
  4.其他諸如window.open方法就繞遠(yuǎn)了,不推薦。
至此,嵌入和控制視頻切換都成功實現(xiàn)了。但是無意間,我發(fā)現(xiàn)一個問題:
切換到新的視頻之后,點刷新或按F5等任何方式的刷新頁面,都會彈出一個“缺少對象”的腳本錯誤。找到錯誤代碼,發(fā)現(xiàn)是Flash的內(nèi)部腳本錯誤:

function __flash__removeCallback(instance, name) {
instance[name] = null;
}

如果頁面里使用了flash,并且flash里使用了flash.external.ExternalInterface.addCallback 方法,刷新網(wǎng)頁時就會報__flash__removeCallback的js錯誤:缺少對象(Line 53),(Jscript-scriptblock)。此函數(shù)的調(diào)用處為:

__flash__removeCallback(document.getElementById(""), "dewprev");

很顯然,這里document.getElementById("")返回的是null,才會導(dǎo)致__flash__removeCallback報錯,個人認(rèn)為這個flash的內(nèi)置方法或許應(yīng)該這么寫:

function __flash__removeCallback(instance, name) {
if (instance != null) { instance[name] = null; }
}

有人測試發(fā)現(xiàn),document.getElementById("")這里是獲取flash控件Object對象的id/name屬性的,之所以出現(xiàn)這個錯誤,是因為沒給Object設(shè)置id/name屬性,設(shè)置后就不會出錯了??墒聦嵣衔业膐bject都是帶著id/name屬性的,因此不敢茍同此原因。由此看來,這個加id/name的方法可以解決部分人的問題,引起此問題的原因并非僅此一種。

爾后,我苦苦找尋了好久,終于在一個外國網(wǎng)站上找到了解決的辦法,是一個叫Dave Smith的人寫的,我在他代碼的基礎(chǔ)上做了點改進(jìn),減少了頁面不斷執(zhí)行代碼的壓力。他提供的代碼如下:

復(fù)制代碼
代碼如下:

<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內(nèi)部的這個腳本可以解決當(dāng)前的問題,但是當(dāng)object對象加載后某個時間,flash內(nèi)部的這個腳本又會覆蓋你重寫的這個函數(shù)。因此不能保證播放器到時會調(diào)用你重寫的函數(shù)。為了達(dá)到這個目的,他將函數(shù)設(shè)為每10毫秒覆蓋一下flash內(nèi)部提供的這個函數(shù)。這樣問題就解決了。同時他將這段代碼加以簡化形成了以下兩個“版本”:
簡化版本一:稍簡

復(fù)制代碼
代碼如下:

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

簡化版本二:超簡

復(fù)制代碼
代碼如下:

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

我想了會,理理思路:
這錯誤是在刷新頁面時產(chǎn)生的,頁面刷新的過程就是舊頁面的消亡和新頁面的重載。理論上重載新頁面不會有什么問題,那么錯誤就是產(chǎn)生在舊頁面消亡前的“善后”工作中。我只要在頁面消亡前將flash內(nèi)部這個回調(diào)函數(shù)重寫,就能達(dá)到同樣的目的,代碼如下,測試通過。

復(fù)制代碼
代碼如下:

/*解決視頻切換內(nèi)部腳本錯誤*/
<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>

標(biāo)簽:山南 湘潭 煙臺 通遼 湖北 懷化 黃山 賀州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《HTML頁面嵌入視頻與JS控制切換視頻示例詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    喀喇沁旗| 公主岭市| 九龙城区| 通化市| 平果县| 双鸭山市| 长白| 罗山县| 旬邑县| 瑞安市| 昆明市| 安陆市| 敦煌市| 峨边| 镇沅| 临城县| 杭锦后旗| 建瓯市| 台山市| 闽清县| 杨浦区| 尚义县| 礼泉县| 电白县| 襄城县| 东台市| 昌吉市| 伊川县| 门源| 临邑县| 个旧市| 遂昌县| 达孜县| 虹口区| 通江县| 竹北市| 会昌县| 蒙自县| 九龙县| 萨嘎县| 广东省|