2012-01-10 5 views
3

두 개 이상의 위젯을 별도로 또는 쌍으로 포함하고 특별한 순서없이 포함시킬 예정입니다. 나는이 스크립트를 사용하여 확인 jQuery를가로드 만들고있어 :jQuery가 포함되어 있는지 확인하십시오.

if (typeof jQuery == 'undefined') { 
    //alert("about to load jquery"); 

    var esm_script_tag = document.createElement('script'); 
    esm_script_tag.setAttribute("type","text/javascript"); 
    esm_script_tag.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js") 
    esm_script_tag.onload = main; // Run main() once jQuery has loaded 

    esm_script_tag.onreadystatechange = function() { // Same thing but for IE 
     if (this.readyState == 'complete' || this.readyState == 'loaded') main(); 
    } 

    document.getElementsByTagName("head")[0].appendChild(es_script_tag); 

} 
else{ 

    main(); 
} 

한 스크립트에이 기능 main()를 발생하고 다른 main2()에. 문제는 일단 첫 번째 스크립트가 실행되면 jQuery가 포함되기 시작한다는 것입니다. 두 번째가 실행될 때 jQuery는 아직로드되지 않지만 다시로드하여 함수 main2()을 시작하지 않습니다.

jQuery를 포함시키는 더 좋은 방법이 있습니까? 내 위젯이 jQuery가로드되는 중간에 있는지 확인하고 준비 될 때까지 기다리는 방법이 있습니까?

답장을 보내 주셔서 감사합니다.

+0

이 테스트를 문서로 준비했다면 어떻게됩니까? – DOK

+0

@ DOK 중복되지 않습니까? – Blazemonger

+0

하지만 $ (document) .ready는 jQuery가로드 될 때까지 사용할 수 없습니다. – emachine

답변

1

물론, 우선 의존 관계 관리를 위해 제 3 자 라이브러리를 사용하는 것이 좋습니다. 그러나, 각 위젯에 원시 코드를 포함하고자 할 때 상황이 될 수 있으므로 추가로 사전에 참조하지 않고도 살 수 있습니다. 이 확실해야한다

setTimeout(function() { 
     document.getElementsByTagName("head")[0].appendChild(esm_script_tag); 
    }, Math.floor(Math.random(500))); 

생산 버전 : http://jsfiddle.net/ayezutov/dvvKE/16/

다음 코드는 스크립트 로딩 지연을 에뮬레이션하기 위해 타임 아웃을 사용하고 있습니다 : 나는 당신이 물어하려고 무엇의 에뮬레이션을 만들어 jsfiddle에

귀하의 코드로 작성된.

그래서 리팩터링 후 로딩 코드는 http://jsfiddle.net/ayezutov/dvvKE/20/이라는 단일 함수로 이동되었습니다.

로드 jQuery를 스크립트 1 : 스크립트 2에서
로드 jQuery를 : 1.5.1
메인 스크립트 2를 실행 :
메인 스크립트 1 실행 문제는 여전히 알 수 있듯이, 남아 1.5.2

if (!window.__jQueryLoadedQueue) 
     window.__jQueryLoadedQueue = [loadCompleted]; 
    else 
    { 
     window.__jQueryLoadedQueue.push(loadCompleted); 
    } 

    var completeFunction = function(){ 
     for(var i = 0; i < window.__jQueryLoadedQueue.length; i++){ 
      window.__jQueryLoadedQueue[i](); 
     } 
     delete window.__jQueryLoadedQueue; 
    } 
:

다음 단계는 jQuery를 로딩을 시작한 후 온 모든 로딩 요청을 대기열 것이다 사용자 정의 큐를, 만드는 것이 었습니다 0

이제 (http://jsfiddle.net/ayezutov/dvvKE/23/)에서 볼 수 있듯이 complete 함수가 호출되는 동안 스크립트는 한 번만로드되기 시작합니다.

+0

문명화 된 시대에 대한 우아한 답변입니다. - 시간을내어 주셔서 감사합니다. – emachine

관련 문제