Javascript仅适用于带警报的Safari

时间:2011-03-15 21:02:05

标签: javascript safari alert

我是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>

4 个答案:

答案 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&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影片注册一个事件或进行轮询,直到它准备好进行更新。

答案 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>