Javascript로 jQuery로드 및 jQuery 사용


85

다음을 사용하여 jQuery 라이브러리를 dom에 추가하고 있습니다.

 var script = document.createElement('script');
 script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
 script.type = 'text/javascript';
 document.getElementsByTagName('head')[0].appendChild(script);

그러나 내가 실행할 때 :

jQuery(document).ready(function(){...

콘솔이 오류를보고합니다.

Uncaught ReferenceError: jQuery is not defined

jQuery를 동적으로로드하고 DOM에 있으면 어떻게 사용합니까?


2
보다 최적화 된 방법과 비교하여이 작업을 수행하려는 이유가 있습니까?
Code Maverick 2012

이 질문에 어떤 대답을 도움이 될 수 있습니다 - stackoverflow.com/questions/7474354/...
mrtsherman

@Scott 예. 설치시 jquery와 스크립트를 모두로드하는 응용 프로그램이 있습니다. jquery가 사용자 테마를 깨지 않도록 스크립트 내에서 jquery를로드해야합니다. 테마 내의 특정 웹 페이지에 자바 스크립트를 조건부로로드해야합니다. 저를 믿으세요.
ThomasReggi 2012

jQuery가 사용자의 테마를 깨뜨리는 이유는 무엇입니까? css에 영향을 미치지 않는 jQuery를로드하면 테마가 깨질 수 있다면 매우 잘못된 것입니다.
Anders Tornblad 2012

좋은 지적이지만, 이전 버전의 jQuery 또는 다른 라이브러리를 사용하고 있다면 어떨까요?
ThomasReggi

답변:


140

여기에 작은 예제와 함께 작동하는 JSFiddle이 있으며, 원하는 것을 정확히 보여줍니다 (요청을 오해하지 않는 한) : http://jsfiddle.net/9N7Z2/188/

자바 스크립트를 동적으로로드하는 방법에는 몇 가지 문제가 있습니다. jQuery와 같은 매우 기본적인 프레임 워크의 경우 실제로 정적으로로드하고 싶을 것입니다. 그렇지 않으면 전체 JavaScript로드 프레임 워크를 작성해야하기 때문입니다.

기존 JavaScript 로더 중 일부를 사용하거나 window.jQuery정의 되는 것을 지켜보고 직접 작성할 수 있습니다 .

// Immediately-invoked function expression
(function() {
    // Load the script
    var script = document.createElement("SCRIPT");
    script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
    script.type = 'text/javascript';
    script.onload = function() {
        var $ = window.jQuery;
        // Use $ here...
    };
    document.getElementsByTagName("head")[0].appendChild(script);
})();

IE8과 같이 정말 오래된 브라우저 를 지원해야하는 경우 load이벤트 핸들러가 실행되지 않는다는 점을 기억하십시오 . 이 경우 repeat window.jQuery사용 이 존재하는지 폴링해야합니다 window.setTimeout. 여기에 해당 방법으로 작동하는 JSFiddle이 있습니다. http://jsfiddle.net/9N7Z2/3/

당신이해야 할 일을 이미 한 많은 사람들이 있습니다. 다음과 같은 기존 JavaScript Loader 프레임 워크 중 일부를 확인하십시오.


이 솔루션은 WordPress를 제외하고 작동합니다. 어떤 방법 으로든 jQuery를 다른 객체에로드하도록 수정할 수 있습니까?
Kraang Prime

@SanuelJackson Wordpress에서는 wp_enqueue_script()함수를 사용하여 jQuery를 올바르게 포함 해야합니다 . 문서 : codex.wordpress.org/Function_Reference/wp_enqueue_script 여기에 몇 가지 추가 정보 : digwp.com/2009/06/include-jquery-in-wordpress-the-right-way 또는 여기 : digwp.com/2011/09/using- 대신 -의 - JQuery와 -에 - 워드 프레스
앤더스 Tornblad

예, 제가 말한 것은 위의 코드가 jQuery를 비동기 적으로로드하기 때문에 Wordpress에서 작동하지 않는다는 것입니다. 이 스크립트가 페이지 맨 아래 (html 닫기 직전)에로드 되더라도 jQuery는 완전히 '초기화'되지 않았으므로로드 된 jQuery가없는 것으로보고 계속해서로드하고 콜백을 수행합니다. 로드되면 다른 방식으로로드되는 jQuery (예 : $, jQuery 등)에 의존하거나 다른 버전의 jQuery에 의존하는 비동기로드 된 다른 것들을 버그로 만듭니다.
Kraang Prime

내가 시도한 다른 경우에 좋습니다. 이것에 대한 유일한 눈에 띄는 문제를 기록하고있었습니다. 어떻게 든 조정할 수 있지만 jQuery를 감지하는 데 의존하기 때문에 가능하다고 생각하지 않습니다. 물론로드되지 않은 jQuery를 감지하면 jquery가 없으면 ... 그런 다음 ..
Kraang Prime

1
폴링을 수행 할 필요가 없습니다. stackoverflow.com/a/42013269/3577695 와 같은 .onload 이벤트를 사용하여 jquery가로드 될 때까지 대기하는 데 한 줄만 사용할 수 있습니다.
aljgom

7

jQuery를 동적으로로드하는 다른 방법이 있습니다 ( source ). 당신은 또한 사용할 수 있습니다

document.write('<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"><\/script>');

을 사용하는 것은 나쁜 습관으로 간주 document.write되지만 완성을 위해 언급하는 것이 좋습니다.

document.write가 "나쁜 관행"으로 간주되는 이유를 참조하십시오 . 이유 때문에. 프로document.write있도록 콜백 함수를 만들 필요가 없습니다, 다른 assests로드에서 페이지를 차단한다.


1
링크 한 문서를 읽었으며 IE8 용 이전 jQuery 라이브러리를로드하는 사용 사례에서는 document.write를 사용하는 것이 괜찮은 것 같습니다. 지금까지 잘 작동하고 있습니다.
Alan

이 작업을 수행하는 가장 쉬운 방법입니다. 별도의 JS 파일 인 다소 큰 스크립트를 시작할 때이 작업을 수행하는 데 문제가 있습니까? 지나치기에는 너무 좋다.
Agustín Lado

6

Encosia의 웹 사이트는 다음을 권장합니다.

<script type="text/javascript" 
        src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
  // You may specify partial version numbers, such as "1" or "1.3",
  //  with the same result. Doing so will automatically load the 
  //  latest version matching that partial revision pattern 
  //  (e.g. 1.3 would load 1.3.2 today and 1 would load 1.7.2).
  google.load("jquery", "1.7.2");

  google.setOnLoadCallback(function() {
    // Place init code here instead of $(document).ready()
  });
</script>

그러나 그는 최적의 성능과 관련하여 다음을 수행하는 것과 비교할 수 없다는 것을 인정합니다.

    <script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js" type="text/javascript"></script>
    <script type="text/javascript"> window.jQuery || document.write('<script src="js/libs/jquery-1.7.2.min.js">\x3C/script>')</script>
    <script type="text/javascript" src="scripts.js"></scripts>
</body>
</html>

하나의 자바 스크립트 만로드 할 수 있습니다. 이것은 내가 그로드 jquery로 Google jsapi를 동적으로로드해야 함을 의미합니까? 내 사용 사례에 중복되는 것 같습니다.
ThomasReggi 2012

1
이것이 jQuery 로더가하는 일입니다. 로더를 참조하면 로더가 jQuery를 문서에 삽입합니다.
Code Maverick 2012

3

jQuery가로드를 마친 후에 코드를 실행해야합니다.

var script = document.createElement('script'); 
document.head.appendChild(script);    
script.type = 'text/javascript';
script.src = "//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js";
script.onload = function(){
    // your jQuery code here
} 

또는 비동기 함수에서 실행하는 await경우 위 코드에서 사용할 수 있습니다 .

var script = document.createElement('script'); 
document.head.appendChild(script);    
script.type = 'text/javascript';
script.src = "//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js";
await script.onload
// your jQuery code here

페이지에 jQuery가 이미 있는지 먼저 확인하려면 다음을 시도 하십시오.


0

이 오류가 발생하는 이유는 JavaScript가 스크립트가로드 될 때까지 기다리지 않기 때문입니다.

jQuery(document).ready(function(){...

스크립트가 준비되었다는 보장은 없습니다 (그리고 절대 없을 것입니다).

이것은 가장 우아한 솔루션은 아니지만 실행 가능합니다. 기본적으로 jQuery 개체 광고가 코드와 함께로드 될 때 함수를 실행하는지 1 초마다 확인할 수 있습니다. 시간 제한 (예 : clearTimeout이 20 번 실행 된 후)을 추가하여 검사가 무기한으로 발생하지 않도록합니다.

var jQueryIsReady = function(){
    //Your JQuery code here
}

var checkJquery = function(){
    if(typeof jQuery === "undefined"){
        return false;
    }else{
        clearTimeout(interval);
        jQueryIsReady();
    }
}
var interval = setInterval(checkJquery,1000);

0

require.js 사용 를 하면 더 안전한 방법으로 동일한 작업을 수행 할 수 있습니다. jquery에 대한 종속성을 정의한 다음 네임 스페이스를 오염시키지 않고로드 될 때 종속성을 사용하여 원하는 코드를 실행할 수 있습니다.

일반적으로 Javascript에 대한 모든 종속성을 관리하는 데이 라이브러리를 권장합니다. 간단하고 리소스 로딩을 효율적으로 최적화 할 수 있습니다. 그러나 JQuery와 함께 사용할 때 취해야 할 몇 가지 예방 조치가 있습니다. 내가 가장 좋아하는 방법은이 github 저장소에 설명되어 있으며 다음 코드 샘플에 반영되어 있습니다.

<title>jQuery+RequireJS Sample Page</title>
   <script src="scripts/require.js"></script>
   <script>
   require({
       baseUrl: 'scripts',
       paths: {
           jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min'
       },
       priority: ['jquery']
    }, ['main']);
    </script>

0

HTML :

<html>
  <head>

  </head>
  <body>

    <div id='status'>jQuery is not loaded yet.</div>
    <input type='button' value='Click here to load it.' onclick='load()' />

  </body>
</html>   

스크립트:

   <script>

        load = function() {
          load.getScript("jquery-1.7.2.js");
          load.tryReady(0); // We will write this function later. It's responsible for waiting until jQuery loads before using it.
        }

        // dynamically load any javascript file.
        load.getScript = function(filename) {
          var script = document.createElement('script')
          script.setAttribute("type","text/javascript")
          script.setAttribute("src", filename)
          if (typeof script!="undefined")
          document.getElementsByTagName("head")[0].appendChild(script)
        }

        </script>

어려운 부분은 스크립트가로드 된 스크립트를 실행 하는 것입니다. 스크립트가 정의되지 않은 이유는 무엇입니까 ???
Anders Tornblad

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.