我很难弄清楚如何让这个(正常运行的)客户端 js 代码在 meteor 中工作(在屏幕上输入元素的模板事件期间拉出 theVideo 变量。)
<script type="text/javascript" src="swfobject/swfobject.js"></script>
<div id="ytapiplayer">
You need Flash player 8+ and JavaScript enabled to view this video.
</div>
<script type="text/javascript">
theVideo = 'tAbCgr6jJ_0';
if(theVideo != 'null'){
var params = { allowScriptAccess: "always" };
var atts = { id: "myytplayer" };
swfobject.embedSWF("http://www.youtube.com/v/"+theVideo+"?enablejsapi=1&playerapiid=ytplayer&version=3",
"ytapiplayer", "325", "256", "8", null, null, params, atts);
}
function onYouTubePlayerReady(playerId) {
ytplayer = document.getElementById("myytplayer");
ytplayer.playVideo();
}
</script>
尝试通过 DOM 注入(inject)(此 html/javascript)加载脚本不起作用,swfobject 脚本似乎无法从本地和远程主机加载。
将脚本 (swfobject.js) 添加到我的项目根目录(排行榜示例)会在启动应用程序时(在终端输出内)导致“ReferenceError:未定义窗口”。
此代码在普通 HTML 页面内的客户端正常工作以加载脚本。
我找到了 library在一个古老的(2009 年) repo 中,它在启动时没有崩溃,但随后弹出了“swfobject”未找到错误。
关于解决方法的任何想法?将此代码放入模板事件中也不起作用;加载 swfobject 似乎总是问题所在。
最佳答案
通过将 swfobject.js 放在根目录中,它也会在没有 window
的服务器上被解析。所以这就是返回错误的原因。
如果您要将其移至 /client/lib
(同时删除注释下第一行代码中的第一个 var
,否则它不会被限制在浏览器窗口中。
然后您不必手动引用该文件,您可以拥有一些 HTML,例如:
<template name="video">
<div id="ytapiplayer">
You need Flash player 8+ and JavaScript enabled to view this video.
</div>
</template>
和一些(客户端)js:
Template.video.rendered = function() {
played = false; //prevent double plays on multiple renders
theVideo = 'tAbCgr6jJ_0';
if(theVideo != 'null' && !played){
played = true
var params = { allowScriptAccess: "always" };
var atts = { id: "myytplayer" };
swfobject.embedSWF("http://www.youtube.com/v/"+theVideo+"?enablejsapi=1&playerapiid=ytplayer&version=3",
"ytapiplayer", "325", "256", "8", null, null, params, atts);
}
onYouTubePlayerReady = function (playerId) {
var ytplayer = document.getElementById("myytplayer");
ytplayer.playVideo();
}
我重新格式化了 onYouTubePlayerReady 以便可以在全局范围内访问它。我假设这是由脚本自动运行的?我没有在您的代码中看到对它的引用。
关于javascript - meteor - swfobject.js + YouTube API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15957581/