2011-03-15 2 views
2

나는 자바 스크립트에 초보자이며 사파리에서 작동하도록 스크립트를 만드는 데 문제가 있습니다. 솔루션을 찾기 위해 수많은 Google 검색을 수행했지만 효과가있는 것을 찾지 못했습니다.자바 스크립트는 Safari에서만 경고로 작동합니다.

자바 스크립트를 사용하여 별도의 두 배열에서 swf 및 캡션을로드하는 HTML 페이지가 있습니다. 클릭하면 다른 SWF 및 새 캡션이로드되는 다음 단추가 있습니다. IE와 Firefox에서는 완벽하게 작동하지만 Safari에서는 새로운 SWF가 표시되지 않습니다. Safari 디버거에서는 올바른 새 SWF 파일 이름을 표시하지만 원본 SWF를 화면에 표시합니다. 내가 작동하도록 얻은 유일한 방법은 내가 코드를 알리는 것이다. 내 함수에서 이벤트 순서를 조정하려고했지만 아무 것도 해결하지 못했습니다.

아이디어가 있으십니까? (내가 너무 많은 코드를 제공 한 경우 난 그냥 당신에게 전체 그림을주고 싶다, 죄송합니다.)

자바 스크립트 (헤더에 위치) 다음에 진출하는 데 사용되는 버튼

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 :

+1

당신이 받고있는 모든 자바 스크립트 오류 또는 경고? – drudge

+0

오류 또는 경고가 없으며 새로운 swf에서로드되지 않습니다. – rlane423

답변

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

+0

@ rlane423 : 어디서든 온라인으로 사용할 수 있습니까? – stealthyninja

+0

내 회사의 암호로 보호 된 개발 사이트에 있으며 액세스 권한을 부여 할 수 없습니다. 동료가이 코드를 구현하는 데 도움을 주었고 이제는 Firefox에서 다시 작동하지만 Safari에서는 여전히 작동하지 않습니다. – rlane423

0

내가 실제로 세 번째 인덱스를 만드는 당신의 배열 인덱스인가?

당신이 넥스트 (1)마다 ... 당신은 단지 함수에 함수를 호출하거나 할 때마다 숫자 1을 전달하는 함수를 호출하는 경우는이 3 가지 기능 (

넥스트 통화를 1) nextFrame (2) nextFrame (3)

또한 var i = 0으로 선언하지 않았습니다. 나는 이것을 할 것이다 ... nextframe() 함수가 호출 될 때마다 nextFrame 함수 외부에서 전역 변수로 선언 한 다음 1 씩 증가 시키면이 코드를 훨씬 더 가볍게 작성할 수있다. 그런 다음 전역 i를 기반으로 원하는 무비에로드합니다.

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

은 내가 당신의 문제가 자바 스크립트에서 별도의 스레드에서 실행되는 플래시 사실 때문이라고 생각

onclick="nextFrame()" 
+0

죄송합니다. 게시 한 코드에서 실수로 제외 시켰습니다. 나는 var i = 0; 내 배열 위에 선언했다. 함수를 호출 할 때마다 "nextFrame (1)"을 사용하고 있습니다. 나 또한 뒤로 버튼을 가지고 있으므로 "nextFrame (-1)"을 사용한다. – rlane423

+0

배열의 세 번째 인덱스를 실제로 만들었다 고 말할 수 있습니까? –

+0

예, 배열을 통해 완전히 이동합니다. – rlane423

0

으로 함수를 호출합니다. 디버깅을 위해 경고를 사용하고 페이지에 플래시가 포함되어 있으면 이러한 종류의 위험 요소를 실행할 수 있습니다. 플래시가 없으면 자바 스크립트를 포함하여 내 페이지의 모든 내용이 알림 중에 차단됩니다. 반면에 플래시는 별도의 스레드에서 실행되며 경고를 차단하지 않습니다. - 경고가있는 동안 비디오가 재생을 중지하지 않습니다

<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(function() { ... }, 50); 

이 더 나은 수정 플래시 동영상이나 설문 조사와 이벤트를 등록하는 것입니다 :

이 가장 쉬운 수정은 약간의 지연과의 setTimeout 함수에서 경고 문 다음 코드를 래핑하는 아마 업데이트 될 준비가 될 때까지

+0

나는 onClick 단추 내에서 setTimeout을 넣으려고했는데 아무런 영향을 미치지 않는 것 같습니다. 나는 또한 플래시가 바뀌고 내 플래시가 작동하지 않는 내 기능에 넣으려고했다. – rlane423

+0

당신은 타임 아웃에서 경고 다음에 모든 것을 넣으려고 했습니까? 타임 아웃 지연을 늘리려고 했습니까? – tilleryj

0

나는 해결책을 찾았다. 그것은 완전한 해킹일지도 모르지만, 내가 필요로하는 모든 브라우저에서 작동하고 있습니다.

먼저 @stealthyninja가 제안한대로 IE를 탐지하는 방식을 변경했습니다. 그런 다음 swf의 파일 이름을 스와핑하는 대신 플래시를 완전히 다시로드하기로 결정했습니다. 첫 번째 플래시는 swfobject.js 동적 게시 메소드를 사용하여로드됩니다. 그래서 후속 프레임을 같은 방법으로 다시로드합니다. 나는 innerHTML을 사용하고 싶었지만 자바 스크립트를 넣으려고하는 것을 좋아하지 않았다. 그래서 플래시 컨텐츠의 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(); 
} 
} 
새로 추가 된 자바 스크립트 블록 플래시 콘텐츠의

사업부 위치 :

<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> 
관련 문제