Javascript работает только в Safari с предупреждением - PullRequest
2 голосов
/ 16 марта 2011

Я новичок в javascript и у меня возникают проблемы с тем, чтобы мой скрипт работал в Safari. Я провел многочисленные поиски в Google, чтобы найти решение, но не нашел ничего подходящего.

У меня есть 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 голосов
/ 16 марта 2011

Я нашел решение, которое работает.Это может быть полный взлом, но он работает во всех браузерах, в которых он мне нужен.

Сначала я изменил способ обнаружения IE, как предложено @stealthyninja.Тогда я решил попробовать полностью перезагрузить флэш-память вместо того, чтобы просто поменять имя файла SWF.Первая флэш-память загружается с использованием метода динамической публикации swfobject.js.Поэтому я перезагружаю последующие кадры таким же образом.Я хотел использовать innerHTML для этого, но мне не нравилось пытаться добавить в него javascript.Поэтому я добавил пустой блок javascript в div содержимого flash и использовал 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>
0 голосов
/ 16 марта 2011

Является ли ваш индекс массива фактически третьим индексом?

Если вы вызываете свою функцию nextFrame (1) каждый раз ... вы передаете номер 1 в функцию каждый раз, когда вызываете функцию, или у вас есть 3 различных вызова функции с

nextFrame (1) nextFrame (2) nextFrame (3)

также вы не объявили i как в var i = 0; Я бы сделал это ... для этих целей ваш код был бы намного легче, если бы вы объявили i глобальным вне своей функции nextFrame, а затем увеличивали его на 1 каждый раз, когда вызывается функция nextframe (). А затем загрузите нужный фильм на основе глобального i.

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

затем вызовите функцию с помощью

onclick="nextFrame()"
0 голосов
/ 16 марта 2011

Я думаю, что ваша проблема связана с тем, что flash работает в отдельном потоке от javascript.Когда вы используете предупреждение для отладки, а ваша страница содержит флэш-память, вы можете столкнуться с подобными heisenbugs.При отсутствии флэш-памяти все на вашей странице, включая 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);

Лучшим решением было бы зарегистрировать событие во флэш-фильме или опрашивать его, пока оно не будет готово к обновлению.

0 голосов
/ 16 марта 2011

@ 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...