2011-03-15 197 views
2

我是一个JavaScript的新手,并且无法让我的脚本在Safari中工作。我做了大量的谷歌搜索找到解决方案,但没有找到任何工作。JavaScript只适用于Safari浏览器

我有一个使用JavaScript来加载SWF和从两个单独的阵列的字幕的HTML页。有一个下一个按钮,点击后会加载另一个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> 
+1

您是否获得任何JavaScript错误或警告? – drudge 2011-03-15 21:07:33

+0

没有错误或警告,它只是不加载新的瑞士法郎。 – rlane423 2011-03-16 13:01:19

回答

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> 
+0

我没有遇到任何问题,因为我发布的方式。我尝试了这种方式,但仍然无法在Safari中使用。但它也停止在Firefox中工作。感谢您的建议。 – rlane423 2011-03-16 13:09:43

+0

@ rlane423:这可以在任何地方在线吗? – stealthyninja 2011-03-16 14:07:37

+0

这是在我公司的密码保护的开发网站,我不能访问。一位同事帮助我实现了这段代码,现在它再次在Firefox中工作,但仍然不在Safari中。 – rlane423 2011-03-16 14:22:25

0

是我居然能够进入第三指数的数组索引?

如果要调用你的函数nextFrame(1)每次...你只有通过数字1到函数每次调用功能或做时间,你有3个不同的功能与

nextFrame调用( 1) nextFrame(2) nextFrame(3)

此外,您还没有声明我在var i = 0;我会这么做......为了这些目的,如果您要在nextFrame函数之外声明i为全局函数,并且每次调用nextframe()函数时将其加1,那么您的代码会轻得多。然后根据全球我加载你想要的电影。

var i = 0; 
function nextFrame(){ 
    loadSwf[i]; 
    i++; 
} 

然后调用函数

onclick="nextFrame()" 
+0

对不起,我不小心把这个代码留在了我发布的代码中。我有var i = 0;在我的数组之上声明。每次我调用它使用“nextFrame(1)”的函数。我也有一个后退按钮,所以使用“nextFrame(-1)”。 – rlane423 2011-03-16 13:02:48

+0

所以你可以告诉我们,如果你实际上是在你的数组中的第三个索引? – 2011-03-16 14:44:10

+0

是的,它贯穿整个阵列。 – rlane423 2011-03-16 15:40:54

0

我认为你的问题是由于Flash将运行在一个单独的线程JavaScript的事实。当您使用警报进行调试并且您的页面包含Flash时,您可能会遇到这些类型的heisenbugs。在没有Flash的情况下,您的网页上的所有内容(包括javascript)都会在警报期间阻止。另一方面,Flash运行在单独的线程上,并且不会阻止提醒。

这个例子说明了什么我谈论:

<object width="480" height="390"><param name="movie" value="http://www.youtube.com/v/oHg5SJYRHA0?fs=1&amp;hl=en_US&amp;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&amp;hl=en_US&amp;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影片或调查事件直到它准备好更新。

+0

我曾尝试将setTimeout放在onClick按钮内,但似乎没有任何影响。我也尝试把它放在闪光灯正在交换的功能中,但这也不起作用。 – rlane423 2011-03-16 14:33:54

+0

您尝试在超时后将所有内容放在警报之后?你有没有尝试增加超时延迟? – tilleryj 2011-03-16 15:24:12

0

我想出了一个可行的解决方案。这可能是一个彻头彻尾的黑客攻击,但它可以在我需要的所有浏览器中运行。

首先,我按照@stealthyninja的建议改变了我检测IE的方式。然后我决定尝试完全重新加载闪存,而不是仅仅交换swf的文件名。第一个flash使用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(); 
} 
} 
Flash内容与新加入的JavaScript块

事业部所在地:

<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> 
相关问题