这里有很多问题:
-
闪光视频并不总是在
<embed id="movie_player-flash"
,有时在
<embed id="movie_player"
。既然这是谷歌,可能还有其他方案。
所以,一个简单的
document.getElementById('movie_player-flash')
就在外面。使用以下内容:
var flashEmbed = document.querySelectorAll ("#movie_player-flash, #movie_player");
if (flashEmbed.length) {
flashEmbed = flashEmbed[0];
// DO THE SWITCH HERE.
}
-
只是
更改
src
属性
做
工作,但只有在极少数情况下。如果您正在切换到以下不同的视频:
-
不需要任何参数。
(尽管您可以通过创建适当的
<object>
和
<param>
标签。)
-
不加载任何外部依赖项。
如果它们与目标页面不在同一个域上,则跨域安全将阻止它们。
此外,闪存文件加载的对象的路径通常在文件本身中是固定的(即使是相同的域,也可能会出现404个错误)。
然后,它就可以工作了。
看见
this Fiddle
。
-
关于
我遗漏了一些属性和
flashvars
由于它是一个带有设置的长字符串,这会影响视频吗?
在现代Youtube上
闪光灯
就是一切!此外,如果您比较
src公司
属性,您会看到它对大多数所有flash视频都是一样的。例如,无论我尝试什么视频,当前
src公司
是
http://s.ytimg.com/yt/swfbin/watch_as3-vfl07wZSq.swf
。
这是因为由
<embed>
标签,不是视频。它是一个加载播放器(和其他东西)的shell对象,播放器加载实际的视频文件。
所以名义上,
要将一个Youtube视频更改为另一个,必须更改参数和/或
闪光灯
。即使你改变了
src公司
改为旧式,直接
<嵌入>
链接(例如:
http://www.youtube.com/v/uY3LAFJbKyY?version=3&hl=en_US&rel=0
),它似乎只有在
玩
按钮被按下。然后,参数中定义的视频将返回并播放。
-
然而
Youtube仍然保留了旧系统的某些方面(目前)。所以,如果你能找到老式的嵌入链接,你可以交换
src公司
并替换
<嵌入>
和一个没有
闪光灯
。请参阅答案末尾的代码。
以下是查找旧式嵌入链接的一种方法:
-
在视频的Youtube页面上,按
共有
按钮
。
-
按下
嵌入
按钮
。
-
检查
使用旧的嵌入代码
复选框
。
-
现在将显示文本区域
<object>...<embed>...
HTML。复制出来,只提取
<嵌入>
src公司
属性(例如:
http://www.youtube.com/v/uY3LAFJbKyY?version=3&hl=en_US&rel=0
)
丢弃所有其他东西。
-
闪光元件并不总是立即加载。它也可以通过AJAX进行替换。所以,我们可能需要等待(右)
<嵌入>
出现。
为了简单起见,我将用
setInterval()
,但对于一个健壮、实用的解决方案,您需要使用
the
waitForKeyElements()
utility
,如所示
this answer
。
综合来看,这里有一个
完整的Greasemonkey脚本
它交换了大多数视频:
// ==UserScript==
// @name _Youtube, replace flash video
// @description Replaces most videos with the Greatest Video Of All Time!
// @include http://www.youtube.com/watch*
// @include http://www.youtube.com/user*
// @grant none
// ==/UserScript==
var embedChkIntval = setInterval ( function () {
var flashEmbed = document.querySelectorAll ("#movie_player-flash, #movie_player");
if (flashEmbed.length) {
var playerClone = flashEmbed[0].cloneNode (true);
playerClone.src = 'http://www.youtube.com/v/dQw4w9WgXcQ?version=3&hl=en_US&rel=0';
playerClone.removeAttribute ("flashvars");
flashEmbed[0].parentNode.replaceChild (playerClone, flashEmbed[0]);
clearInterval (embedChkIntval);
}
},
150
);