我是javascript的新手,无法让我的脚本在Safari中运行。我已经做了很多谷歌搜索来找到解决方案,但没有找到任何有效的方法。
我有一个HTML页面,它使用javascript从两个单独的数组加载swf和标题。有一个下一个按钮,在点击时会加载另一个SWF和一个新标题。它在IE和Firefox中完美运行,但在Safari中,新的SWF无法显示。在Safari调试器中,它显示正确的新SWF文件名,但在屏幕上显示原始SWF。我得到它的唯一方法是在代码之后我有一个警报。我已经尝试调整我的函数中的事件顺序,但这还没有解决任何问题。
有什么想法吗? (如果我提供的代码太多,我很抱歉,我只想给你全面的了解。)
Javascript(位于标题中):
var swfFrame=new Array();
swfFrame[0]='frame_01.swf';
swfFrame[1]='frame_02.swf';
swfFrame[2]='frame_03.swf';
var paragraphTxt=new Array();
paragraphTxt[0]='caption 1';
paragraphTxt[1]='caption 2';
paragraphTxt[2]='caption 3';
function nextFrame(x){
i = i+x;
if(i>=swfFrame.length){
i=i-1;
window.open('quiz.html');
}else{
document.getElementById("framenum").innerHTML = (i+1) + " of " + swfFrame.length;
document.getElementById("paragraph").innerHTML = paragraphTxt[i];
// IE
document.getElementById("flashPlayer").movie = "swf/" + swfFrame[i];
// FIREFOX et al
<!--[if !IE]>-->
document.getElementById("flashPlayer").data = "swf/" + swfFrame[i];
<!--[endif}-->
// ALERT (doesn't work in Safari if alert is off)
alert(document.getElementById("flashPlayer").data);
}
if(i>0){
document.getElementById("button_Bck").style.visibility = "visible";
}else{
hideBack();
}
}
function hideBack(){
document.getElementById("button_Bck").style.visibility = "hidden";
}
用于前进到下一个swf的按钮的代码:
<a href="javascript://" onclick="nextFrame(1)"><div id="button_Nxt"><div id="buttonText">Next</div></div></a>
答案 0 :(得分:0)
@ rlane423:我认为你不能在脚本块中实际使用这样的条件注释。
尝试 -
/* preceding code omitted for brevity */
var isIE = false; // set to false by default
</script>
<!--[if IE]>
<script type="text/javascript">
isIE = true;
</script>
<![endif]-->
<script type="text/javascript">
if (isIE) {
// IE
document.getElementById("flashPlayer").movie = "swf/" + swfFrame[i];
} else {
// FIREFOX et al
document.getElementById("flashPlayer").data = "swf/" + swfFrame[i];
}
/* rest of script omitted for brevity */
</script>
答案 1 :(得分:0)
你的数组索引是否实际上是第三个索引?
如果你每次调用你的函数nextFrame(1)...你每次调用函数时只将数字1传递给函数,或者你有3个不同的函数调用
nextFrame(1) nextFrame(2) nextFrame(3)
另外,你没有在var i = 0中声明i;我会这样做...出于这些目的,如果你在nextFrame函数之外声明i为全局,然后每次调用nextframe()函数时将其递增1,那么你的代码将会轻得多。然后根据全局i加载你想要的电影。
var i = 0;
function nextFrame(){
loadSwf[i];
i++;
}
然后用
调用该函数onclick="nextFrame()"
答案 2 :(得分:0)
我认为你的问题是因为flash在一个单独的线程中运行javascript。当您使用警报进行调试并且您的页面包含闪存时,您可以遇到这些类型的heisenbug。在没有闪存的情况下,页面上的所有内容(包括javascript)都会在警报期间阻止。另一方面,Flash在单独的线程上运行,不会阻止警报。
这个例子说明了我在说什么:
<object width="480" height="390"><param name="movie" value="http://www.youtube.com/v/oHg5SJYRHA0?fs=1&hl=en_US&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/oHg5SJYRHA0?fs=1&hl=en_US&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="390"></embed></object>
<a href="javascript:alert('hello'); return false;">Click me!</a>
启动电影,然后点击链接 - 警报启动时视频不会停止播放。
对此最简单的解决方法可能是在setTimeout函数中将警告语句后的代码包装为短暂的延迟:
setTimeout(function() { ... }, 50);
更好的解决方法是使用Flash影片注册一个事件或进行轮询,直到它准备好进行更新。
答案 3 :(得分:0)
我提出了一个有效的解决方案。它可能是一个完整的黑客,但它在我需要的所有浏览器中都有效。
首先,我改变了我检测IE的方式,正如@stealthyninja所建议的那样。然后我决定尝试完全重新加载flash而不是只是交换swf的文件名。使用swfobject.js动态发布方法加载第一个闪存。所以我以同样的方式重新加载后续帧。我想为此使用innerHTML,但它不喜欢我尝试将javascript放入其中。所以我在flash内容的div中添加了一个空的javascript块,并使用innerHTML在其中加载了swfobject调用。 (希望这是有道理的,并不是完全倒退的方式。)代码如下。
<script type="text/javascript">
var isIE =false;
</script>
<!--[if IE]>
<script type="text/javascript">
isIE = true;
</script>
<![endif]-->
<script type="text/javascript">
var flashvars = {};
var params = {};
params.play = "true";
params.loop = "false";
params.menu = "false";
params.quality = "best";
params.wmode = "window";
params.bgcolor = "#FFFFFF";
params.allowscriptaccess = "sameDomain";
var attributes = {};
attributes.align = "middle";
swfobject.embedSWF("swf/frame_01.swf", "flashPlayer", "100%", "100%", "9.0.0", false, flashvars, params, attributes);
var i=0;
var swfFrame=new Array();
swfFrame[0]='frame_01.swf';
swfFrame[1]='frame_02.swf';
swfFrame[2]='frame_03.swf';
var paragraphTxt=new Array();
paragraphTxt[0]='caption 1';
paragraphTxt[1]='caption 2';
paragraphTxt[2]='caption 3';
function nextFrame(x){
i = i+x;
//alert("i+x = " + (i));
if(i>=swfFrame.length){
i=i-1;
window.open('quiz.html');
}else{
document.getElementById("framenum").innerHTML = (i+1) + " of " + swfFrame.length;
document.getElementById("paragraph").innerHTML = paragraphTxt[i];
if(isIE){
// IE
document.getElementById("flashPlayer").movie = "swf/" + swfFrame[i];
}else{
document.getElementById("newScript").innerHTML = swfobject.embedSWF("swf/" + swfFrame[i],"flashPlayer","100%","100%","9.0.0",false,flashvars,params,attributes);
}
}
if(i>0){
document.getElementById("button_Bck").style.visibility = "visible";
}else{
hideBack();
}
}
使用新添加的javascript块划分Flash内容的位置:
<div id="flash">
<script type="text/javascript" id="newScript">
</script>
<div id="flashPlayer">
<a href="http://www.adobe.com/go/getflashplayer">
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
</a>
</div>
</div>