Завантажте jQuery за допомогою Javascript і використовуйте jQuery


83

Я додаю бібліотеку 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, а також використовую його, коли він перебуває у домі?


2
Чи є причина, по якій ви хочете зробити це проти більш оптимізованого способу?
Код Маверік

Деякі відповіді на це питання може допомогти вам - stackoverflow.com/questions/7474354 / ...
mrtsherman

@Scott Так. У мене є програма, в якій під час встановлення він завантажує як jquery, так і сценарій. Мені потрібно завантажити jquery всередині сценарію, щоб jquery не порушував теми користувачів. Мені потрібно умовно завантажити javascript на певну веб-сторінку в межах їх теми. Будь ласка, просто довіряйте мені в цьому.
ThomasReggi,

Чому jQuery порушує теми користувачів? Якщо завантаження jQuery (що не впливає на css) може порушити теми, ви робите щось дуже неправильно.
Андерс Торнблад,

Хороший момент, але що, якщо вони використовують стару версію jQuery або іншу бібліотеку?
ThomasReggi,

Відповіді:


138

Тут є робочий JSFiddle з невеликим прикладом, який демонструє саме те, що ви шукаєте (якщо я неправильно зрозумів ваш запит) : http://jsfiddle.net/9N7Z2/188/

Є кілька проблем із цим методом динамічного завантаження javascript. Коли справа стосується самих базових фреймворків, таких як 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обробники подій не запускаються. У цьому випадку вам потрібно буде опитати, чи існує 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/including-jquery-in-wordpress-the-right-way або тут: digwp.com/2011/09/using- замість jquery-in-wordpress
Андерс Торнблад

Так, я говорив, що наведений вище код не працює на Wordpress, оскільки він також асинхронно завантажує jQuery. Навіть якщо цей скрипт завантажується в самому низу сторінки (безпосередньо перед закриттям html), jQuery не повністю `` ініціалізований '', і, отже, він не бачить завантаженого jQuery, а продовжує завантажувати та виконувати зворотний виклик. Після завантаження він перешкоджає завантаженню асинхронних речей, які залежать від того, що jQuery завантажується іншим способом (наприклад, $, jQuery тощо) або залежить від іншої версії jQuery.
Kraang Prime

Це чудово в інших випадках, які я намагався. Просто писав про єдину кричущу проблему з цим. Якщо це якось можна було налаштувати, але я не думаю, що це можливо, оскільки це залежить від виявлення jQuery, який, звичайно, не завантажується, і, отже, може діяти лише з логікою - якщо немає jquery ... тоді ..
Kraang Prime

1
Вам не потрібно робити опитування, ви можете використовувати тільки один рядок, щоб чекати , поки Jquery навантаження з допомогою події .onload як stackoverflow.com/a/42013269/3577695
aljgom

7

Існує інший спосіб динамічного завантаження jQuery ( джерело ). Ви також можете використовувати

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

Це вважається поганою практикою для використання document.write, але для завершення добре про це згадати.

Див. Чому документ.write вважається "поганою практикою"? з причин. Про те , що document.writeдійсно блокує сторінки від завантаження інших assests, тому немає необхідності створювати функцію зворотного виклику.


1
Я прочитав документ, на який ви зв’язали, і для мого випадку використання завантаження застарілої бібліотеки jQuery для IE8 використання документа document.write здається нормальним. Поки що у мене це добре працює.
Алан,

Це найпростіший і найпростіший спосіб зробити це. Чи не було б проблеми з цим на початку досить великого сценарію, який є окремим файлом JS? Це занадто добре, щоб здаватись.
Агустін Ладо

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>

Я можу завантажити лише один javascript. Це означало б, що мені доведеться динамічно завантажувати google jsapi, а потім за допомогою цього завантаження jquery? Здається, зайвим для мого випадку використання.
ThomasReggi,

1
Це те, що робить навантажувач jQuery. Ви посилаєтесь на завантажувач, і він завантажує jQuery в документ для вас.
Код Маверік

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(){...

немає гарантії, що сценарій готовий (і ніколи не буде).

Це не найелегантніше рішення, але воно дієве. По суті, ви можете перевіряти кожні 1 секунди, якщо об’єкт jQuery запускає функцію, коли вона завантажена разом із вашим кодом. Я б також додав тайм-аут (скажімо, 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>

Складна частина - це запустити скрипт після завантаження сценарію ... І чому б сценарій ніколи не був визначений! ??
Андерс Торнблад,

0

За допомогою консолі DevTools ви можете запустити:

document.getElementsByTagName("head")[0].innerHTML += '<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"><\/script>';

Перевірте доступну версію jQuery за адресою https://code.jquery.com/jquery/ .

Щоб перевірити, чи завантажено, див .: Перевірка завантаження jquery за допомогою Javascript .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.