2009-06-07 7 views
4

읽어 주셔서 감사합니다.이 Javascript가 Opera 또는 Chrome에서 작동하지 않는 이유는 무엇입니까?

내가 가지고있는 다음과 같은 내장되어 여러 스크립트 :

scriptone.js

function FunctionOne(){ 

    // Do a bit of work... 

    // Include a second javascript file, scripttwo.js 
    // that contains a function called FunctionTwo.js 
    var scrb = document.createElement('script'); 
    scrb.type = 'text/javascript'; 
    scrb.src = 'http://www.example.com/scripttwo.js?bunchofargs=varied'; 

    // Append it to the head. 
    document.getElementsByTagName('head')[0].appendChild(scrb); 

    // Can't run the second function directly, because it may not be loaded quite yet, 
    // So use the Waiter function. 
    Interval = setInterval("Waiter()", 10); 

    // All done. 
    return; 

} 

function Waiter(){ 
    if(window.FunctionTwo) { 
     clearInterval(Interval); 
     FunctionTwo(); 
    } 
} 

scripttwo.js

function FunctionTwo(){ 
    document.write('something based on calling page'); 
} 

이 FF와 함께 잘 작동하고 IE는 지원하지만 Opera 나 Chrome은 지원하지 않습니다. 크롬/오페라에서는 모든 것이 스크립트 1에서 제대로 작동하는 것 같습니다. 그러나 scripttwo.js에서 일어날 일은 실제로 일어나지 않습니다. 마치 scripttwo.js가 포함되지 않은 것입니다.

왜 Opera 또는 Chrome에서 작동하지 않는가?

아마 내가 호환되지 않는 무언가를 사용하고 있거나 내가 모르는 보안 기능이 있습니까? 모든 파일은 동일한 도메인에 있습니다.


큰 응답 - 정말 고마워요!

실제 코드에서 FuncionOne은 오타입니다. 실제 코드에서는 더 나은 함수 이름을 사용하지만 여기서는 가독성을 위해 변경했습니다. Joe White가 문제가되어서는 안되는 것에 동의하지만 범위가 될 수 있습니다. 자바 스크립트 (내 약한 언어 중 하나)를 알고 있습니까? FunctionOne은 HTML 문서의 머리 또는 본문에서 호출됩니다.

저는 또한 타이머 2를 피하기 위해 스크립트 2의 끝 부분에 FuncTwo를 추가하는 아이디어를 좋아합니다. 깨끗한 사람, 그리고 일단 분명히 누군가가 당신에게 그것을 지적 ...

내가이 다음 작업 후 업데이 트됩니다. 다시

업데이트 :

안녕 모두,

내가 지금은 FF, IE와 크롬에서 작업해야하지만 오페라는 어떤의 .js를로드하는 것을 거부하는 것 같다 이제 모든 파일. 나는 이것이 일종의 Opera 문제 (Opera: .js file won't load) 일 뿐이며 다른 세 가지 작업을 진행할 것이라고 생각합니다. 그것이 어떻게되었는지 알려주십시오.

답변

1

당신에게 대답을 줄 수있는 몇 가지 질문/의견 :

  • 무엇 FuncionOne (맞춤법을 통지)를 호출?

  • 타이머가 지저분하고 항상 재귀하지 않습니다 (중지되지 않으면 다시 작동하지 않음). 나는 Waiter()을 리팩터링하여 Interval을 여전히 존재하는지 확인하고 그렇지 않다면 재귀적인 window.setInterval을 생성합니다.

    그 주에
  • , 당신은 명시 적으로 Interval의 범위가 작동되는 window.

  • 를 생략하지 window.setInterval을 지정해야 할 수 있습니다? 함수 내에서 정의하십시오. 전통적인 논리는 Waiter()clearInterval(Interval);에 액세스 할 수 없다고 말할 것입니다 ...하지만 JS는 그렇게 조금 지저분합니다. 오페라와 크롬은 당신이 바라는 것보다 덜 혼란 스러울 수도 있습니다. 함수 범위 밖에서 정의하는 것만으로 해결할 수 있습니다.

+0

Interval은 로컬로 var로 선언되지 않습니다. 따라서 암시 적으로 Window.Interval (JavaScript에 대해 싫어하는 것 중 하나)입니다. 범위가 문제가되어서는 안됩니다. –

+0

코드가 작동해야한다고 확신하지만 일부 플랫폼에서는 올바르게 실행되지 않으면 불필요한 암시가 대상이됩니다. 각 주요 브라우저는 Javascript 자체 구현을 실행하므로 틈새를 좁히는 데 많은 범위가 있습니다. – Oli

2

아마도 ScriptTwo.js의 끝에 FunctionTwo()를 추가 할 수 있습니다. 그런 다음 간격이 추가로 복잡하지 않으면로드 될 때 실행됩니다.

3

그것은 오페라에 나를 위해 작동 ..

대신 웨이터 스크립트를 사용하여, 당신은 이벤트를 사용할 수 있습니다 : Internet Explorer가 작동하려면

scrb.onload = function() { FunctionTwo() } 
scrb.onreadystatechange = function() { FunctionTwo() } 

두 번째 줄입니다. 문제는 오페라가이 두 가지 사건을 모두 처리하는 것으로 보이므로 FunctionTwo()가 두 번 실행됩니다. 이 문제를 해결하는 방법에는 여러 가지가 있습니다. 브라우저 감지, 일부 전역 변수 등

1

나는 문제가 Interval 범위라고 생각합니다. FunctionOne 내부에서 정의되지만 전역 범위에서는 정의되지 않습니다. 따라서 Waiter을 실행할 때 Opera와 Chrome에서 이 undefined이라는 사실을 알게되고 FunctionTwo를 자동 종료합니다 (스크립트를 멈출 수 있습니까?). FF와 IE는 이것을 무시할 수 있습니다.

(BTW, 정의되지 않은 매개 변수 값을 받으면 clearInterval은 정식으로 수행해야합니다.)

+0

좋은 질문입니다. http://www.w3schools.com/js/tryit.asp?filename=tryjs_setinterval 크롬과 파이어 폭스에서 그냥 시도해 보았는데 자동으로 실패합니다. – Nosredna

+0

@Nosredna는 Mac에서 Chrome에서 잘 작동합니다. –

관련 문제